Skip to content
Snippets Groups Projects
Verified Commit 7b035011 authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

chore: work on webtests

parent 8aa91988
No related branches found
No related tags found
No related merge requests found
watch_file ./devenv.nix ./flake.nix ./nix/scripts/update-project.nix ./nix/scripts/build.nix ./nix/scripts/init-project.nix ./nix/scripts/build-stylesheets.nix ./nix/scripts/build-and-publish.nix ./nix/scripts/deploy.nix ./nix/scripts/update-files.nix ./nix/scripts/update-changelog.nix ./nix/scripts/prepare-release.nix ./nix/scripts/run-tests.nix ./nix/scripts/run-ci-tests.nix ./nix/scripts/clean-up.nix ./nix/scripts/go-task.nix ./nix/config/common-packages.nix ./nix/packages/monster.nix
watch_file ./devenv.nix ./flake.nix ./nix/scripts/run-ci-web-tests.nix ./nix/scripts/update-project.nix ./nix/scripts/build.nix ./nix/scripts/init-project.nix ./nix/scripts/build-stylesheets.nix ./nix/scripts/run-web-tests.nix ./nix/scripts/build-and-publish.nix ./nix/scripts/deploy.nix ./nix/scripts/update-files.nix ./nix/scripts/update-changelog.nix ./nix/scripts/prepare-release.nix ./nix/scripts/run-tests.nix ./nix/scripts/run-ci-tests.nix ./nix/scripts/update-web-test.nix ./nix/scripts/clean-up.nix ./nix/scripts/go-task.nix ./nix/config/common-packages.nix ./nix/packages/monster.nix
use flake
......@@ -17,7 +17,7 @@ stages:
# - git config --global http.sslVerify "false"
after_script:
- if [ -f .env-gitlab-ci ]; then rm .env-gitlab-ci; fi
- nix develop .#gitlab --command clean-up
tests:
stage: test
......
......@@ -402,20 +402,6 @@ ls -lah
'';
scripts.build-monster-file.exec = ''
#!${pkgs.bash}/bin/bash
source ${commonFunctionsScript}
echo_section "build monster file"
if ! ${pkgs.nodejs_20}/bin/node ${config.devenv.root}/development/scripts/buildMonsterFile.mjs
then
echo_fail "script buildMonsterFile.mjs failed, check your JS!"
exit 1
fi
echo_ok "Monster file created"
'';
scripts.create-new-component-class.exec = ''
#!${pkgs.bash}/bin/bash
source ${commonFunctionsScript}
......@@ -466,396 +452,6 @@ ls -lah
sed -i -E "/id=\"lastupdate\"/s_.*_ <div id=\"lastupdate\" style='font-size:0.7em'>last update $(date)</div>_" ''${TEST_PATH}web/test.html
sed -i -E "s_src=\"([\"]*)\.js.*\"_src=\"\1.js?r=$(date +"%T")\"_" ''${TEST_PATH}web/test.html
${pkgs.xdg-utils}/bin/xdg-open ''${TEST_PATH}web/test.html
'';
scripts.publish-doc.exec = ''
#!${pkgs.bash}/bin/bash
if [ -t 1 ]; then
RED='\033[0;31m'
GREEN='\033[0;32m'
RESET='\033[0m'
BOLD='\033[1m'
else
RED=""
GREEN=""
RESET=""
fi
profileExists=$(aws configure list-profiles | grep shopcloud | wc -l)
if [ "$profileExists" -eq "0" ]; then
echo "No shopcloud profile found. Exiting."
echo "Please run: aws configure --profile=shopcloud"
exit 1
fi
if [ ! -d ${config.devenv.root}/dist/doc ]; then
echo -e "''${RED}✖ No doc found.''${RESET}"
exit 1
fi
${pkgs.awscli2}/bin/aws --profile=shopcloud s3 --recursive --only-show-errors cp ${config.devenv.root}/dist/doc/ s3://monsterjs.org/en/api/
code=$?
if [ "$code" -ne "0" ]; then
echo -e "''${RED}✖ Upload failed.''${RESET}"
exit 1
fi
echo -e "''${GREEN}✔ Upload successful.''${RESET}"
'';
scripts.build-doc.exec = ''
rm -rf ${config.devenv.root}/dist/doc
update-versions
create-polyfill
if [ -d ${config.devenv.root}/dist/doc ]; then
rm -rf ${config.devenv.root}/dist/doc
mkdir -p ${config.devenv.root}/dist/doc
fi
${config.devenv.root}/node_modules/.bin/jsdoc -c ${config.devenv.root}/doc/jsdoc.json
${pkgs.nodejs_20}/bin/node ${config.devenv.root}/development/scripts/replaceSkypack.cjs
'';
scripts.do-commit.exec = ''
#!${pkgs.bash}/bin/bash
# Define colors if the terminal supports it
if [ -t 1 ]; then
RED='\033[0;31m'
GREEN='\033[0;32m'
RESET='\033[0m'
BOLD='\033[1m'
else
RED=""
GREEN=""
RESET=""
fi
step=1
reset
clear
# create random log file
LOGFILE="$(mktemp)"
if [ $? -ne 0 ]; then
echo -e "''${RED}✖ Could not create temporary log file. Exiting.''${RESET}"
exit 1
fi
log_and_display() {
echo -e "''${GREEN}==> $step. $1''${RESET}" | tee -a $LOGFILE
step=$((step + 1))
}
log_error_and_display() {
echo -e "''${RED}==> $step. $1''${RESET}" | tee -a $LOGFILE
}
printLogfileAndExit() {
exit_code=$1
echo -e "\n\n========================================\n\n\n"
echo -e "\n\n''${BOLD}Git and GitLab Automation Script''${RESET}\n\nI have performed the following actions:\n\n"
cat "$LOGFILE"
# Optional: Remove log file
rm -f "$LOGFILE"
if [ $exit_code -eq 0 ]; then
echo -e "\n''${GREEN}✔''${RESET} All actions were successful" | tee -a $LOGFILE
elif [ $exit_code -eq -1 ]; then
echo -e "\n''${RED}✖''${RESET} The script was manually cancelled" | tee -a $LOGFILE
exit_code=0
else
echo -e "\n''${RED}✖''${RESET} Some actions failed" | tee -a $LOGFILE
fi
exit $exit_code
}
print_headline() {
local title=$1
local underline=$(printf '─%.0s' $(seq 1 ''${#title}))
echo -e "\n\n''${BOLD}''${title}\n''${underline}''${RESET}\n"
}
do_cancel() {
echo -e "''${RED}==> ✖ Cancelled.''${RESET}" | tee -a $LOGFILE
printLogfileAndExit -1
}
# Function for unified logging and display
log_action() {
if [ $? -eq 0 ]; then
echo -e " ''${GREEN}✔''${RESET} $1: Successful" | tee -a $LOGFILE
else
echo -e " ''${RED}✖''${RESET} $1: Failed" | tee -a $LOGFILE
printLogfileAndExit 1
fi
}
print_what_to_do() {
echo -e "\n\nWhat do you want to do?\n"
}
git_status=$(git status --porcelain)
if [[ -z "$git_status" ]]; then
log_error_and_display "No changes to commit. Exiting."
printLogfileAndExit 0
fi
print_headline "Choose commit type"
selection=$(gum choose "feat: (new feature for the user, not a new feature for build script)" "fix: (bug fix for the user, not a fix to a build script)" "chore: (updating grunt tasks etc.; no production code change)" "docs: (changes to the documentation)" "style: (formatting, missing semi colons, etc; no production code change)" "refactor: (refactoring production code, eg. renaming a variable)" "test: (adding missing tests, refactoring tests; no production code change)" "Cancel")
commit_type=$(echo "$selection" | awk -F':' '{print $1}')
if [[ "$commit_type" == "Cancel" ]]; then
do_cancel
fi
log_and_display "You chose the commit type: $commit_type"
# NEXT STEP ISSUE HANDLING ############################################################################################################
#log_and_display "Issue handling"
gitlabIssues=()
while IFS= read -r line; do
if [[ $line =~ ^# ]]; then
id=$(echo "$line" | awk '{print substr($1, 2)}')
title=$(echo "$line" | awk -F'about' '{print $1}' | awk '{$1=$2=""; print substr($0, 3)}')
gitlabIssues+=("$id > $title")
fi
done < <(gum spin --spinner dot --show-output --title "Ask gitlab ..." -- glab issue list --output-format=details)
## if issues are available, ask if user wants to use an existing issue or create a new one
createOption="Create new issue"
existingOption="Use existing issue"
cancelOption="Cancel"
print_headline "Choose issue handling"
if [ ''${#gitlabIssues[@]} -eq 0 ]; then
log_and_display "There are no issues available."
print_what_to_do
choice=$(gum choose "$createOption" "$cancelOption")
else
log_and_display "There are ''${#gitlabIssues[@]} issues available."
print_what_to_do
choice=$(gum choose "$createOption" "$existingOption" "$cancelOption")
fi
if [[ "$choice" == "$cancelOption" ]]; then
do_cancel
fi
## array of issue ids
work_on_issue_ids=()
issue_text=""
if [[ "$choice" == "$createOption" ]]; then
print_headline "Create new issue"
issue_text=$(gum input --placeholder "Enter issue title")
echo -e "Enter issue description. ''${RED}End with Ctrl+D''${RESET}\n"
issue_description=$(gum write --placeholder "Enter issue description. End with Ctrl+D")
if [[ -z "$issue_text" ]]; then
log_error_and_display "Issue title is empty. Exiting."
printLogfileAndExit 1
fi
log_and_display "You entered the issue title: $issue_text"
log_and_display "You entered the issue description: $issue_description"
echo -e "\n"
gum confirm "Do you want to create this issue?"
# gum confirm exits with status 0 if confirmed and status 1 if cancelled.
if [ $? -eq 1 ]; then
do_cancel
fi
issue_output=$(glab issue create -t"$issue_text" --no-editor --description "$issue_description")
issue_id=$(echo "$issue_output" | grep -oP '(?<=/issues/)\d+')
work_on_issue_ids+=("$issue_id")
log_action "glab issue with id $issue_id created"
else
print_headline "Use existing issue"
echo -e "Select issue with arrow keys and press tab or space to select. Press enter to confirm.\n"
issue_ids=$(gum choose --no-limit "''${gitlabIssues[@]}")
# assign issue_ids to work_on_issue_ids. iterate over lines and take integer from beginning of line
while IFS= read -r line; do
work_on_issue_ids+=($(echo "$line" | grep -oP '^\d+'))
done <<<"$issue_ids"
fi
if [ ''${#work_on_issue_ids[@]} -eq 0 ]; then
log_and_display "No issue selected. Exiting."
printLogfileAndExit 0
fi
# NEXT STEP COMMIT MESSAGE ############################################################################################################
# print work_on_issue_ids
work_on_issue_ids_string=""
for i in "''${work_on_issue_ids[@]}"; do
work_on_issue_ids_string+="#$i "
done
log_and_display "You chose to work on the following issues: ''${work_on_issue_ids_string}"
print_headline "Check for changes to commit"
# ' ' = unmodified
# M = modified
# T = file type changed (regular file, symbolic link or submodule)
# A = added
# D = deleted
# R = renamed
# C = copied (if config option status.renames is set to "copies")
# U = updated but unmerged
# https://man.freebsd.org/cgi/man.cgi?query=git-status&sektion=1&manpath=freebsd-release-ports
count_all_changes=$(echo "$git_status" | wc -l)
count_staged_changes=$(echo "$git_status" | grep -c '^M')
count_new_staged_files=$(echo "$git_status" | grep -c '^A')
count_staged_changes=$((count_staged_changes + count_new_staged_files))
git_options_all="All $count_all_changes changes"
git_options_staged="Only the $count_staged_changes staged changes"
git_options_select_files="Select files"
git_options_cancel="Cancel"
git_options_array=()
if [[ $count_all_changes -gt 0 ]]; then
git_options_array+=("$git_options_all")
fi
if [[ $count_staged_changes -gt 0 ]]; then
git_options_array+=("$git_options_staged")
fi
git_options_array+=( "$git_options_select_files" )
git_options_array+=( "$git_options_cancel" )
selection=$(gum choose "''${git_options_array[@]}")
if [[ "$selection" == "$git_options_cancel" ]]; then
do_cancel
fi
if [[ "$selection" == "$git_options_all" ]]; then
git add -A
echo "1"
elif [[ "$selection" == "$git_options_select_files" ]]; then
files=()
while IFS= read -r line; do
files+=("$line")
done <<<"$git_status"
selected_files=$(gum choose --no-limit "''${files[@]}")
# no files selected
if [[ -z "$selected_files" ]]; then
log_and_display "No files selected. Exiting."
printLogfileAndExit 0
fi
# add selected files
while IFS= read -r line; do
## git proclimne could have letter, ? or ! at the beginning of the line
file=$(echo "$line" | awk '{print $2}')
if [[ -z "$file" || ! -f "$file" ]]; then
log_and_display "No file found in line: $line"
continue
fi
git add "$file"
done <<<"$selected_files"
fi
## count staged changes again and print
count_staged_changes=$(echo "$git_status" | grep -c '^M')
count_new_staged_files=$(echo "$git_status" | grep -c '^A')
count_staged_changes=$((count_staged_changes + count_new_staged_files))
log_and_display "You have $count_staged_changes staged changes to commit."
# NEXT STEP COMMIT MESSAGE ############################################################################################################
print_headline "Enter commit message"
commit_message=$(gum input --placeholder "Enter commit message" --value "$commit_type: $issue_text $work_on_issue_ids_string")
if [[ -z "$commit_message" ]]; then
log_error_and_display "Commit message is empty. Exiting."
printLogfileAndExit 1
fi
log_and_display "You entered the commit message: $commit_message"
gum confirm "Do you want to commit with this message?"
if [ $? -eq 1 ]; then
do_cancel
fi
# NEXT STEP COMMIT ####################################################################################################################
print_headline "Committing changes"
if ! git commit -m "$commit_message" ; then
log_error_and_display "Commit failed. Exiting."
printLogfileAndExit 1
fi
log_and_display "Commit successful."
# NEXT STEP PUSH ######################################################################################################################
print_headline "Pushing changes"
if ! git push ; then
log_error_and_display "Push failed. Exiting."
printLogfileAndExit 1
fi
log_and_display "Push successful."
# Close issue ######################################################################################################################
print_headline "Closing issues"
for issue_id in "''${work_on_issue_ids[@]}"; do
gum confirm "Do you want to close issue #$issue_id?"
if [ $? -eq 1 ]; then
continue
fi
if ! glab issue close "$issue_id" ; then
log_error_and_display "Closing issue $issue_id failed. Exiting."
else
log_and_display "Closing issue $issue_id successful."
fi
done
printLogfileAndExit 0
'';
}
......@@ -107,15 +107,17 @@
ciJobToken = builtins.getEnv "CI_JOB_TOKEN";
script-run-ci-tests = pkgs'.callPackage ./nix/scripts/run-ci-tests.nix {};
script-run-ci-web-tests = pkgs'.callPackage ./nix/scripts/run-ci-web-tests.nix {};
script-script-clean-up = pkgs'.callPackage ./nix/scripts/clean-up.nix {};
gitlabPackages = with pkgs'; [
nodejs_21
git
google-fonts
open-sans
roboto
script-run-ci-tests
script-run-ci-web-tests
roboto
script-clean-up
];
in
pkgs'.mkShell {
......@@ -129,7 +131,7 @@
cd ''${CI_PROJECT_DIR} || exit 1
## chrome should not use bus address
unset DBUS_SESSION_BUS_ADDRESS
##unset DBUS_SESSION_BUS_ADDRESS
'';
};
......
......@@ -33,5 +33,4 @@ with pkgs'; [
vhs
wget
zlib
]
{
pkgs,
commonScript,
...
}:
{pkgs, ...}:
pkgs.writeShellScriptBin "clean-up" ''
${commonScript}
echo_header "Cleaning up"
echo "Cleaning up"
echo_step "Removing credentials"
echo "Removing credentials"
${pkgs.git}/bin/git config --global --unset credential.helper
if [ -f /root/.docker/config.json ]; then rm /root/.docker/config.json; fi
if [ -f /root/.docker/config.json ]; then ${pkgs.coreutils}/bin/rm /root/.docker/config.json; fi
if [ -f .env-gitlab-ci ]; then ${pkgs.coreutils}/bin/rm .env-gitlab-ci; fi
echo_ok "Cleaned up"
echo "Cleaned up"
''
......@@ -8,6 +8,7 @@
script-init-project = pkgs.callPackage ./init-project.nix {inherit commonScript versionBin;};
script-build-stylesheets = pkgs.callPackage ./build-stylesheets.nix {inherit commonScript versionBin;};
script-build-and-publish = pkgs.callPackage ./build-and-publish.nix {inherit commonScript versionBin;};
script-update-web-test = pkgs.callPackage ./update-web-test.nix {inherit commonScript;};
script-run-tests = pkgs.callPackage ./run-tests.nix {inherit commonScript;};
script-run-web-tests = pkgs.callPackage ./run-web-tests.nix {inherit commonScript;};
......@@ -43,6 +44,16 @@
- ${script-update-project}/bin/update-project
silent: true
update-web-test:
desc: Update the web test
aliases:
- uwt
env:
USER_WORKING_DIR: "{{.USER_WORKING_DIR}}"
cmds:
- ${script-update-web-test}/bin/update-web-test
silent: true
init-project:
desc: Initialize the project and install dependencies
aliases:
......
......@@ -2,7 +2,8 @@
pkgs,
lib,
...
}: pkgs.writeShellScriptBin "run-ci-tests" ''
}:
pkgs.writeShellScriptBin "run-ci-tests" ''
echo "run ci tests"
if [ -z "''${CI_JOB_TOKEN}" ]; then
......
......@@ -4,7 +4,6 @@
commonScript,
...
}: let
importJSScript = pkgs.writeTextFile {
name = "import.mjs";
text = ''
......
{
pkgs,
commonScript,
...
}: let
packageData = builtins.fromJSON (builtins.readFile ../../package.json);
version = packageData.version;
lib = pkgs.lib;
# root = ../..;
# gitignore = ../../.gitignore;
# source = ../../source;
# test = ../../test;
#
# releasedPackageJson = {
# description = packageData.description;
# name = packageData.name;
# version = version;
# dependencies = packageData.dependencies;
# keywords = packageData.keywords;
# license = packageData.license;
# repository = packageData.repository;
# author = packageData.author;
# homepage = packageData.homepage;
# type = "module";
# main = "source/monster.mjs";
# module = "source/monster.mjs";
# };
in
pkgs.writeShellScriptBin "update-web-test" ''
source ${commonScript}
echo_section "Checking code"
echo_hint "This script will check the code for formatting and linting issues"
echo_hint "The command is executed in the current working directory and not in a nix derivation."
cd_working_dir
set -x
echo_step "Running prettier"
PROJECT_ROOT="$(pwd)"
TEST_PATH="''${PROJECT_ROOT}/test/"
TEST_CASES_PATH="''${TEST_PATH}cases/"
TEST_WEB_PATH="''${TEST_PATH}web/"
SOURCE_PATH="''${PROJECT_ROOT}/source/"
${pkgs.gnused}/bin/sed -i -E "s_(\"[0-9]+\.[0-9]+\.[0-9]+\")_\"${version}\"_g" "''${SOURCE_PATH}/types/version.mjs"
${pkgs.gnused}/bin/sed -i -E "s_(\"[0-9]+\.[0-9]+\.[0-9]+\")_\"${version}\"_g" "''${TEST_CASES_PATH}/monster.mjs"
echo_step "Create polyfill service URL"
TMPDIR=$(${pkgs.mktemp}/bin/mktemp -d)
if [ $? -ne 0 ]
then
echo_fail "ERROR: mktemp failed"
exit 1
fi
if [ -z "$TEMP" ]; then
TEMP="/tmp"
fi
if ! ${pkgs.esbuild}/bin/esbuild --platform=browser --bundle ''${SOURCE_PATH}/monster.mjs --outfile=''${TMPDIR}/monster.js
then
echo_fail "ERROR: esbuild failed, check your JS!"
exit 1
fi
url="$(${pkgs.nodejs_21}/bin/npx create-polyfill-service-url analyse --cwd="''${TMPDIR}" --file=monster.js)"
${pkgs.coreutils}/bin/rm ''${TMPDIR}/monster.js
${pkgs.coreutils}/bin/rm -rf ''${TMPDIR}/js*
${pkgs.coreutils}/bin/rmdir ''${TMPDIR}
if [ ! -x {$url} ]
then
${pkgs.gnused}/bin/sed -i -E "/id=\"polyfill\"/s|.*| <script id=\"polyfill\" src=\"''${url}\"|g" ''${TEST_WEB_PATH}/test.html
${pkgs.gnused}/bin/sed -i -E "/id=\"polyfill\"/s|.*|<script id=\"polyfill\" src=\"''${url}\"|g" ''${PROJECT_ROOT}/README.md
fi
${pkgs.findutils}/bin/find ''${TEST_CASES_PATH} -type f | sed "s|^$TEST_CASES_PATH||" > ''${TEST_WEB_PATH}/import.js
${pkgs.gnused}/bin/sed -i 's|^|import "../cases/|' ''${TEST_WEB_PATH}/import.js
${pkgs.gnused}/bin/sed -i 's|$|";|' ''${TEST_WEB_PATH}/import.js
${pkgs.gnused}/bin/sed -i "1 i import \"./prepare.js\";" ''${TEST_WEB_PATH}/import.js
${pkgs.gnused}/bin/sed -i "1 i /** this file was created automatically by the run-web-tests script */" ''${TEST_WEB_PATH}/import.js
if ! ${pkgs.nodejs_21}/bin/npx esbuild --platform=browser --sourcemap=inline --external:ws \
--external:jsdom --external:fs --external:process --external:crypto --bundle ''${TEST_WEB_PATH}/import.js --outfile=''${TEST_WEB_PATH}/tests.js
then
echo "ERROR: esbuild failed, check your JS!"
exit 1
fi
${pkgs.gnused}/bin/sed -i '1s/^/try {\n/' ''${TEST_PATH}web/tests.js
echo "} catch (e) {" >> ''${TEST_PATH}web/tests.js
echo "document.getElementById('mocha-errors').insertAdjacentHTML('afterbegin', e );" >> ''${TEST_WEB_PATH}/tests.js
echo "document.getElementById('mocha-stats').style.backgroundColor = 'red';" >> ''${TEST_WEB_PATH}/tests.js
echo "}" >> ''${TEST_WEB_PATH}/tests.js
${pkgs.gnused}/bin/sed -i -E "/<h1/s_.*_ <h1 style='margin-bottom: 0.1em;'>Monster ${version}</h1>_" ''${TEST_WEB_PATH}/test.html
${pkgs.gnused}/bin/sed -i -E "/id=\"lastupdate\"/s_.*_ <div id=\"lastupdate\" style='font-size:0.7em'>last update $(date)</div>_" ''${TEST_WEB_PATH}/test.html
${pkgs.gnused}/bin/sed -i -E "s_src=\"([\"]*)\.js.*\"_src=\"\1.js?r=$(date +"%T")\"_" ''${TEST_WEB_PATH}/test.html
echo_ok "Webtest is updated"
''
......@@ -651,7 +651,7 @@ function transform(value) {
try {
locale = getLocaleOfDocument();
return date.toLocaleTimeString(locale.toString(), {
hour12: false
hour12: false,
});
} catch (e) {
throw new Error(`unsupported locale or missing format (${e.message})`);
......@@ -666,7 +666,7 @@ function transform(value) {
const options = {
dateStyle: "medium",
timeStyle: "medium",
hour12: false
hour12: false,
};
if (args.length > 0) {
......@@ -693,7 +693,7 @@ function transform(value) {
try {
locale = getLocaleOfDocument();
return date.toLocaleString(locale.toString(), {
hour12: false
hour12: false,
});
} catch (e) {
throw new Error(`unsupported locale or missing format (${e.message})`);
......@@ -707,11 +707,10 @@ function transform(value) {
try {
locale = getLocaleOfDocument();
return date.toLocaleDateString(locale.toString(),
{
return date.toLocaleDateString(locale.toString(), {
year: "numeric",
month: "2-digit",
day: "2-digit"
day: "2-digit",
});
} catch (e) {
throw new Error(`unsupported locale or missing format (${e.message})`);
......
/** this file was created automatically by the run-web-tests script */
import "./prepare.js";
import "../cases/components/layout/tabs.mjs";
import "../cases/components/layout/slit-screen.mjs";
import "../cases/components/layout/slit-panel.mjs";
import "../cases/components/layout/panel.mjs";
import "../cases/components/form/reload.mjs";
import "../cases/components/form/state-button.mjs";
import "../cases/components/form/select.mjs";
......
......@@ -15,8 +15,8 @@
</head>
<body>
<div id="headline" style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
<h1 style='margin-bottom: 0.1em;'>Monster 3.63.0</h1>
<div id="lastupdate" style='font-size:0.7em'>last update Mi 27. Mär 12:32:39 CET 2024</div>
<h1 style='margin-bottom: 0.1em;'>Monster 3.65.0</h1>
<div id="lastupdate" style='font-size:0.7em'>last update Mi 15. Mai 23:43:52 CEST 2024</div>
</div>
<div id="mocha-errors"
style="color: red;font-weight: bold;display: flex;align-items: center;justify-content: center;flex-direction: column;margin:20px;"></div>
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment