From ee658c359d5b012f507cfe7c5b65f94b59bc11ea Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sat, 24 Jun 2023 13:20:15 -0700 Subject: [PATCH 01/12] Clarify docs and error strings for scsimon (#1175) * Better usage hints in scsimon man page * In error message, clarify that piscsi needs to be shut down --- cpp/hal/gpiobus_raspberry.cpp | 4 ++-- doc/scsimon.1 | 4 +++- doc/scsimon_man_page.txt | 22 ++++++++++++++-------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/cpp/hal/gpiobus_raspberry.cpp b/cpp/hal/gpiobus_raspberry.cpp index c3dfe3ca60..fb3ba249fa 100644 --- a/cpp/hal/gpiobus_raspberry.cpp +++ b/cpp/hal/gpiobus_raspberry.cpp @@ -183,7 +183,7 @@ bool GPIOBUS_Raspberry::Init(mode_e mode) // GPIO chip open fd = open("/dev/gpiochip0", 0); if (fd == -1) { - LOGERROR("Unable to open /dev/gpiochip0. Is PiSCSI or RaSCSI already running?") + LOGERROR("Unable to open /dev/gpiochip0. If PiSCSI is running, please shut it down first.") return false; } @@ -199,7 +199,7 @@ bool GPIOBUS_Raspberry::Init(mode_e mode) // Get event request if (ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &selevreq) == -1) { - LOGERROR("Unable to register event request. Is PiSCSI or RaSCSI already running?") + LOGERROR("Unable to register event request. If PiSCSI is running, please shut it down first.") close(fd); return false; } diff --git a/doc/scsimon.1 b/doc/scsimon.1 index 48a762309f..7b971803c3 100644 --- a/doc/scsimon.1 +++ b/doc/scsimon.1 @@ -18,9 +18,11 @@ To quit scsimon, press Control + C. None .SH EXAMPLES -Launch scsimon to capture all SCSI traffic available to the PiSCSI hardware: +Make sure you've stopped the piscsi service. Then launch scsimon to capture all SCSI traffic available to the PiSCSI hardware: scsimon +If you're trying to capture a specific scenario, you'll want to wait to start scsimon until immediately before the scenario. + .SH SEE ALSO scsictl(1), piscsi(1), scsidump(1) diff --git a/doc/scsimon_man_page.txt b/doc/scsimon_man_page.txt index 97b7e1bf27..f708fbfa7a 100644 --- a/doc/scsimon_man_page.txt +++ b/doc/scsimon_man_page.txt @@ -2,20 +2,22 @@ !! ------ The native file is scsimon.1. Re-run 'make docs' after updating -scsimon(1) General Commands Manual scsimon(1) +scsimon(1) General Commands Manual scsimon(1) NAME - scsimon - Acts as a data capture tool for all traffic on the SCSI bus. Data is stored in a Value Change Dump (VCD) file. + scsimon - Acts as a data capture tool for all traffic on the SCSI bus. Data is stored in a Value Change Dump + (VCD) file. SYNOPSIS scsimon DESCRIPTION - scsimon monitors all of the traffic on the SCSI bus, using a PiSCSI device. The data is cached in memory while the tool is - running. A circular buffer is used so that only the most recent 1,000,000 transactions are stored. The tool will continue - to run until the user presses CTRL-C, or the process receives a SIGINT signal. + scsimon monitors all of the traffic on the SCSI bus, using a PiSCSI device. The data is cached in memory while + the tool is running. A circular buffer is used so that only the most recent 1,000,000 transactions are stored. + The tool will continue to run until the user presses CTRL-C, or the process receives a SIGINT signal. - The logged data is stored in a file called "log.vcd" in the current working directory from where scsimon was launched. + The logged data is stored in a file called "log.vcd" in the current working directory from where scsimon was + launched. Currently, scsimon doesn't accept any arguments. @@ -25,12 +27,16 @@ OPTIONS None EXAMPLES - Launch scsimon to capture all SCSI traffic available to the PiSCSI hardware: + Make sure you've stopped the piscsi service. Then launch scsimon to capture all SCSI traffic available to the + PiSCSI hardware: scsimon + If you're trying to capture a specific scenario, you'll want to wait to start scsimon until immediately before + the scenario. + SEE ALSO scsictl(1), piscsi(1), scsidump(1) Full documentation is available at: - scsimon(1) + scsimon(1) From c9209c300468c2702c46b75822bea998efc5e960 Mon Sep 17 00:00:00 2001 From: Nemanja Lukic Date: Wed, 5 Jul 2023 06:42:24 +0200 Subject: [PATCH 02/12] Spanish translation --- .../translations/es/LC_MESSAGES/messages.po | 149 +++++++++--------- 1 file changed, 78 insertions(+), 71 deletions(-) diff --git a/python/web/src/translations/es/LC_MESSAGES/messages.po b/python/web/src/translations/es/LC_MESSAGES/messages.po index 1322689d61..1cc35bcec9 100644 --- a/python/web/src/translations/es/LC_MESSAGES/messages.po +++ b/python/web/src/translations/es/LC_MESSAGES/messages.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/PiSCSI/piscsi/issues\n" -"POT-Creation-Date: 2023-04-09 10:06+0200\n" -"PO-Revision-Date: 2023-04-09 13:16+0200\n" +"POT-Creation-Date: 2023-07-05 06:25+0200\n" +"PO-Revision-Date: 2023-07-05 06:36+0200\n" "Last-Translator: n4al \n" "Language-Team: es N/A\n" "Language: es\n" @@ -48,7 +48,7 @@ msgstr "No se puede mover el archivo a: %(target_path)s" #: src/return_code_mapper.py:24 #, python-format msgid "Created CD-ROM ISO image with arguments \"%(value)s\"" -msgstr "Creada la imagen ISO del CD-ROM con argumentos “%(value)s”" +msgstr "Creada la imagen ISO del CD-ROM con argumentos \"%(value)s\"" #: src/return_code_mapper.py:26 #, python-format @@ -146,85 +146,85 @@ msgstr "" "La interfaz web de PiSCSI no ha obtenido una respuesta válida de PiSCSI. Por " "favor, vuelva a intentarlo. Si el problema persiste, informe de un error." -#: src/web.py:252 +#: src/web.py:255 msgid "PiSCSI Control Page" msgstr "Página de control PiSCSI" -#: src/web.py:304 +#: src/web.py:307 msgid "PiSCSI Create Drive" msgstr "PiSCSI Crear unidad" -#: src/web.py:320 +#: src/web.py:323 msgid "PiSCSI File Upload" msgstr "Carga de archivos PiSCSI" -#: src/web.py:346 +#: src/web.py:349 #, python-format msgid "You must log in with valid credentials for a user in the '%(group)s' group" msgstr "" "Debe conectarse con credenciales válidas para un usuario del grupo ‘%(group)s’" -#: src/web.py:399 src/web.py:444 +#: src/web.py:402 src/web.py:447 #, python-format msgid "No properties data for drive %(drive_name)s" msgstr "No hay datos de propiedades para la unidad %(drive_name)s" -#: src/web.py:421 +#: src/web.py:424 #, python-format msgid "Image file with properties created: %(file_name)s" msgstr "Archivo de imagen con propiedades creado: %(file_name)s" -#: src/web.py:522 +#: src/web.py:525 msgid "PiSCSI Image Info" msgstr "Información de imagen PiSCSI" -#: src/web.py:529 +#: src/web.py:532 #, python-format msgid "An error occurred when getting disk info: %(error)s" msgstr "Se ha producido un error al obtener la información del disco: %(error)s" -#: src/web.py:543 +#: src/web.py:546 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s no es una aplicación PiSCSI reconocida" -#: src/web.py:570 +#: src/web.py:573 msgid "PiSCSI Manual" msgstr "PiSCSI Manual" -#: src/web.py:577 +#: src/web.py:580 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "Se ha producido un error al acceder a la página del manual: %(error)s" -#: src/web.py:593 +#: src/web.py:596 msgid "PiSCSI System Logs" msgstr "Registros del sistema PiSCSI" -#: src/web.py:601 +#: src/web.py:604 #, python-format msgid "An error occurred when fetching logs: %(error)s" msgstr "Se ha producido un error al obtener los registros: %(error)s" -#: src/web.py:615 +#: src/web.py:618 #, python-format msgid "Log level set to %(value)s" msgstr "Nivel de registro fijado en %(value)s" -#: src/web.py:632 src/web.py:695 +#: src/web.py:635 src/web.py:698 msgid "No SCSI ID specified" msgstr "No se ha especificado el SCSI ID" -#: src/web.py:673 +#: src/web.py:676 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Conectado %(device_type)s a SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:697 +#: src/web.py:700 msgid "No image file to insert" msgstr "No hay archivo de imagen para insertar" -#: src/web.py:737 +#: src/web.py:740 #, python-format msgid "" "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " @@ -233,132 +233,132 @@ msgstr "" "Conectado %(file_name)s como %(device_type)s a SCSI ID %(id_number)s LUN " "%(unit_number)s" -#: src/web.py:754 +#: src/web.py:757 msgid "Detached all SCSI devices" msgstr "Se han desconectado todos los dispositivos SCSI" -#: src/web.py:770 +#: src/web.py:773 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "SCSI ID desconectado %(id_number)s LUN %(unit_number)s" -#: src/web.py:792 +#: src/web.py:795 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Expulsado SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:811 +#: src/web.py:814 msgid "PiSCSI Device Info" msgstr "Información del dispositivo PiSCSI" -#: src/web.py:815 +#: src/web.py:818 msgid "No devices attached" msgstr "No hay dispositivos conectados" -#: src/web.py:831 +#: src/web.py:834 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "SCSI ID reservado %(id_number)s" -#: src/web.py:849 +#: src/web.py:852 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "Liberada la reserva para SCSI ID %(id_number)s" -#: src/web.py:868 +#: src/web.py:871 #, python-format msgid "System name changed to '%(name)s'." msgstr "El nombre del sistema ha cambiado a ‘%(name)s’." -#: src/web.py:869 +#: src/web.py:872 msgid "System name reset to default." msgstr "Nombre del sistema restablecido por defecto." -#: src/web.py:871 +#: src/web.py:874 msgid "Failed to change system name." msgstr "Error al cambiar el nombre del sistema." -#: src/web.py:925 +#: src/web.py:928 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." msgstr "%(iso_type)s no es un formato de CD-ROM válido." -#: src/web.py:940 +#: src/web.py:943 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" msgstr "" "Se ha producido el siguiente error al crear la imagen del CD-ROM: %(error)s" -#: src/web.py:947 +#: src/web.py:950 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "Se creó %(file_name)s de imagen de CD-ROM con el tipo %(iso_type)s." -#: src/web.py:977 src/web.py:1021 +#: src/web.py:980 src/web.py:1024 msgid "Unknown destination" msgstr "Destino desconocido" -#: src/web.py:986 +#: src/web.py:989 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "Se ha producido el siguiente error al descargar: %(error)s" -#: src/web.py:1065 src/web.py:1078 +#: src/web.py:1068 src/web.py:1081 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s no es un formato de disco duro válido." -#: src/web.py:1123 +#: src/web.py:1126 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "Archivo de imagen con propiedades creadas: %(file_name)s%(drive_format)s" -#: src/web.py:1133 +#: src/web.py:1136 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "Archivo de imagen creado: %(file_name)s%(drive_format)s" -#: src/web.py:1194 +#: src/web.py:1197 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "Archivo de imagen con propiedades borrado: %(file_name)s" -#: src/web.py:1203 +#: src/web.py:1206 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "Archivo de imagen borrado: %(file_name)s" -#: src/web.py:1241 +#: src/web.py:1244 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "Archivo de imagen con propiedades renombrado a: %(file_name)s" -#: src/web.py:1250 +#: src/web.py:1253 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "Archivo de imagen renombrado a: %(file_name)s" -#: src/web.py:1288 +#: src/web.py:1291 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "" "Copia del archivo de imagen con las propiedades guardado como: %(file_name)s" -#: src/web.py:1297 +#: src/web.py:1300 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "Copia del archivo de imagen guardado como: %(file_name)s" -#: src/web.py:1350 +#: src/web.py:1353 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Se ha cambiado el lenguaje de la Interfaz Web a %(locale)s" -#: src/web.py:1361 +#: src/web.py:1364 msgid "The requested theme does not exist." msgstr "El tema solicitado no existe." -#: src/web.py:1364 +#: src/web.py:1367 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "Tema cambiado a ‘%(theme)s’." @@ -419,33 +419,40 @@ msgstr "Imagen de disco extraíble" msgid "Magneto-Optical Disk Image" msgstr "Imagen de disco magneto-óptico" -#: src/web_utils.py:260 +#: src/web_utils.py:263 msgid "You must log in to use this function" msgstr "Debe conectarse para utilizar esta función" -#: src/web_utils.py:274 +#: src/web_utils.py:277 #, python-format msgid "Configure the network bridge for %(interface)s first: " msgstr "Configure primero el puente de red para %(interface)s: " -#: src/web_utils.py:303 -#, python-format -msgid "No permission to use path '%(file_name)s'" -msgstr "No hay permiso para usar la ruta ‘%(file_name)s’" +#: src/web_utils.py:305 +msgid "Path must not be absolute" +msgstr "La ruta no puede ser absoluta" + +#: src/web_utils.py:307 +msgid "Path must not traverse the file system" +msgstr "La ruta no debe atravesar el sistema de archivos" -#: src/web_utils.py:324 +#: src/web_utils.py:309 +msgid "Path must not start in the home directory" +msgstr "La ruta no debe comenzar en el directorio personal" + +#: src/web_utils.py:333 msgid "The file already exists!" msgstr "¡El archivo ya existe!" -#: src/web_utils.py:332 +#: src/web_utils.py:341 msgid "Unable to write the file to disk!" msgstr "¡No se puede escribir el archivo en el disco!" -#: src/web_utils.py:340 +#: src/web_utils.py:349 msgid "Transferred file corrupted!" msgstr "¡Archivo transferido corrompido!" -#: src/web_utils.py:342 +#: src/web_utils.py:351 msgid "File upload successful!" msgstr "¡La carga de archivos se ha realizado con éxito!" @@ -478,7 +485,7 @@ msgstr "Autenticación de la interfaz web deshabilitada" #, python-format msgid "See Wiki for more information" msgstr "" -"Consulte Wiki para obtener más información" +"Consulte Wiki para obtener más información" #: src/templates/base.html:64 msgid "PiSCSI" @@ -606,7 +613,7 @@ msgstr "" "que tenga que proporcionar los controladores de dispositivo y/o los parámetros " "de configuración adecuados para que funcionen correctamente. Si desea que se " "modifiquen los datos, o si tiene otros dispositivos que añadir a la lista, cree " -"un ticket de incidencia en GitHub." +"un ticket de incidencia en GitHub." #: src/templates/drives.html:6 msgid "Hard Disk Drives" @@ -822,7 +829,7 @@ msgid "" "Select a valid SCSI ID and LUN to " "attach to. Unless you know what you're doing, always use LUN 0." msgstr "" -"Seleccione un SCSI ID válido y LUN al que " +"Seleccione un SCSI ID válido y LUN al que " "conectar. A menos que sepa lo que está haciendo, utilice siempre el LUN 0." #: src/templates/index.html:200 @@ -873,8 +880,8 @@ msgstr "Desconocido" #: src/templates/index.html:344 #, python-format -msgid "Enter new file name for: %(file_name)s" -msgstr "Introduzca un nuevo nombre de archivo para: %(file_name)s" +msgid "Enter a new file name:" +msgstr "Introduzca un nuevo nombre de archivo:" #: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" @@ -882,8 +889,8 @@ msgstr "Renombrar" #: src/templates/index.html:349 #, python-format -msgid "Save copy of %(file_name)s as:" -msgstr "Guardar copia de %(file_name)s como:" +msgid "Enter a file name for the copy:" +msgstr "Introduzca un nombre de archivo para la copia:" #: src/templates/index.html:352 msgid "Copy" @@ -904,8 +911,8 @@ msgstr "Info" #: src/templates/index.html:374 #, python-format -msgid "%(disk_space)s MiB disk space remaining on the system" -msgstr "%(disk_space)s MiB de espacio en disco restante en el sistema" +msgid "%(disk_space)s MiB disk space remaining for images" +msgstr "%(disk_space)s MiB de espacio en disco restante para imágenes" #: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" @@ -988,7 +995,7 @@ msgid "" "Please refer to wiki documentation to " "learn more about the supported image file types." msgstr "" -"Consulte documentación de la wiki para " +"Consulte documentación de la wiki para " "obtener más información sobre los tipos de archivos de imagen admitidos." #: src/templates/index.html:515 @@ -1046,7 +1053,7 @@ msgid "" "href=\"%(url)s\" target=\"_blank\">Macproxy." msgstr "" "Para navegar por la web moderna, instale un proxy web vintage como Macproxy." +"href=\"%(url)s\" target=\"_blank\">Macproxy." #: src/templates/index.html:586 #, python-format @@ -1054,7 +1061,7 @@ msgid "" "Read more about supported device types on the wiki." msgstr "" -"Más información sobre tipos de dispositivos " +"Más información sobre tipos de dispositivos " "compatibles en la wiki." #: src/templates/index.html:593 @@ -1106,7 +1113,7 @@ msgid "" "The System Name is the \"pretty\" hostname if set, with a fallback to the " "regular hostname." msgstr "" -"El Nombre del Sistema es el nombre de host “bonito” si está configurado, con un " +"El Nombre del Sistema es el nombre de host \"bonito\" si está configurado, con un " "fallback al nombre de host normal." #: src/templates/index.html:731 From fa2b02b222df2b48bd1398b4e59bc74e98d4432e Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 17 Jul 2023 17:23:10 -0700 Subject: [PATCH 03/12] Bump netatalk 2.x version to 230701 (#1185) --- easyinstall.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easyinstall.sh b/easyinstall.sh index 33c2fdb619..53c10ce261 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -735,7 +735,7 @@ function createFileSharingDir() { # Downloads, compiles, and installs Netatalk (AppleShare server) function installNetatalk() { - NETATALK_VERSION="230302" + NETATALK_VERSION="230701" NETATALK_CONFIG_PATH="/etc/netatalk" NETATALK_OPTIONS="--cores=$CORES --share-name='$FILE_SHARE_NAME' --share-path='$FILE_SHARE_PATH'" From 5a6d12c0753c80ccf65f226fa66d9dc8e9d543a9 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 17 Jul 2023 17:23:25 -0700 Subject: [PATCH 04/12] Swedish translation update 2023-07 (#1184) --- .../translations/sv/LC_MESSAGES/messages.po | 350 +++++++++--------- 1 file changed, 182 insertions(+), 168 deletions(-) diff --git a/python/web/src/translations/sv/LC_MESSAGES/messages.po b/python/web/src/translations/sv/LC_MESSAGES/messages.po index 6241a3e271..f13d36e1b0 100644 --- a/python/web/src/translations/sv/LC_MESSAGES/messages.po +++ b/python/web/src/translations/sv/LC_MESSAGES/messages.po @@ -5,19 +5,18 @@ # msgid "" msgstr "" -"Project-Id-Version: PiSCSI\n" +"Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/PiSCSI/piscsi/issues\n" -"POT-Creation-Date: 2023-03-19 14:43-0700\n" -"PO-Revision-Date: 2023-03-24 09:06-0700\n" +"POT-Creation-Date: 2023-07-05 10:36-0700\n" +"PO-Revision-Date: 2023-07-05 10:10-0700\n" "Last-Translator: Daniel Markstedt \n" -"Language-Team: N/A\n" "Language: sv\n" +"Language-Team: N/A\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Generated-By: Babel 2.11.0\n" -"X-Generator: Poedit 3.2.2\n" +"Generated-By: Babel 2.12.1\n" #: src/return_code_mapper.py:14 #, python-format @@ -96,10 +95,11 @@ msgstr "Kunde ej läsa egenskaper från filen %(file_path)s" #: src/return_code_mapper.py:44 #, python-format msgid "" -"Cannot insert an image for %(device_type)s into a %(current_device_type)s device" +"Cannot insert an image for %(device_type)s into a %(current_device_type)s" +" device" msgstr "" -"Det går inte att mata in en skiva av typ %(device_type)s i en enhet av typ " -"%(current_device_type)s" +"Det går inte att mata in en skiva av typ %(device_type)s i en enhet av " +"typ %(current_device_type)s" #: src/return_code_mapper.py:46 #, python-format @@ -122,240 +122,242 @@ msgstr "Kunde ej packa upp arkivet: %(error)s" #: src/socket_cmds_flask.py:42 #, python-format msgid "" -"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s with " -"error: %(error_msg)s. The PiSCSI process is not running or may have crashed." +"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s" +" with error: %(error_msg)s. The PiSCSI process is not running or may have" +" crashed." msgstr "" -"PiSCSIs webbgränssnitt kunde inte ansluta till PiSCSI på %(host)s:%(port)s med " -"felmeddelandet '%(error_msg)s'. PiSCSI-processen är antingen avslagen eller har " -"krashat." +"PiSCSIs webbgränssnitt kunde inte ansluta till PiSCSI på " +"%(host)s:%(port)s med felmeddelandet '%(error_msg)s'. PiSCSI-processen är" +" antingen avslagen eller har krashat." #: src/socket_cmds_flask.py:54 msgid "" -"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and try " -"again. If the issue persists, please report a bug." +"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and " +"try again. If the issue persists, please report a bug." msgstr "" -"PiSCSIs webbgränssnitt tappade kontaken med PiSCSI. Gå tillbaks och försök igen. " -"Om samma fel upprepas så rapportera en bugg." +"PiSCSIs webbgränssnitt tappade kontaken med PiSCSI. Gå tillbaks och " +"försök igen. Om samma fel upprepas så rapportera en bugg." #: src/socket_cmds_flask.py:64 msgid "" -"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please go " -"back and try again. If the issue persists, please report a bug." +"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please" +" go back and try again. If the issue persists, please report a bug." msgstr "" -"PiSCSIs webbgränssnitt fick en ogiltig respons från PiSCSI. Gå tillbaks och " -"försök igen. Om samma fel upprepas så rapportera en bugg." +"PiSCSIs webbgränssnitt fick en ogiltig respons från PiSCSI. Gå tillbaks " +"och försök igen. Om samma fel upprepas så rapportera en bugg." -#: src/web.py:252 +#: src/web.py:255 msgid "PiSCSI Control Page" msgstr "PiSCSI kontrollsida" -#: src/web.py:304 +#: src/web.py:307 msgid "PiSCSI Create Drive" msgstr "PiSCSI skapa skiva" -#: src/web.py:320 +#: src/web.py:323 msgid "PiSCSI File Upload" msgstr "PiSCSI uppladdning" -#: src/web.py:346 +#: src/web.py:349 #, python-format msgid "You must log in with valid credentials for a user in the '%(group)s' group" msgstr "Du måste logga in som en användare som tillhör %(group)s-gruppen" -#: src/web.py:399 src/web.py:444 +#: src/web.py:402 src/web.py:447 #, python-format msgid "No properties data for drive %(drive_name)s" msgstr "Saknar egenskapsdata för skivan %(drive_name)s" -#: src/web.py:421 +#: src/web.py:424 #, python-format msgid "Image file with properties created: %(file_name)s" msgstr "Skapade skivbildsfil med egenskaper: %(file_name)s" -#: src/web.py:522 +#: src/web.py:525 msgid "PiSCSI Image Info" msgstr "PiSCSI bildfilsinfo" -#: src/web.py:529 +#: src/web.py:532 #, python-format msgid "An error occurred when getting disk info: %(error)s" msgstr "Ett fel inträffade när vi hämtade skivinfo: %(error)s" -#: src/web.py:543 +#: src/web.py:546 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s är inte en giltig PiSCSI-app" -#: src/web.py:570 +#: src/web.py:573 msgid "PiSCSI Manual" msgstr "PiSCSI manual" -#: src/web.py:577 +#: src/web.py:580 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "Ett fel inträffade när vi hämtade manualsidan: %(error)s" -#: src/web.py:593 +#: src/web.py:596 msgid "PiSCSI System Logs" msgstr "PiSCSI systemloggar" -#: src/web.py:601 +#: src/web.py:604 #, python-format msgid "An error occurred when fetching logs: %(error)s" msgstr "Ett fel inträffade när vi hämtade loggar: %(error)s" -#: src/web.py:615 +#: src/web.py:618 #, python-format msgid "Log level set to %(value)s" msgstr "Bytte loggnivån till %(value)s" -#: src/web.py:632 src/web.py:695 +#: src/web.py:635 src/web.py:698 msgid "No SCSI ID specified" msgstr "Inget SCSI-id angett" -#: src/web.py:673 +#: src/web.py:676 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "" -"Anslöt %(device_type)s till SCSI-id %(id_number)s enhetsnummer %(unit_number)s" +"Anslöt %(device_type)s till SCSI-id %(id_number)s enhetsnummer " +"%(unit_number)s" -#: src/web.py:697 +#: src/web.py:700 msgid "No image file to insert" msgstr "Ingen skivfil att ansluta" -#: src/web.py:737 +#: src/web.py:740 #, python-format msgid "" "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " "%(unit_number)s" msgstr "" -"Anslöt %(file_name)s som %(device_type)s till SCSI-id %(id_number)s enhetsnummer " -"%(unit_number)s" +"Anslöt %(file_name)s som %(device_type)s till SCSI-id %(id_number)s " +"enhetsnummer %(unit_number)s" -#: src/web.py:754 +#: src/web.py:757 msgid "Detached all SCSI devices" msgstr "Kopplade ifrån alla SCSI-enheter" -#: src/web.py:770 +#: src/web.py:773 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Kopplade ifrån SCSI-id %(id_number)s enhetsnummer %(unit_number)s" -#: src/web.py:792 +#: src/web.py:795 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Matade ut SCSI-id %(id_number)s enhetsnummer %(unit_number)s" -#: src/web.py:811 +#: src/web.py:814 msgid "PiSCSI Device Info" msgstr "PiSCSI enhetsinfo" -#: src/web.py:815 +#: src/web.py:818 msgid "No devices attached" msgstr "Inga enheter anslutna" -#: src/web.py:831 +#: src/web.py:834 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "Reserverat SCSI-id %(id_number)s" -#: src/web.py:849 +#: src/web.py:852 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "Frigjorde SCSI-id %(id_number)s" -#: src/web.py:868 +#: src/web.py:871 #, python-format msgid "System name changed to '%(name)s'." msgstr "Ändrade systemnamnet till '%(name)s'." -#: src/web.py:869 +#: src/web.py:872 msgid "System name reset to default." msgstr "Återställde systemnamnet till grundvärdet." -#: src/web.py:871 +#: src/web.py:874 msgid "Failed to change system name." msgstr "Kunde ej ändra systemnamnet." -#: src/web.py:925 +#: src/web.py:928 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." msgstr "%(iso_type)s är inte ett giltigt cd-romformat." -#: src/web.py:940 +#: src/web.py:943 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" msgstr "Ett fel inträffade när vi skapade en cd-bildfil: %(error)s" -#: src/web.py:947 +#: src/web.py:950 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "Cd-bildfilen %(file_name)s av typ %(iso_type)s har skapats." -#: src/web.py:977 src/web.py:1021 +#: src/web.py:980 src/web.py:1024 msgid "Unknown destination" msgstr "Okänd destination" -#: src/web.py:986 +#: src/web.py:989 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "Ett fel inträffade under nedladdningen: %(error)s" -#: src/web.py:1065 src/web.py:1078 +#: src/web.py:1068 src/web.py:1081 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s är inte ett giltigt hårddisksformat." -#: src/web.py:1123 +#: src/web.py:1126 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "Skapade skivbildsfil med egenskaper: %(file_name)s%(drive_format)s" -#: src/web.py:1133 +#: src/web.py:1136 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "Skapade skivbildsfil %(file_name)s%(drive_format)s" -#: src/web.py:1194 +#: src/web.py:1197 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "Bildfil med egenskaper raderades: %(file_name)s" -#: src/web.py:1203 +#: src/web.py:1206 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "Filen %(file_name)s raderades" -#: src/web.py:1241 +#: src/web.py:1244 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "Filen med egenskaper döptes om till %(file_name)s" -#: src/web.py:1250 +#: src/web.py:1253 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "Filen döptes om till %(file_name)s" -#: src/web.py:1288 +#: src/web.py:1291 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "Kopierade filen med egenskaper och sparade den som %(file_name)s" -#: src/web.py:1297 +#: src/web.py:1300 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "Kopierade filen och sparade den som %(file_name)s" -#: src/web.py:1350 +#: src/web.py:1353 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Bytte webbgränssnittets språk till %(locale)s" -#: src/web.py:1361 +#: src/web.py:1364 msgid "The requested theme does not exist." msgstr "Temat existerar inte." -#: src/web.py:1364 +#: src/web.py:1367 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "Bytte till temat '%(theme)s'." @@ -416,33 +418,40 @@ msgstr "Uttagbar skiva" msgid "Magneto-Optical Disk Image" msgstr "Magnetoptisk skiva" -#: src/web_utils.py:260 +#: src/web_utils.py:263 msgid "You must log in to use this function" msgstr "Du måste logga in för att använda den här funktionen" -#: src/web_utils.py:274 +#: src/web_utils.py:277 #, python-format msgid "Configure the network bridge for %(interface)s first: " msgstr "Ställ in nätverksbryggan för %(interface)s först: " -#: src/web_utils.py:303 -#, python-format -msgid "No permission to use path '%(file_name)s'" -msgstr "Ingen behörighet att använda sökvägen \"%(file_name)s\"" +#: src/web_utils.py:305 +msgid "Path must not be absolute" +msgstr "Sökvägen kan inte vara absolut" + +#: src/web_utils.py:307 +msgid "Path must not traverse the file system" +msgstr "Sökvägen får inte lov att traversera filsystemet" + +#: src/web_utils.py:309 +msgid "Path must not start in the home directory" +msgstr "Sökvägen kan inte starta i hemkatalogen" -#: src/web_utils.py:324 +#: src/web_utils.py:333 msgid "The file already exists!" msgstr "Filen finns redan!" -#: src/web_utils.py:332 +#: src/web_utils.py:341 msgid "Unable to write the file to disk!" msgstr "Kunde ej skriva filen till skivan!" -#: src/web_utils.py:340 +#: src/web_utils.py:349 msgid "Transferred file corrupted!" msgstr "Den överförda filen är skadad!" -#: src/web_utils.py:342 +#: src/web_utils.py:351 msgid "File upload successful!" msgstr "Filen har laddas upp!" @@ -513,7 +522,7 @@ msgid "Macproxy is running at %(ip_addr)s (default port 5000)" msgstr "Macproxy är tillgängligt på %(ip_addr)s (vanligtvis port 5000)" #: src/templates/base.html:120 -msgid "PiSCSI version:" +msgid "PiSCSI software version:" msgstr "PiSCSI-version:" #: src/templates/base.html:123 @@ -591,17 +600,18 @@ msgstr "Observera" #: src/templates/drives.html:5 #, python-format msgid "" -"These device profiles are provided as-is with no guarantee to work equally to " -"the actual physical device they are named after. You may need to provide " -"appropirate device drivers and/or configuration parameters for them to function " -"properly. If you would like to see data modified, or have additional devices to " -"add to the list, please raise an issue ticket at GitHub." +"These device profiles are provided as-is with no guarantee to work " +"equally to the actual physical device they are named after. You may need " +"to provide appropirate device drivers and/or configuration parameters for" +" them to function properly. If you would like to see data modified, or " +"have additional devices to add to the list, please raise an issue ticket " +"at GitHub." msgstr "" -"Det finns ingen garanti att dessa enhetsprofiler fungerar lika väl som de " -"verkliga enheterna de delar namn med. Du bör antagligen skaffa drivrutiner och " -"ange vissa parametrar för att de ska fungera korrekt. Om du ser något som bör " -"ändras, eller om du har andra enhetsprofiler som du skulle vilja lägga till, " -"kontakta oss via GitHub." +"Det finns ingen garanti att dessa enhetsprofiler fungerar lika väl som de" +" verkliga enheterna de delar namn med. Du bör antagligen skaffa " +"drivrutiner och ange vissa parametrar för att de ska fungera korrekt. Om " +"du ser något som bör ändras, eller om du har andra enhetsprofiler som du " +"skulle vilja lägga till, kontakta oss via GitHub." #: src/templates/drives.html:6 msgid "Hard Disk Drives" @@ -642,11 +652,11 @@ msgstr "Cd- och dvd-spelare" #: src/templates/drives.html:43 msgid "" -"This will create a properties file for the given CD-ROM or DVD image. No new " -"image file will be created." +"This will create a properties file for the given CD-ROM or DVD image. No " +"new image file will be created." msgstr "" -"Denna funktion skapar endast en egenskapsfil för en cd- eller dvd-bildfil. Ingen " -"ny cd-bildfil kommer att skapas." +"Denna funktion skapar endast en egenskapsfil för en cd- eller dvd-" +"bildfil. Ingen ny cd-bildfil kommer att skapas." #: src/templates/drives.html:64 msgid "Create for:" @@ -663,19 +673,19 @@ msgstr "%(disk_space)s MiB återstår på Pi-systemets skiva" #: src/templates/index.html:6 msgid "" -" This process may take a while, and will continue in the background if you " -"navigate away from this page." +" This process may take a while, and will continue in the background if " +"you navigate away from this page." msgstr "" -" Denna process kan ta ett tag, och kommer att forsätta i bakgrunden om du " -"navigerar bort från den här sidan." +" Denna process kan ta ett tag, och kommer att forsätta i bakgrunden om du" +" navigerar bort från den här sidan." #: src/templates/index.html:11 msgid "" -" The Web Interface will become unresponsive momentarily. Reload this page after " -"the Pi has started up again." +" The Web Interface will become unresponsive momentarily. Reload this page" +" after the Pi has started up again." msgstr "" -" Webbgränssnittet kommer att sluta reagera nu. Ladda om den här sidan efter " -"systemet har startat igen." +" Webbgränssnittet kommer att sluta reagera nu. Ladda om den här sidan " +"efter systemet har startat igen." #: src/templates/index.html:19 msgid "Current PiSCSI Configuration" @@ -684,19 +694,19 @@ msgstr "Nuvarande PiSCSI-konfiguration" #: src/templates/index.html:22 #, python-format msgid "" -"Save and load device configurations, stored as json files in %(config_dir)s" +"Save and load device configurations, stored as json files in " +"%(config_dir)s" msgstr "" "Spara och läs enhetskonfigurationer. Sparas som json-format i " "%(config_dir)s" #: src/templates/index.html:23 msgid "" -"To have a particular device configuration load when PiSCSI starts, save it as " -"default." +"To have a particular device configuration load when PiSCSI starts, save " +"it as default." msgstr "" -"Om du sparar en enhetskonfiguration som default så blir den läst när " -"PiSCSI startar." +"Om du sparar en enhetskonfiguration som default så blir den läst" +" när PiSCSI startar." #: src/templates/index.html:29 src/templates/index.html:51 #: src/templates/index.html:520 @@ -804,8 +814,8 @@ msgstr "Bildfilshanterare" #: src/templates/index.html:196 #, python-format msgid "" -"Manage image files in the active PiSCSI image directory: %(directory)s " -"with a scan depth of %(scan_depth)s." +"Manage image files in the active PiSCSI image directory: " +"%(directory)s with a scan depth of %(scan_depth)s." msgstr "" "Hantera filer i den aktiva bildfilskatalogen: %(directory)s med " "hierarkiskt djup %(scan_depth)s." @@ -813,12 +823,12 @@ msgstr "" #: src/templates/index.html:197 #, python-format msgid "" -"Select a valid SCSI ID and LUN to " -"attach to. Unless you know what you're doing, always use LUN 0." +"Select a valid SCSI ID and LUN " +"to attach to. Unless you know what you're doing, always use LUN 0." msgstr "" -"Välj ett giltigt SCSI-id samt LUN " -"(enhetsnummer) att ansluta till. Om du inte har särskild orsak, använd alltid " -"enhetsnummer 0." +"Välj ett giltigt SCSI-id samt LUN (enhetsnummer) att ansluta till. Om du inte har" +" särskild orsak, använd alltid enhetsnummer 0." #: src/templates/index.html:200 msgid "Recognized image file types:" @@ -867,18 +877,16 @@ msgid "Unknown" msgstr "Okänd" #: src/templates/index.html:344 -#, python-format -msgid "Enter new file name for: %(file_name)s" -msgstr "Ange ett nytt filnamn åt %(file_name)s" +msgid "Enter a new file name:" +msgstr "Ange ett nytt filnamn:" #: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" msgstr "Döp om" #: src/templates/index.html:349 -#, python-format -msgid "Save copy of %(file_name)s as:" -msgstr "Spara kopia av %(file_name)s som:" +msgid "Enter a file name for the copy:" +msgstr "Ange ett nytt filnamn åt kopian:" #: src/templates/index.html:352 msgid "Copy" @@ -899,8 +907,8 @@ msgstr "Info" #: src/templates/index.html:374 #, python-format -msgid "%(disk_space)s MiB disk space remaining on the system" -msgstr "Fritt utrymme på skivan: %(disk_space)s MiB" +msgid "%(disk_space)s MiB disk space remaining for images" +msgstr "%(disk_space)s MiB är tillgängligt för skivbilder" #: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" @@ -918,11 +926,11 @@ msgstr "Fildelning" #: src/templates/index.html:389 msgid "" -"Install a file server and create the shared files directory in order to share " -"files between the Pi and your vintage computers." +"Install a file server and create the shared files directory in order to " +"share files between the Pi and your vintage computers." msgstr "" -"Installera en filserver och skapa en katalog för fildelning för att dela filer " -"mellan Pi och dina gamla datorer." +"Installera en filserver och skapa en katalog för fildelning för att dela " +"filer mellan Pi och dina gamla datorer." #: src/templates/index.html:395 src/templates/index.html:446 msgid "Download file from URL:" @@ -950,11 +958,11 @@ msgstr "HFS är för Mac OS, Joliet för Windows, samt Rock Ridge för POSIX." #: src/templates/index.html:440 msgid "" -"If the downloaded file is a zip archive, we will attempt to unzip it and store " -"the resulting files." +"If the downloaded file is a zip archive, we will attempt to unzip it and " +"store the resulting files." msgstr "" -"Om den nedladdade filen är en zipfil så försöker vi packa up den och spara de " -"uppackade filerna på cd-bildfilen." +"Om den nedladdade filen är en zipfil så försöker vi packa up den och " +"spara de uppackade filerna på cd-bildfilen." #: src/templates/index.html:448 src/templates/index.html:480 #: src/templates/index.html:522 @@ -980,15 +988,16 @@ msgstr "Skapa tom skivbilsdfil" #: src/templates/index.html:514 #, python-format msgid "" -"Please refer to wiki documentation to " -"learn more about the supported image file types." +"Please refer to wiki " +"documentation to learn more about the supported image file types." msgstr "" -"Se wikin för vidare information " -"angående filtyper som stödjs." +"Se wikin för vidare information" +" angående filtyper som stödjs." #: src/templates/index.html:515 msgid "" -"It is not recommended to use the Lido hard disk driver with the Macintosh Plus." +"It is not recommended to use the Lido hard disk driver with the Macintosh" +" Plus." msgstr "Det är inte rekommenderat att använda Lido-drivrutiner med Macintosh Plus." #: src/templates/index.html:530 @@ -1018,19 +1027,19 @@ msgstr "Anslut kringutrustning" #: src/templates/index.html:580 msgid "" -"The piscsi_bridge network bridge is active and ready to be used by an " -"emulated network adapter!" +"The piscsi_bridge network bridge is active and ready to be used " +"by an emulated network adapter!" msgstr "" -"Nätverksbryggan piscsi_bridge är påslagen och kan användas av det " -"emulerade gränssnittet!" +"Nätverksbryggan piscsi_bridge är påslagen och kan användas av " +"det emulerade gränssnittet!" #: src/templates/index.html:582 msgid "" -"Please configure the piscsi_bridge network bridge before attaching an " -"emulated network adapter!" +"Please configure the piscsi_bridge network bridge before " +"attaching an emulated network adapter!" msgstr "" -"Se till att ställa in och sätta på piscsi_bridge innan du ansluter det " -"emulerade nätverksgränssnittet!" +"Se till att ställa in och sätta på piscsi_bridge innan du " +"ansluter det emulerade nätverksgränssnittet!" #: src/templates/index.html:584 #, python-format @@ -1038,17 +1047,17 @@ msgid "" "To browse the modern web, install a vintage web proxy such as Macproxy." msgstr "" -"För att surfa på den moderna webben, installera en webb-proxyserver så som Macproxy." +"För att surfa på den moderna webben, installera en webb-proxyserver så " +"som Macproxy." #: src/templates/index.html:586 #, python-format msgid "" -"Read more about supported device types " -"on the wiki." +"Read more about supported device " +"types on the wiki." msgstr "" -"Läs mer om enheter som stödjs (engelska) på wikin." +"Läs mer om enheter som stödjs " +"(engelska) på wikin." #: src/templates/index.html:593 msgid "Key" @@ -1096,18 +1105,19 @@ msgstr "Systemdrift" #: src/templates/index.html:730 msgid "" -"The System Name is the \"pretty\" hostname if set, with a fallback to the " -"regular hostname." +"The System Name is the \"pretty\" hostname if set, with a fallback to the" +" regular hostname." msgstr "" -"Vi använder \"pretty hostname\" som systemnamn, med vanligt hostname som reserv." +"Vi använder \"pretty hostname\" som systemnamn, med vanligt hostname som " +"reserv." #: src/templates/index.html:731 msgid "" -"IMPORTANT: Always shut down the system before turning off the power. Failing to " -"do so may lead to data loss." +"IMPORTANT: Always shut down the system before turning off the power. " +"Failing to do so may lead to data loss." msgstr "" -"VIKTIGT: Stäng alltid av systemet innan du stänger av strömmen. Om du inte gör " -"det kan det leda till dataförlust." +"VIKTIGT: Stäng alltid av systemet innan du stänger av strömmen. Om du " +"inte gör det kan det leda till dataförlust." #: src/templates/index.html:737 msgid "Language:" @@ -1166,19 +1176,19 @@ msgstr "Ladda upp filer från din dator" #: src/templates/upload.html:6 #, python-format msgid "" -"The largest file size accepted in this form is %(max_file_size)s MiB. Use other " -"file transfer means for larger files." +"The largest file size accepted in this form is %(max_file_size)s MiB. Use" +" other file transfer means for larger files." msgstr "" -"Den största filstorlek som kan hanteras i detta formulär är %(max_file_size)s " -"MiB. Använd andra men för större storlekar." +"Den största filstorlek som kan hanteras i detta formulär är " +"%(max_file_size)s MiB. Använd andra men för större storlekar." #: src/templates/upload.html:7 msgid "" "You have to manually clean up partially uploaded files, as a result of " "cancelling the upload or closing this page." msgstr "" -"Du måste själv rensa upp delvis uppladdade filer som ett resultat av att du " -"avbryter uppladdningen eller stänger den här sidan." +"Du måste själv rensa upp delvis uppladdade filer som ett resultat av att " +"du avbryter uppladdningen eller stänger den här sidan." #: src/templates/upload.html:12 src/templates/upload.html:36 msgid "PiSCSI Config" @@ -1198,14 +1208,17 @@ msgstr "Din webbläsare stöder ej filuppladdning via dra och släpp." #: src/templates/upload.html:56 msgid "" -"Please use the fallback form below to upload your files like in the olden days." +"Please use the fallback form below to upload your files like in the olden" +" days." msgstr "" -"Använd reservformuläret nedan för att ladda upp dina filer på gammaldags vis." +"Använd reservformuläret nedan för att ladda upp dina filer på gammaldags " +"vis." #: src/templates/upload.html:57 msgid "File is too big: {{filesize}}MiB. Max filesize: {{maxFilesize}}MiB." msgstr "" -"Filen är för stor: {{filesize}}MiB. Största möjliga storlek: {{maxFilesize}}MiB." +"Filen är för stor: {{filesize}}MiB. Största möjliga storlek: " +"{{maxFilesize}}MiB." #: src/templates/upload.html:58 msgid "You can't upload files of this type." @@ -1250,3 +1263,4 @@ msgstr "KiB" #: src/templates/upload.html:70 msgid "B" msgstr "B" + From 51f1e7eae79cd75fc08b5430e719545c05eb1a17 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Wed, 26 Jul 2023 18:19:22 -0700 Subject: [PATCH 05/12] Check for predictable network interface names in bridge check function, and always return a status message with the outcome of the check. Issue #1191 --- python/web/src/web.py | 4 +++- python/web/src/web_utils.py | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/python/web/src/web.py b/python/web/src/web.py index 40eb6c1461..cc0a139815 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -651,10 +651,12 @@ def attach_device(): if param: params.update({item.replace(PARAM_PREFIX, ""): param}) + return_message = "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" if "interface" in params.keys(): bridge_status = is_bridge_configured(params["interface"]) if not bridge_status["status"]: return response(error=True, message=bridge_status["msg"]) + return_message = return_message + " - " + bridge_status["msg"] kwargs = { "unit": int(unit), @@ -672,7 +674,7 @@ def attach_device(): if process["status"]: return response( message=_( - "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s", + return_message, device_type=get_device_name(device_type), id_number=scsi_id, unit_number=unit, diff --git a/python/web/src/web_utils.py b/python/web/src/web_utils.py index 862a3caf2f..e8acd00af7 100644 --- a/python/web/src/web_utils.py +++ b/python/web/src/web_utils.py @@ -274,24 +274,34 @@ def is_bridge_configured(interface): PATH_IPTV4 = "/etc/iptables/rules.v4" PATH_DHCPCD = "/etc/dhcpcd.conf" PATH_BRIDGE = "/etc/network/interfaces.d/piscsi_bridge" - return_msg = _("Configure the network bridge for %(interface)s first: ", interface=interface) to_configure = [] sys_cmd = SysCmds() - if interface.startswith("wlan"): + if interface.startswith("wlan") or interface.startswith("wlx"): + return_msg = _("Wireless network bridge enabled for %(interface)s", interface=interface) if not sys_cmd.introspect_file(PATH_SYSCTL, r"^net\.ipv4\.ip_forward=1$"): to_configure.append("IPv4 forwarding") if not Path(PATH_IPTV4).is_file(): to_configure.append("NAT") - else: + elif interface.startswith("eth") or interface.startswith("enx"): + return_msg = _("Wired network bridge enabled for %(interface)s", interface=interface) if not sys_cmd.introspect_file(PATH_DHCPCD, r"^denyinterfaces " + interface + r"$"): to_configure.append(PATH_DHCPCD) if not Path(PATH_BRIDGE).is_file(): to_configure.append(PATH_BRIDGE) + else: + return_msg = _( + "Unable to detect if %(interface)s is Ethernet or WiFi. " + "Make sure that the correct network bridge is configured.", + interface=interface, + ) if to_configure: + return_msg = _( + "Configure the network bridge for %(interface)s first: ", interface=interface + ) return {"status": False, "msg": return_msg + ", ".join(to_configure)} - return {"status": True, "msg": ""} + return {"status": True, "msg": return_msg} def is_safe_path(file_name): From d3317e97027af1fa05e117a6eb810c38f25217c4 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Fri, 28 Jul 2023 22:53:12 -0700 Subject: [PATCH 06/12] Bump stylelint to 15.10.2 and remove deprecated module (#1189) - Bump stylelint and stylelint-config-standard libs to the latest versions (security fixes) - Remove deprecated stylelint-config-prettier module - Scan the classic style sheet with stylelint and prettier in the github workflow - Address stylelint and prettier issues in the classic stylesheet - Bump prettier to 3.0.0 --- .github/workflows/web.yml | 8 +- python/web/.stylelintrc.json | 7 +- python/web/package-lock.json | 2123 +++-------------- python/web/package.json | 7 +- .../web/src/static/themes/classic/style.css | 16 +- 5 files changed, 399 insertions(+), 1762 deletions(-) diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 69da8317df..4b31adadfb 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -123,8 +123,12 @@ jobs: id: npm - name: Stylelint - run: npx stylelint src/static/themes/modern/style.css + run: | + npx stylelint src/static/themes/modern/style.css + npx stylelint src/static/themes/classic/style.css - name: Prettier - run: npx prettier --check src/static/themes/modern/style.css + run: | + npx prettier --check src/static/themes/modern/style.css + npx prettier --check src/static/themes/classic/style.css if: success() || failure() && steps.npm.outcome == 'success' diff --git a/python/web/.stylelintrc.json b/python/web/.stylelintrc.json index d7b6312946..8bd7861c44 100644 --- a/python/web/.stylelintrc.json +++ b/python/web/.stylelintrc.json @@ -1,6 +1,7 @@ { - "extends": ["stylelint-config-standard", "stylelint-config-prettier"], + "extends": ["stylelint-config-standard"], "rules": { - "no-descending-specificity": null + "no-descending-specificity": null, + "media-feature-range-notation": "prefix" } -} \ No newline at end of file +} diff --git a/python/web/package-lock.json b/python/web/package-lock.json index d2bae6b7c1..06133d7f21 100644 --- a/python/web/package-lock.json +++ b/python/web/package-lock.json @@ -1,44 +1,43 @@ { "name": "web", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "devDependencies": { - "prettier": "2.7.1", - "stylelint": "^14.14.1", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-standard": "^29.0.0" + "prettier": "3.0.0", + "stylelint": "^15.10.2", + "stylelint-config-standard": "^34.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -46,21 +45,84 @@ "node": ">=6.9.0" } }, - "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.0.tgz", + "integrity": "sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.1.1" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz", + "integrity": "sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==", "dev": true, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^14 || ^16 || >=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz", + "integrity": "sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.0", + "@csstools/css-tokenizer": "^2.1.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "postcss": "^8.2", - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.13" } }, "node_modules/@nodelib/fs.scandir": { @@ -110,12 +172,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, "node_modules/ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", @@ -153,6 +209,12 @@ "node": ">=4" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -224,26 +286,30 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -291,30 +357,45 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" } }, "node_modules/css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz", + "integrity": "sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==", "dev": true, "engines": { "node": ">=12.22" } }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -345,12 +426,15 @@ } }, "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decamelize-keys": { @@ -369,6 +453,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -421,9 +514,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -479,16 +572,19 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -649,9 +745,9 @@ } }, "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, "engines": { "node": ">=8" @@ -661,9 +757,9 @@ } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -713,12 +809,15 @@ } }, "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflight": { @@ -750,9 +849,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -830,6 +929,18 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -852,9 +963,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", + "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", "dev": true }, "node_modules/lines-and-columns": { @@ -864,15 +975,18 @@ "dev": true }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.truncate": { @@ -915,27 +1029,33 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1005,10 +1125,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1050,39 +1176,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parent-module": { @@ -1133,12 +1253,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -1167,9 +1281,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.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", "dev": true, "funding": [ { @@ -1179,10 +1293,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -1190,12 +1308,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", @@ -1219,9 +1331,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1238,15 +1350,15 @@ "dev": true }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -1282,102 +1394,66 @@ ] }, "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", "dev": true, "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/require-from-string": { @@ -1389,23 +1465,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1464,9 +1523,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1479,10 +1538,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/slash": { "version": "3.0.0", @@ -1553,9 +1618,9 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -1579,9 +1644,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/string-width": { @@ -1611,15 +1676,18 @@ } }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "dependencies": { - "min-indent": "^1.0.0" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/style-search": { @@ -1629,96 +1697,88 @@ "dev": true }, "node_modules/stylelint": { - "version": "14.14.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.1.tgz", - "integrity": "sha512-Jnftu+lSD8cSpcV/+Z2nfgfgFpTIS1FcujezXPngtoIQ6wtwutL22MsNE0dJuMiM1h1790g2qIjAyUZCMrX4sw==", + "version": "15.10.2", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.2.tgz", + "integrity": "sha512-UxqSb3hB74g4DTO45QhUHkJMjKKU//lNUAOWyvPBVPZbCknJ5HjOWWZo+UDuhHa9FLeVdHBZXxu43eXkjyIPWg==", "dev": true, "dependencies": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.3.0", + "@csstools/css-tokenizer": "^2.1.1", + "@csstools/media-query-list-parser": "^2.1.2", + "@csstools/selector-specificity": "^3.0.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.0.1", - "css-functions-list": "^3.1.0", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.2.0", + "css-tree": "^2.3.1", "debug": "^4.3.4", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^6.0.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.0", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.27.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", + "meow": "^10.1.5", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.18", - "postcss-media-query-parser": "^0.2.3", + "postcss": "^8.4.25", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.10", + "postcss-selector-parser": "^6.0.13", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.1" }, "bin": { - "stylelint": "bin/stylelint.js" + "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/stylelint" } }, - "node_modules/stylelint-config-prettier": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-9.0.3.tgz", - "integrity": "sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg==", + "node_modules/stylelint-config-recommended": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", + "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", "dev": true, - "bin": { - "stylelint-config-prettier": "bin/check.js", - "stylelint-config-prettier-check": "bin/check.js" - }, "engines": { - "node": ">= 12" + "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { - "stylelint": ">=11.0.0" - } - }, - "node_modules/stylelint-config-recommended": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", - "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", - "dev": true, - "peerDependencies": { - "stylelint": "^14.10.0" + "stylelint": "^15.10.0" } }, "node_modules/stylelint-config-standard": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", - "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "version": "34.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz", + "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==", "dev": true, "dependencies": { - "stylelint-config-recommended": "^9.0.0" + "stylelint-config-recommended": "^13.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { - "stylelint": "^14.14.0" + "stylelint": "^15.10.0" } }, "node_modules/supports-color": { @@ -1734,16 +1794,16 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -1767,18 +1827,6 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -1814,18 +1862,21 @@ } }, "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" @@ -1849,12 +1900,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -1884,16 +1929,16 @@ "dev": true }, "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/yallist": { @@ -1902,15 +1947,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -1919,1425 +1955,18 @@ "engines": { "node": ">=10" } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - } - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "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" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "requires": {} - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "stylelint": { - "version": "14.14.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.1.tgz", - "integrity": "sha512-Jnftu+lSD8cSpcV/+Z2nfgfgFpTIS1FcujezXPngtoIQ6wtwutL22MsNE0dJuMiM1h1790g2qIjAyUZCMrX4sw==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.0.1", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.0", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.18", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - } - }, - "stylelint-config-prettier": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-9.0.3.tgz", - "integrity": "sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg==", - "dev": true, - "requires": {} - }, - "stylelint-config-recommended": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", - "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", - "dev": true, - "requires": {} - }, - "stylelint-config-standard": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", - "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^9.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } } diff --git a/python/web/package.json b/python/web/package.json index 56ef0a571d..5ff05b216f 100644 --- a/python/web/package.json +++ b/python/web/package.json @@ -1,8 +1,7 @@ { "devDependencies": { - "prettier": "2.7.1", - "stylelint": "^14.14.1", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-standard": "^29.0.0" + "prettier": "3.0.0", + "stylelint": "^15.10.2", + "stylelint-config-standard": "^34.0.0" } } diff --git a/python/web/src/static/themes/classic/style.css b/python/web/src/static/themes/classic/style.css index 23b4ab8882..b8ed990d28 100644 --- a/python/web/src/static/themes/classic/style.css +++ b/python/web/src/static/themes/classic/style.css @@ -13,7 +13,9 @@ form { display: inline; } -table, tr, td { +table, +tr, +td { border: 1px solid black; border-collapse: collapse; margin: none; @@ -48,7 +50,7 @@ div.footer { } div.footer div.theme-change-hint { - margin-bottom: 15px; + margin-bottom: 15px; } div.logged-in { @@ -100,7 +102,7 @@ td.inactive { background-color: tan; } -ul.inline_list { +ul.inline-list { list-style: none; } @@ -113,7 +115,8 @@ summary.filename { text-decoration: underline; } -.dropzone, .dropzone * { +.dropzone, +.dropzone * { box-sizing: border-box; } @@ -134,7 +137,7 @@ summary.filename { position: relative; display: inline-block; width: 180px; - margin: .5em; + margin: 0.5em; } .dropzone .dz-preview .dz-progress { @@ -159,7 +162,8 @@ summary.filename { display: block; } -.dropzone .dz-preview .dz-error-mark, .dropzone .dz-preview .dz-success-mark { +.dropzone .dz-preview .dz-error-mark, +.dropzone .dz-preview .dz-success-mark { position: absolute; display: none; top: 30px; From 8089bb93f37a3cab161dc78d9732a2859269ad4a Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 31 Jul 2023 12:12:53 -0700 Subject: [PATCH 07/12] Launch python client services only after network-online target (#1197) --- python/ctrlboard/service-infra/piscsi-ctrlboard.service | 2 +- python/oled/service-infra/piscsi-oled.service | 2 +- python/web/service-infra/piscsi-web.service | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/ctrlboard/service-infra/piscsi-ctrlboard.service b/python/ctrlboard/service-infra/piscsi-ctrlboard.service index 3eb9de72d4..0c336d40c7 100644 --- a/python/ctrlboard/service-infra/piscsi-ctrlboard.service +++ b/python/ctrlboard/service-infra/piscsi-ctrlboard.service @@ -1,6 +1,6 @@ [Unit] Description=PiSCSI Control Board service -After=network.target piscsi.service +After=network-online.target piscsi.service [Service] Type=simple diff --git a/python/oled/service-infra/piscsi-oled.service b/python/oled/service-infra/piscsi-oled.service index a339e6a29c..9be68433cb 100644 --- a/python/oled/service-infra/piscsi-oled.service +++ b/python/oled/service-infra/piscsi-oled.service @@ -1,6 +1,6 @@ [Unit] Description=PiSCSI-OLED Monitor service -After=network.target piscsi.service +After=network-online.target piscsi.service [Service] Type=simple diff --git a/python/web/service-infra/piscsi-web.service b/python/web/service-infra/piscsi-web.service index cf7c8b8511..3f4d7ed466 100644 --- a/python/web/service-infra/piscsi-web.service +++ b/python/web/service-infra/piscsi-web.service @@ -1,6 +1,6 @@ [Unit] Description=PiSCSI-Web service -After=network.target +After=network-online.target piscsi.service [Service] Type=simple From 3b6822d7c89a6b2f66cb0fed5d3d1627557d5810 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 31 Jul 2023 12:13:23 -0700 Subject: [PATCH 08/12] easyinstall: Dynamically detect an available network i/f, and abort if none is found (#1193) * Dynamically detect an available network i/f, and abort if none is found * Network i/f fallback for headless mode * Split piscsi installation and system service configuration --- easyinstall.sh | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/easyinstall.sh b/easyinstall.sh index 53c10ce261..4a980fef6b 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -189,8 +189,10 @@ function installPiscsi() { # install sudo make install CONNECT_TYPE="$CONNECT_TYPE" Date: Fri, 1 Sep 2023 02:23:12 -0400 Subject: [PATCH 09/12] Add web UI notification for under voltage/throttling events (#1203) --- README.md | 2 +- python/common/requirements.txt | 1 + python/common/src/piscsi/return_codes.py | 8 ++++ python/common/src/piscsi/sys_cmds.py | 36 ++++++++++++++++ python/web/mock/bin/vcgencmd | 23 ++++++++++ python/web/requirements.txt | 3 +- python/web/src/return_code_mapper.py | 16 +++++++ python/web/src/settings.py | 16 +++++++ .../web/src/static/themes/classic/style.css | 33 ++++++++++++++ python/web/src/static/themes/modern/style.css | 43 +++++++++++++++++++ python/web/src/templates/base.html | 12 ++++++ python/web/src/web.py | 7 +++ python/web/tests/api/test_settings.py | 9 ++++ 13 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 python/web/mock/bin/vcgencmd diff --git a/README.md b/README.md index f58de43961..3747d6f410 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Please check out the full story with much more detail on the [wiki](https://gith # How do I contribute? PiSCSI is using the Gitflow Workflow. A quick overview: -- The *master* branch should always reflect the contents of the last stable release +- The *main* branch should always reflect the contents of the last stable release - The *develop* branch should contain the latest tested & approved updates. Pull requests should be used to merge changes into develop. - The rest of the feature branches are for developing new features - A tag will be created for each "release". The releases will be named .. where the release number is incremented for each subsequent release tagged in the same calendar month. The first release of the month of January 2021 is called "21.01.01", the second one in the same month "21.01.02" and so on. diff --git a/python/common/requirements.txt b/python/common/requirements.txt index 45ccd77679..90a99b04c4 100644 --- a/python/common/requirements.txt +++ b/python/common/requirements.txt @@ -1,2 +1,3 @@ protobuf==3.19.5 requests==2.31.0 +vcgencmd==0.1.1 diff --git a/python/common/src/piscsi/return_codes.py b/python/common/src/piscsi/return_codes.py index cfd8265c8d..25cd2392b2 100644 --- a/python/common/src/piscsi/return_codes.py +++ b/python/common/src/piscsi/return_codes.py @@ -27,3 +27,11 @@ class ReturnCodes: EXTRACTIMAGE_NO_FILES_SPECIFIED = 91 EXTRACTIMAGE_NO_FILES_EXTRACTED = 92 EXTRACTIMAGE_COMMAND_ERROR = 93 + UNDER_VOLTAGE_DETECTED = 100 + ARM_FREQUENCY_CAPPED = 101 + CURRENTLY_THROTTLED = 102 + SOFT_TEMPERATURE_LIMIT_ACTIVE = 103 + UNDER_VOLTAGE_HAS_OCCURRED = 116 + ARM_FREQUENCY_CAPPING_HAS_OCCURRED = 117 + THROTTLING_HAS_OCCURRED = 118 + SOFT_TEMPERATURE_LIMIT_HAS_OCCURRED = 119 diff --git a/python/common/src/piscsi/sys_cmds.py b/python/common/src/piscsi/sys_cmds.py index c21cc8f4ac..cb43360ad4 100644 --- a/python/common/src/piscsi/sys_cmds.py +++ b/python/common/src/piscsi/sys_cmds.py @@ -9,7 +9,9 @@ from socket import socket, gethostname, AF_INET, SOCK_DGRAM from pathlib import Path from platform import uname +from vcgencmd import Vcgencmd +from piscsi.return_codes import ReturnCodes from piscsi.common_settings import SHELL_ERROR @@ -263,3 +265,37 @@ def shutdown_system(): return process.returncode, process.stdout.decode("utf-8") return process.returncode, process.stderr.decode("utf-8") + + @staticmethod + def get_throttled(enabled_modes, test_modes): + """ + Takes (list) enabled_modes & (list) test_modes parameters & returns a + tuple of (str) category & (str) message. + + enabled_modes is a list of modes that will be enabled for display if + they're triggered. test_modes works similarly to enabled_mode but will + ALWAYS display the modes listed for troubleshooting styling. + """ + vcgcmd = Vcgencmd() + t_states = vcgcmd.get_throttled()['breakdown'] + matched_states = [] + + state_msgs = { + "0": ("error", ReturnCodes.UNDER_VOLTAGE_DETECTED), + "1": ("warning", ReturnCodes.ARM_FREQUENCY_CAPPED), + "2": ("error", ReturnCodes.CURRENTLY_THROTTLED), + "3": ("warning", ReturnCodes.SOFT_TEMPERATURE_LIMIT_ACTIVE), + "16": ("warning", ReturnCodes.UNDER_VOLTAGE_HAS_OCCURRED), + "17": ("warning", ReturnCodes.ARM_FREQUENCY_CAPPING_HAS_OCCURRED), + "18": ("warning", ReturnCodes.THROTTLING_HAS_OCCURRED), + "19": ("warning", ReturnCodes.SOFT_TEMPERATURE_LIMIT_HAS_OCCURRED), + } + + for k in t_states: + if t_states[k] and k in enabled_modes: + matched_states.append(state_msgs[k]) + + for t in test_modes: + matched_states.append(state_msgs[t]) + + return matched_states diff --git a/python/web/mock/bin/vcgencmd b/python/web/mock/bin/vcgencmd new file mode 100644 index 0000000000..ce21e8e260 --- /dev/null +++ b/python/web/mock/bin/vcgencmd @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Info: https://www.raspberrypi.com/documentation/computers/os.html#vcgencmd +# +# Bit Hex value Meaning +# ----- ----------- ------------------------ +# 0 0x1 Under-voltage detected +# 1 0x2 Arm frequency capped +# 2 0x4 Currently throttled +# 3 0x8 Soft temperature limit active +# 16 0x10000 Under-voltage has occurred +# 17 0x20000 Arm frequency capping has occurred +# 18 0x40000 Throttling has occurred +# 19 0x80000 Soft temperature limit has occurred + +if [[ "$1" == "get_throttled" ]] +then + # Return 'Under-voltage detected' & 'Under-voltage has occurred' + echo "throttled=0x10001" +fi + +echo "Mock does not recognize: $0 $@" +exit 1 \ No newline at end of file diff --git a/python/web/requirements.txt b/python/web/requirements.txt index d5e015210d..60758b1ce5 100644 --- a/python/web/requirements.txt +++ b/python/web/requirements.txt @@ -5,4 +5,5 @@ protobuf==3.20.2 requests==2.31.0 simplepam==0.1.5 flask_babel==2.0.0 -ua-parser==0.16.1 \ No newline at end of file +ua-parser==0.16.1 +vcgencmd==0.1.1 \ No newline at end of file diff --git a/python/web/src/return_code_mapper.py b/python/web/src/return_code_mapper.py index f6c6e2739d..9695a1dd60 100644 --- a/python/web/src/return_code_mapper.py +++ b/python/web/src/return_code_mapper.py @@ -50,6 +50,22 @@ class ReturnCodeMapper: _("No files were extracted (existing files are skipped)"), ReturnCodes.EXTRACTIMAGE_COMMAND_ERROR: _("Unable to extract archive: %(error)s"), + ReturnCodes.UNDER_VOLTAGE_DETECTED: + _("Under voltage detected - Make sure to use a proper power source (2.5+ amps)."), + ReturnCodes.ARM_FREQUENCY_CAPPED: + _("ARM frequency capped - Ensure proper airflow/cooling."), + ReturnCodes.CURRENTLY_THROTTLED: + _("Currently throttled - Make sure to use a proper power source (2.5+ amps)."), + ReturnCodes.SOFT_TEMPERATURE_LIMIT_ACTIVE: + _("Soft-temperature limit active - Ensure proper airflow/cooling."), + ReturnCodes.UNDER_VOLTAGE_HAS_OCCURRED: + _("Under voltage has occurred since last reboot. Make sure to use a proper power source (2.5+ amps)."), + ReturnCodes.ARM_FREQUENCY_CAPPING_HAS_OCCURRED: + _("ARM frequency capping has occurred since last reboot. Ensure proper airflow/cooling."), + ReturnCodes.THROTTLING_HAS_OCCURRED: + _("Throttling has occurred since the last reboot. Make sure to use a proper power source (2.5+ amps)."), + ReturnCodes.SOFT_TEMPERATURE_LIMIT_HAS_OCCURRED: + _("Soft temperature limit has occurred since last reboot. Ensure proper airflow/cooling."), } # fmt: on diff --git a/python/web/src/settings.py b/python/web/src/settings.py index 3a2c4d73bd..7bcc99c3e2 100644 --- a/python/web/src/settings.py +++ b/python/web/src/settings.py @@ -31,3 +31,19 @@ # Fallback theme for older browsers TEMPLATE_THEME_LEGACY = "classic" + +# Enable throttle notifications +# +# Available modes: +# "0": "Under-voltage detected" +# "1": "Arm frequency capped" +# "2": "Currently throttled" +# "3": "Soft temperature limit active" +# "16": "Under-voltage has occurred" +# "17": "Arm frequency capping has occurred" +# "18": "Throttling has occurred" +# "19": "Soft temperature limit has occurred" +THROTTLE_NOTIFY_MODES = ["0", "16"] +# Include a list of modes to be shown ALL THE TIME to be used for styling +# and formatting. +THROTTLE_TEST_MODES = [] diff --git a/python/web/src/static/themes/classic/style.css b/python/web/src/static/themes/classic/style.css index b8ed990d28..c5da7eed84 100644 --- a/python/web/src/static/themes/classic/style.css +++ b/python/web/src/static/themes/classic/style.css @@ -172,3 +172,36 @@ summary.filename { left: 50%; margin-left: -27px; } + +div.throttle_notice > div { + display: grid; + align-items: center; + background-color: #efefef; + background-repeat: no-repeat; + background-position: 1rem center; + background-size: 1rem; + font-size: x-small; + font-weight: bold; + justify-content: center; +} + +div.throttle_notice > div.error { + background-color: #dc3545; + align-items: center; +} + +div.throttle_notice > div.warning { + background-color: #ffc107; + align-items: center; +} + +div.throttle_notice > div a { + color: black; + text-decoration: none; +} + +div.throttle_notice > div a:hover { + text-decoration: underline; +} + + diff --git a/python/web/src/static/themes/modern/style.css b/python/web/src/static/themes/modern/style.css index 361f5bed83..f6c558710b 100644 --- a/python/web/src/static/themes/modern/style.css +++ b/python/web/src/static/themes/modern/style.css @@ -470,6 +470,49 @@ div.footer div.theme-change-hint a { color: yellow; } +/* + ------------------------------------------------------------------------------ + Throttle messages + ------------------------------------------------------------------------------ + */ + +div.throttle_notice > div { + display: grid; + align-items: center; + background-color: #efefef; + background-repeat: no-repeat; + background-position: 1rem center; + background-size: 1rem; + font-size: x-small; + font-weight: bold; +} + +div.throttle_notice > div.error { + background-color: var(--danger); + background-image: url("icons/error.svg"); + color: #fff; + align-items: center; +} + +div.throttle_notice > div.warning { + background-color: var(--warning); + background-image: url("icons/warning.svg"); + align-items: center; +} + +div.throttle_notice > div > span.message { + padding-left: 3rem; +} + +div.throttle_notice > div a { + color: black; + text-decoration: none; +} + +div.throttle_notice > div a:hover { + text-decoration: underline; +} + /* ------------------------------------------------------------------------------ Flash messages diff --git a/python/web/src/templates/base.html b/python/web/src/templates/base.html index 25331690c8..5bca87b2e1 100644 --- a/python/web/src/templates/base.html +++ b/python/web/src/templates/base.html @@ -73,6 +73,18 @@

+
+ {% if (env["throttle_status"]|length > 0) %} + {% for category, response in env["throttle_status"] %} + + {% endfor %} + {% endif %} +
+
{% if get_flashed_messages(): %} {% for category, message in get_flashed_messages(with_categories=true) %} diff --git a/python/web/src/web.py b/python/web/src/web.py index cc0a139815..732ef0fe6d 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -69,6 +69,8 @@ TEMPLATE_THEMES, TEMPLATE_THEME_DEFAULT, TEMPLATE_THEME_LEGACY, + THROTTLE_NOTIFY_MODES, + THROTTLE_TEST_MODES, ) @@ -88,6 +90,9 @@ def get_env_info(): else: username = None + throttled_statuses = sys_cmd.get_throttled( + THROTTLE_NOTIFY_MODES, THROTTLE_TEST_MODES) + return { "running_env": sys_cmd.running_env(), "username": username, @@ -106,6 +111,8 @@ def get_env_info(): "cd_suffixes": tuple(server_info["sccd"]), "rm_suffixes": tuple(server_info["scrm"]), "mo_suffixes": tuple(server_info["scmo"]), + "throttle_status": + [(s[0], ReturnCodeMapper.add_msg({"return_code":s[1]})) for s in throttled_statuses], } diff --git a/python/web/tests/api/test_settings.py b/python/web/tests/api/test_settings.py index 3875fd9eb2..1c51205a76 100644 --- a/python/web/tests/api/test_settings.py +++ b/python/web/tests/api/test_settings.py @@ -286,3 +286,12 @@ def test_rename_system(env, http_client): response_data = response.json() assert response_data["data"]["system_name"] == old_name + + +def test_throttle_notification(http_client): + response = http_client.get("/") + response_data = response.json() + + assert response.status_code == 200 + assert response_data["status"] == STATUS_SUCCESS + assert "Under voltage detected" in response_data["data"] From 74eef6f9cc318f3d3a970253fa1c9b413d451b75 Mon Sep 17 00:00:00 2001 From: Tony Kuker <34318535+akuker@users.noreply.github.com> Date: Sat, 2 Sep 2023 18:36:45 -0500 Subject: [PATCH 10/12] Enable actions on pull request (#1209) * Update revision for release * Create sonarcloud.yml * Update sonarcloud.yml * Update sonarcloud.yml * Update sonarcloud.yml * Update sonarcloud.yml * Delete sonarcloud.yml * Update revision number for release * Remove SonarCloud cache setup as it is now offered by default (#1135) No need to configure the cache anymore, SonarCloud now has an automatic analysis caching. See https://docs.sonarcloud.io/advanced-setup/languages/c-c-objective-c/#analysis-cache. * Revert "Remove SonarCloud cache setup as it is now offered by default (#1135)" (#1144) This reverts commit 3ad668cfd1bc84c80a6ea0edb024bee08264bd37. * Update web.yml * Update cpp.yml * Update web.yml * Update build_code.yml * Update build_code.yml * Update cpp.yml * Update web.yml --------- Co-authored-by: Tony Kuker Co-authored-by: Massimo Paladin --- .github/workflows/build_code.yml | 13 +++++++++++++ .github/workflows/cpp.yml | 12 ++++++++++++ .github/workflows/web.yml | 14 ++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/.github/workflows/build_code.yml b/.github/workflows/build_code.yml index 0970e9f5ab..e0c3885259 100644 --- a/.github/workflows/build_code.yml +++ b/.github/workflows/build_code.yml @@ -7,6 +7,19 @@ on: - 'cpp/**' - '.github/workflows/build_code.yml' - '.github/workflows/arm_cross_compile.yml' + pull_request: + paths: + - 'cpp/**' + - '.github/workflows/build_code.yml' + - '.github/workflows/arm_cross_compile.yml' + types: + - assigned + - opened + - synchronize + - reopened + branches: + - 'develop' + - 'main' jobs: fullspec: diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml index 33a84537ee..450c1695dd 100644 --- a/.github/workflows/cpp.yml +++ b/.github/workflows/cpp.yml @@ -6,6 +6,18 @@ on: paths: - 'cpp/**' - '.github/workflows/cpp.yml' + pull_request: + paths: + - 'cpp/**' + - '.github/workflows/cpp.yml' + types: + - assigned + - opened + - synchronize + - reopened + branches: + - 'develop' + - 'main' env: APT_PACKAGES: libspdlog-dev libpcap-dev libevdev2 libev-dev protobuf-compiler libgtest-dev libgmock-dev diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 4b31adadfb..d22c4906fe 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -8,6 +8,20 @@ on: - 'python/common/**' - '.github/workflows/web.yml' - 'easyinstall.sh' + pull_request: + paths: + - 'python/web/**' + - 'python/common/**' + - '.github/workflows/web.yml' + - 'easyinstall.sh' + types: + - assigned + - opened + - synchronize + - reopened + branches: + - 'develop' + - 'main' jobs: backend_checks: From b514440957eb149ae4f91d7bad0c70107cb8ee81 Mon Sep 17 00:00:00 2001 From: Benjamin Krein Date: Mon, 4 Sep 2023 11:08:42 -0400 Subject: [PATCH 11/12] Fix test failures in low-voltage PR (#1207) * fix lint checks in web python * fix lint checks in common python * rework to pass tests in docker * fix css style lint * fix css style syntax --- python/common/src/piscsi/sys_cmds.py | 56 +++++++++++-------- python/web/requirements-dev.txt | 1 + python/web/src/return_code_mapper.py | 23 +++++--- python/web/src/settings.py | 2 +- .../web/src/static/themes/classic/style.css | 12 ++-- python/web/src/static/themes/modern/style.css | 14 ++--- python/web/src/templates/base.html | 5 +- python/web/src/web.py | 8 +-- python/web/tests/api/test_settings.py | 9 --- 9 files changed, 67 insertions(+), 63 deletions(-) diff --git a/python/common/src/piscsi/sys_cmds.py b/python/common/src/piscsi/sys_cmds.py index cb43360ad4..37c85f4a4e 100644 --- a/python/common/src/piscsi/sys_cmds.py +++ b/python/common/src/piscsi/sys_cmds.py @@ -3,13 +3,18 @@ """ import subprocess import logging +import sys from subprocess import run, CalledProcessError from shutil import disk_usage from re import findall, match from socket import socket, gethostname, AF_INET, SOCK_DGRAM from pathlib import Path from platform import uname -from vcgencmd import Vcgencmd + +try: + from vcgencmd import Vcgencmd +except ImportError: + pass from piscsi.return_codes import ReturnCodes from piscsi.common_settings import SHELL_ERROR @@ -276,26 +281,29 @@ def get_throttled(enabled_modes, test_modes): they're triggered. test_modes works similarly to enabled_mode but will ALWAYS display the modes listed for troubleshooting styling. """ - vcgcmd = Vcgencmd() - t_states = vcgcmd.get_throttled()['breakdown'] - matched_states = [] - - state_msgs = { - "0": ("error", ReturnCodes.UNDER_VOLTAGE_DETECTED), - "1": ("warning", ReturnCodes.ARM_FREQUENCY_CAPPED), - "2": ("error", ReturnCodes.CURRENTLY_THROTTLED), - "3": ("warning", ReturnCodes.SOFT_TEMPERATURE_LIMIT_ACTIVE), - "16": ("warning", ReturnCodes.UNDER_VOLTAGE_HAS_OCCURRED), - "17": ("warning", ReturnCodes.ARM_FREQUENCY_CAPPING_HAS_OCCURRED), - "18": ("warning", ReturnCodes.THROTTLING_HAS_OCCURRED), - "19": ("warning", ReturnCodes.SOFT_TEMPERATURE_LIMIT_HAS_OCCURRED), - } - - for k in t_states: - if t_states[k] and k in enabled_modes: - matched_states.append(state_msgs[k]) - - for t in test_modes: - matched_states.append(state_msgs[t]) - - return matched_states + if "vcgencmd" in sys.modules: + vcgcmd = Vcgencmd() + t_states = vcgcmd.get_throttled()["breakdown"] + matched_states = [] + + state_msgs = { + "0": ("error", ReturnCodes.UNDER_VOLTAGE_DETECTED), + "1": ("warning", ReturnCodes.ARM_FREQUENCY_CAPPED), + "2": ("error", ReturnCodes.CURRENTLY_THROTTLED), + "3": ("warning", ReturnCodes.SOFT_TEMPERATURE_LIMIT_ACTIVE), + "16": ("warning", ReturnCodes.UNDER_VOLTAGE_HAS_OCCURRED), + "17": ("warning", ReturnCodes.ARM_FREQUENCY_CAPPING_HAS_OCCURRED), + "18": ("warning", ReturnCodes.THROTTLING_HAS_OCCURRED), + "19": ("warning", ReturnCodes.SOFT_TEMPERATURE_LIMIT_HAS_OCCURRED), + } + + for k in t_states: + if t_states[k] and k in enabled_modes: + matched_states.append(state_msgs[k]) + + for t in test_modes: + matched_states.append(state_msgs[t]) + + return matched_states + else: + return [] diff --git a/python/web/requirements-dev.txt b/python/web/requirements-dev.txt index fd2bb2a1f2..f65d5f8ca2 100644 --- a/python/web/requirements-dev.txt +++ b/python/web/requirements-dev.txt @@ -4,3 +4,4 @@ black==22.8.0 flake8==5.0.4 watchdog==2.1.9 requests==2.31.0 +vcgencmd==0.1.1 diff --git a/python/web/src/return_code_mapper.py b/python/web/src/return_code_mapper.py index 9695a1dd60..95025d9b1b 100644 --- a/python/web/src/return_code_mapper.py +++ b/python/web/src/return_code_mapper.py @@ -51,21 +51,28 @@ class ReturnCodeMapper: ReturnCodes.EXTRACTIMAGE_COMMAND_ERROR: _("Unable to extract archive: %(error)s"), ReturnCodes.UNDER_VOLTAGE_DETECTED: - _("Under voltage detected - Make sure to use a proper power source (2.5+ amps)."), + _("Potential instability - Under voltage detected - Make sure to use a sufficient " + "power source (2.5+ amps)."), ReturnCodes.ARM_FREQUENCY_CAPPED: - _("ARM frequency capped - Ensure proper airflow/cooling."), + _("Potential instability - ARM frequency capped - Ensure sufficient airflow/cooling."), ReturnCodes.CURRENTLY_THROTTLED: - _("Currently throttled - Make sure to use a proper power source (2.5+ amps)."), + _("Potential instability - Currently throttled - Make sure to use a sufficient power " + "source (2.5+ amps)."), ReturnCodes.SOFT_TEMPERATURE_LIMIT_ACTIVE: - _("Soft-temperature limit active - Ensure proper airflow/cooling."), + _("Potential instability - Soft-temperature limit active - Ensure sufficient " + "airflow/cooling."), ReturnCodes.UNDER_VOLTAGE_HAS_OCCURRED: - _("Under voltage has occurred since last reboot. Make sure to use a proper power source (2.5+ amps)."), + _("Potential instability - Under voltage has occurred since last reboot. Make sure " + "to use a sufficient power source (2.5+ amps)."), ReturnCodes.ARM_FREQUENCY_CAPPING_HAS_OCCURRED: - _("ARM frequency capping has occurred since last reboot. Ensure proper airflow/cooling."), + _("Potential instability - ARM frequency capping has occurred since last reboot. " + "Ensure sufficient airflow/cooling."), ReturnCodes.THROTTLING_HAS_OCCURRED: - _("Throttling has occurred since the last reboot. Make sure to use a proper power source (2.5+ amps)."), + _("Potential instability - Throttling has occurred since the last reboot. Make sure " + "to use a sufficient power source (2.5+ amps)."), ReturnCodes.SOFT_TEMPERATURE_LIMIT_HAS_OCCURRED: - _("Soft temperature limit has occurred since last reboot. Ensure proper airflow/cooling."), + _("Potential instability - Soft temperature limit has occurred since last reboot. " + "Ensure sufficient airflow/cooling."), } # fmt: on diff --git a/python/web/src/settings.py b/python/web/src/settings.py index 7bcc99c3e2..5994c71976 100644 --- a/python/web/src/settings.py +++ b/python/web/src/settings.py @@ -33,7 +33,7 @@ TEMPLATE_THEME_LEGACY = "classic" # Enable throttle notifications -# +# # Available modes: # "0": "Under-voltage detected" # "1": "Arm frequency capped" diff --git a/python/web/src/static/themes/classic/style.css b/python/web/src/static/themes/classic/style.css index c5da7eed84..3c8b754a69 100644 --- a/python/web/src/static/themes/classic/style.css +++ b/python/web/src/static/themes/classic/style.css @@ -173,7 +173,7 @@ summary.filename { margin-left: -27px; } -div.throttle_notice > div { +div.throttle-notice > div { display: grid; align-items: center; background-color: #efefef; @@ -185,23 +185,21 @@ div.throttle_notice > div { justify-content: center; } -div.throttle_notice > div.error { +div.throttle-notice > div.error { background-color: #dc3545; align-items: center; } -div.throttle_notice > div.warning { +div.throttle-notice > div.warning { background-color: #ffc107; align-items: center; } -div.throttle_notice > div a { +div.throttle-notice > div a { color: black; text-decoration: none; } -div.throttle_notice > div a:hover { +div.throttle-notice > div a:hover { text-decoration: underline; } - - diff --git a/python/web/src/static/themes/modern/style.css b/python/web/src/static/themes/modern/style.css index f6c558710b..a21a91ed96 100644 --- a/python/web/src/static/themes/modern/style.css +++ b/python/web/src/static/themes/modern/style.css @@ -476,7 +476,7 @@ div.footer div.theme-change-hint a { ------------------------------------------------------------------------------ */ -div.throttle_notice > div { +div.throttle-notice > div { display: grid; align-items: center; background-color: #efefef; @@ -487,29 +487,29 @@ div.throttle_notice > div { font-weight: bold; } -div.throttle_notice > div.error { +div.throttle-notice > div.error { background-color: var(--danger); background-image: url("icons/error.svg"); color: #fff; align-items: center; } -div.throttle_notice > div.warning { +div.throttle-notice > div.warning { background-color: var(--warning); background-image: url("icons/warning.svg"); align-items: center; } -div.throttle_notice > div > span.message { - padding-left: 3rem; +div.throttle-notice > div > span.message { + padding-left: 3rem; } -div.throttle_notice > div a { +div.throttle-notice > div a { color: black; text-decoration: none; } -div.throttle_notice > div a:hover { +div.throttle-notice > div a:hover { text-decoration: underline; } diff --git a/python/web/src/templates/base.html b/python/web/src/templates/base.html index 5bca87b2e1..1bcb16e45c 100644 --- a/python/web/src/templates/base.html +++ b/python/web/src/templates/base.html @@ -73,13 +73,12 @@

-
+
{% if (env["throttle_status"]|length > 0) %} {% for category, response in env["throttle_status"] %}
Potential - instability due to: {{ response['msg'] }} + href="https://www.raspberrypi.com/documentation/computers/configuration.html#undervoltage-warning">{{ response['msg'] }}
{% endfor %} {% endif %} diff --git a/python/web/src/web.py b/python/web/src/web.py index 732ef0fe6d..a550a95c38 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -90,8 +90,7 @@ def get_env_info(): else: username = None - throttled_statuses = sys_cmd.get_throttled( - THROTTLE_NOTIFY_MODES, THROTTLE_TEST_MODES) + throttled_statuses = sys_cmd.get_throttled(THROTTLE_NOTIFY_MODES, THROTTLE_TEST_MODES) return { "running_env": sys_cmd.running_env(), @@ -111,8 +110,9 @@ def get_env_info(): "cd_suffixes": tuple(server_info["sccd"]), "rm_suffixes": tuple(server_info["scrm"]), "mo_suffixes": tuple(server_info["scmo"]), - "throttle_status": - [(s[0], ReturnCodeMapper.add_msg({"return_code":s[1]})) for s in throttled_statuses], + "throttle_status": [ + (s[0], ReturnCodeMapper.add_msg({"return_code": s[1]})) for s in throttled_statuses + ], } diff --git a/python/web/tests/api/test_settings.py b/python/web/tests/api/test_settings.py index 1c51205a76..3875fd9eb2 100644 --- a/python/web/tests/api/test_settings.py +++ b/python/web/tests/api/test_settings.py @@ -286,12 +286,3 @@ def test_rename_system(env, http_client): response_data = response.json() assert response_data["data"]["system_name"] == old_name - - -def test_throttle_notification(http_client): - response = http_client.get("/") - response_data = response.json() - - assert response.status_code == 200 - assert response_data["status"] == STATUS_SUCCESS - assert "Under voltage detected" in response_data["data"] From 65c1b194c511188842123091c55918add5c499be Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sun, 24 Sep 2023 09:30:54 -0700 Subject: [PATCH 12/12] Manage Samba and Netatalk with Webmin (#1217) * Display status of Samba/Netatalk/vsftp in the footer, with links to Webmin module * Add option to install Webmin and the netatalk2 module --- easyinstall.sh | 55 +++++++++++++++++++++++++++--- python/web/src/templates/base.html | 38 +++++++++++++++++---- python/web/src/web.py | 3 ++ 3 files changed, 84 insertions(+), 12 deletions(-) diff --git a/easyinstall.sh b/easyinstall.sh index 4a980fef6b..2f7f2cd404 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -876,6 +876,8 @@ function installMacproxy { # Installs vsftpd (FTP server) function installFtp() { + echo + echo "Installing packages..." sudo apt-get update && sudo apt-get install vsftpd --assume-yes --no-install-recommends
- {% if env["netatalk_configured"] == 1 %} - {{ _("The AppleShare server is running. No active connections.") }} + {% if env["netatalk_configured"] %} + {{ _("Mac AFP file sharing is enabled.") }} + {% if env["webmin_configured"] %} + + {{ ("Server administration") }} + + {% endif %} + {% else %} + {{ _("Mac AFP file sharing is disabled.") }} {% endif %} - {% if env["netatalk_configured"] == 2 %} - {{ _("%(value)d active AFP connection", value=(env["netatalk_configured"] - 1)) }} - {% elif env["netatalk_configured"] > 2 %} - {{ _("%(value)d active AFP connections", value=(env["netatalk_configured"] - 1)) }} +
+
+ {% if env["samba_configured"] %} + {{ _("Windows SMB file sharing is enabled.") }} + {% if env["webmin_configured"] %} + + {{ ("Server administration") }} + + {% endif %} + {% else %} + {{ _("Windows SMB file sharing is disabled.") }} + {% endif %} +
+
+ {% if env["ftp_configured"] %} + {{ _("FTP file sharing is enabled.") }} + {% else %} + {{ _("FTP file sharing is disabled.") }} {% endif %}
{% if env["macproxy_configured"] %} - {{ _("Macproxy is running at %(ip_addr)s (default port 5000)", ip_addr=env['ip_addr']) }} + {{ _("Macproxy is running at %(ip_addr)s (default port 5000)", ip_addr=env['ip_addr']) }} + {% else %} + {{ _("Macproxy is disabled.") }} {% endif %}
+
{{ _("PiSCSI software version:") }} {{ env["version"] }}
diff --git a/python/web/src/web.py b/python/web/src/web.py index a550a95c38..6829b3d427 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -106,7 +106,10 @@ def get_env_info(): "image_dir": server_info["image_dir"], "image_root_dir": Path(server_info["image_dir"]).name, "netatalk_configured": sys_cmd.running_proc("afpd"), + "samba_configured": sys_cmd.running_proc("smbd"), + "ftp_configured": sys_cmd.running_proc("vsftpd"), "macproxy_configured": sys_cmd.running_proc("macproxy"), + "webmin_configured": sys_cmd.running_proc("miniserv.pl"), "cd_suffixes": tuple(server_info["sccd"]), "rm_suffixes": tuple(server_info["scrm"]), "mo_suffixes": tuple(server_info["scmo"]),