diff --git a/.gitignore b/.gitignore index fb7530896..ed502f847 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ dist* node_modules/ assets/icons +assets/favicons bin/ *.hi *.o @@ -16,6 +17,7 @@ cabal-dev/ .dev-port-http .dev-port-https .bash_history +.lesshst yesod-devel/ .cabal-sandbox cabal.sandbox.config @@ -60,4 +62,4 @@ tunnel.log **/result **/result-* .develop.cmd -/.vscode \ No newline at end of file +/.vscode diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f101eb7fc..c53b81cf1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -60,11 +60,18 @@ setup:dynamic: before_script: - apt-get -y update - apt-get -y install git + variables: + GIT_DEPTH: 99999 + GIT_STRATEGY: clone + GIT_LOG_COMMAND: 'git log --max-count=1 --date=format:%Y-%m-%dT%H-%M --pretty=format:%cd' script: - - FRONTEND_IMAGE_VERSION=`git log ${FRONTEND_IMAGE_DEPENDENCIES} | grep '^commit' | wc --lines | tee frontend-image-version` - - BACKEND_IMAGE_VERSION=`git log ${BACKEND_IMAGE_DEPENDENCIES} | grep '^commit' | wc --lines | tee backend-image-version` + - echo "${FRONTEND_IMAGE_DEPENDENCIES}" + - echo "${BACKEND_IMAGE_DEPENDENCIES}" + - FRONTEND_IMAGE_VERSION=`${GIT_LOG_COMMAND} ${FRONTEND_IMAGE_DEPENDENCIES} | tee frontend-image-version` + - BACKEND_IMAGE_VERSION=`${GIT_LOG_COMMAND} ${BACKEND_IMAGE_DEPENDENCIES} | tee backend-image-version` + - 'echo "FRONTEND_IMAGE_VERSION: ${FRONTEND_IMAGE_VERSION}, BACKEND_IMAGE_VERSION: ${BACKEND_IMAGE_VERSION}"' - cat .gitlab-ci/frontend.yml | .gitlab-ci/dynamci.pl FRONTEND_IMAGE_VERSION=${FRONTEND_IMAGE_VERSION} > frontend.yml - - cat .gitlab-ci/backend.yml | .gitlab-ci/dynamci.pl BACKEND_IMAGE_VERSION=${BACKEND_IMAGE_VERSION} > backend.yml + - cat .gitlab-ci/backend.yml | .gitlab-ci/dynamci.pl BACKEND_IMAGE_VERSION=${BACKEND_IMAGE_VERSION} PARENT_PIPELINE_ID=${CI_PIPELINE_ID} > backend.yml artifacts: paths: - frontend-image-version @@ -83,17 +90,18 @@ setup:containers:frontend: &setup-container IMAGE_TYPE: frontend before_script: &container-before - IMAGE_VERSION=`cat ${IMAGE_TYPE}-image-version` - - IMAGE_TAG=${IMAGE_TYPE}/${CI_COMMIT_REF_SLUG}:${IMAGE_VERSION} - - REGISTRY_DESTINATION=${CI_REGISTRY_IMAGE}/${IMAGE_TYPE}/${CI_COMMIT_REF_SLUG}:${IMAGE_VERSION} + - IMAGE_TAG=${CI_COMMIT_REF_SLUG}/${IMAGE_TYPE}:${IMAGE_VERSION} + - REGISTRY_DESTINATION=${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/${IMAGE_TYPE}:${IMAGE_VERSION} script: - curl --request GET --header "PRIVATE-TOKEN:${REGISTRY_AUTH_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories?tags=true" > .gitlab-ci/.container-registry-contents.json - - IMAGE_EXISTS=`grep \""${REGISTRY_DESTINATION}"\" .gitlab-ci/.container-registry-contents.json` - cat .gitlab-ci/.container-registry-contents.json + - IMAGE_EXISTS=`grep \""${REGISTRY_DESTINATION}"\" .gitlab-ci/.container-registry-contents.json || :` + - echo "${IMAGE_EXISTS}" - test "${CI_JOB_MANUAL}" = true && echo "Force rebuilding container." - > if [ -z "${IMAGE_EXISTS}" -o "${CI_JOB_MANUAL}" = true ] ; then - echo "Building image..." - buildah bud -t ${IMAGE_TAG} --build-arg PROJECT_DIR=${CI_PROJECT_DIR} --volume ${CI_PROJECT_DIR}:/tmp/${CI_PROJECT_DIR} --file docker/${IMAGE_TYPE}/Dockerfile + echo "Building image ${REGISTRY_DESTINATION}..." + buildah bud -t ${IMAGE_TAG} --build-arg PROJECT_DIR=${CI_PROJECT_DIR} --build-arg MOUNT_DIR=/mnt/${CI_PROJECT_DIR} --volume ${CI_PROJECT_DIR}:/mnt/${CI_PROJECT_DIR} --file docker/${IMAGE_TYPE}/Dockerfile buildah push --creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" ${IMAGE_TAG} ${REGISTRY_DESTINATION} else echo "Image ${IMAGE_TAG} already exists in the container registry. Skipping build." @@ -107,6 +115,9 @@ setup:containers:frontend:wait: &setup-container-wait needs: - setup:dynamic before_script: *container-before + variables: + GIT_STRATEGY: none + IMAGE_TYPE: frontend script: - apt-get -y update && apt-get -y install curl - > @@ -114,10 +125,14 @@ setup:containers:frontend:wait: &setup-container-wait echo "Waiting for container ${IMAGE_TAG} to appear in the container registry..." sleep 5 done + - echo "Image ${IMAGE_TAG} has been found in the container registry. Proceeding with the pipeline." rules: - if: $CI_MERGE_REQUEST_ID when: always - when: never + retry: 0 + interruptible: true + timeout: 3h setup:containers:backend: <<: *setup-container @@ -126,6 +141,7 @@ setup:containers:backend: setup:containers:backend:wait: <<: *setup-container-wait variables: + GIT_STRATEGY: none IMAGE_TYPE: backend diff --git a/.gitlab-ci/backend.yml b/.gitlab-ci/backend.yml index a37752bf0..beb349b68 100644 --- a/.gitlab-ci/backend.yml +++ b/.gitlab-ci/backend.yml @@ -13,6 +13,7 @@ variables: BACKEND_IMAGE_VERSION: #dyn# + PARENT_PIPELINE_ID: #dyn# stages: - compile @@ -22,10 +23,13 @@ stages: default: image: - name: ${CI_REGISTRY_IMAGE}/backend/${CI_COMMIT_REF_SLUG}:${BACKEND_IMAGE_VERSION} + name: ${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/backend:${BACKEND_IMAGE_VERSION} entrypoint: [""] docker: platform: x86_64 + before_script: + - ./.gitlab-ci/pull-frontend-artifacts.pl "${REGISTRY_AUTH_TOKEN}" "${PARENT_PIPELINE_ID}" + - unzip ./.artifacts.tmp/artifacts.zip artifacts: name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}" expire_in: "1 day" @@ -36,7 +40,7 @@ default: compile: stage: compile script: - - make -- backend-build${PROD_BUILD} + - make -- compile${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true artifacts: paths: - ${CI_PROJECT_DIR}/.stack-work/ @@ -46,7 +50,7 @@ compile: lint: stage: lint script: - - make -- backend-lint${PROD_BUILD} + - make -- lint${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true cache: *backend-cache test: @@ -54,7 +58,7 @@ test: needs: - compile script: - - make -- backend-test${PROD_BUILD} + - make -- test${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true cache: *backend-cache container: @@ -69,4 +73,5 @@ container: - buildah bud -t ${IMAGE_TAG} --volume ${CI_PROJECT_DIR}/bin/:/tmp/uniworx-bin --file docker/fradrive/Dockerfile - buildah push --creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" ${IMAGE_TAG} ${CI_REGISTRY_IMAGE}/${IMAGE_TAG} rules: - - if: ${PROD_BUILD} == -prod \ No newline at end of file + - if: '"${PROD_BUILD}" == "-prod"' + when: always \ No newline at end of file diff --git a/.gitlab-ci/frontend.yml b/.gitlab-ci/frontend.yml index b212a211c..16ed66c79 100644 --- a/.gitlab-ci/frontend.yml +++ b/.gitlab-ci/frontend.yml @@ -21,7 +21,7 @@ stages: default: image: - name: ${CI_REGISTRY_IMAGE}/frontend/${CI_COMMIT_REF_SLUG}:${FRONTEND_IMAGE_VERSION} + name: ${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/frontend:${FRONTEND_IMAGE_VERSION} entrypoint: [""] docker: platform: x86_64 @@ -35,11 +35,12 @@ default: compile: stage: compile script: - - make -- frontend-build + - make -- compile-frontend IN_CI=true IN_CONTAINER=true artifacts: paths: - ${CI_PROJECT_DIR}/node_modules - ${CI_PROJECT_DIR}/well-known + - ${CI_PROJECT_DIR}/config/webpack.yml cache: - &frontend-cache key: default-frontend @@ -50,7 +51,7 @@ compile: lint: stage: lint script: - - make -- frontend-lint + - make -- lint-frontend IN_CI=true IN_CONTAINER=true cache: *frontend-cache test: @@ -58,5 +59,5 @@ test: needs: - compile script: - - make -- frontend-test + - make -- test-frontend IN_CI=true IN_CONTAINER=true cache: *frontend-cache diff --git a/.gitlab-ci/pull-frontend-artifacts.pl b/.gitlab-ci/pull-frontend-artifacts.pl new file mode 100755 index 000000000..8c6c9e457 --- /dev/null +++ b/.gitlab-ci/pull-frontend-artifacts.pl @@ -0,0 +1,52 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +my $dir = ".artifacts.tmp"; +my ($token, $id) = @ARGV; +die "usage: $0 [token] [id]" unless defined $token and defined $id; +die "id in bad format" unless $id=~m#^[0-9]+$#; + +if(!-d $dir) { + mkdir($dir) or die "Cannot create directory '$dir', because: $!\n"; +} + +system(qq(curl --globoff --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/pipelines/$id/bridges" > $dir/bridges)); +my $pips = pparse("$dir/bridges", {id=>qq#."downstream_pipeline"."id"#}, {name=>""}); + +my $fe = $pips->{frontend}{id}; + +die "No frontend pipeline found!" unless $fe; + +system(qq(curl --globoff --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/pipelines/$fe/jobs" > $dir/fe-jobs)); +my $arte = pparse("$dir/fe-jobs", {id=>""}, {name=>"", web_url=>"", artifacts=>""}); + +system(qq#curl --output $dir/artifacts.zip --location --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/jobs/$arte->{compile}{id}/artifacts"#); + + +sub pparse { + my ($file, $numerical, $alpha) = @_; + my %all = (); + for my $k(keys %$numerical) { + $all{$k} = $numerical->{$k} || qq#."$k"#; + } + for my $k(keys %$alpha) { + $all{$k} = $alpha->{$k} || qq#."$k"#; + } + my $select = join ', ', map {qq#"$_": $all{$_}#} sort keys %all; + my $cont = qx(cat $file | jq -c '.[] | {$select}'); + my @cont = split m/\R/, $cont; + my %ret = (); + for my $c(@cont) { + my %block = (); + for(keys %$numerical) { + $block{$_} = $1 if $c=~m#"$_":([0-9]+)#; + } + for(keys %$alpha) { + $block{$_} = $1 if $c=~m#"$_":"([^"]*)"#; + } + $ret{$block{name}} =\%block; + } + return \%ret +} \ No newline at end of file diff --git a/Makefile b/Makefile index 0d46d3812..2d87f724d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ SHELL=bash export CONTAINER_COMMAND ?= podman +export CONTAINER_INTERACTIVE +export CONTAINER_PORTS export IN_CONTAINER ?= false export IN_CI ?= false export WATCH @@ -21,9 +23,14 @@ all: .PHONY: clean clean: - rm -rf node_modules .npm .cache assets/icons well-known static/ + rm -rf node_modules .npm .cache assets/icons assets/favicons static well-known rm -rf .stack .stack-work .stack-work-build .stack-work-run .stack-work-test .stack-work-doc - rm -rf bin/ + rm -rf bin/ .Dockerfile .dev-port-http .dev-port-https +.PHONY: clean-all +clean-all: clean + $(CONTAINER_COMMAND) system prune --all --force --volumes + $(CONTAINER_COMMAND) image prune --all --force + $(CONTAINER_COMMAND) volume prune --force .PHONY: release release: @@ -34,6 +41,13 @@ release: git commit -m "chore(release): ${VERSION}" git push +.PHONY: %-shell +%-shell: + MOUNT_DIR=/mnt/fradrive ; \ + FRADRIVE_SERVICE=$* ; \ + $(MAKE) -- --image-build FRADRIVE_SERVICE=$${FRADRIVE_SERVICE} ; \ + $(CONTAINER_COMMAND) run -it -v $(PWD):$${MOUNT_DIR} $(CONTAINER_PORTS) --env IN_CONTAINER=true --entrypoint /bin/bash --name fradrive.$${FRADRIVE_SERVICE}.interactive.$$(date +'%Y-%m-%dT%H-%M-%S') fradrive/$${FRADRIVE_SERVICE} + ##### GENERAL TARGETS ##### ########################### @@ -42,6 +56,7 @@ release: ##### UNIFIED FRONTEND/BACKEND TARGETS ##### .PHONY: serve +serve: CONTAINER_INTERACTIVE=-it serve: $(MAKE) serve-database & $(MAKE) serve-frontend & @@ -74,9 +89,14 @@ test: test-frontend test-backend i18n-check --compile-frontend: --frontend-dependencies npx -- webpack --progress $(WATCH) -.PHONY: --serve-frontend ---serve-frontend: WATCH=--watch ---serve-frontend: --compile-frontend; +.PHONY: serve-frontend +serve-frontend: CONTAINER_INTERACTIVE=-it +serve-frontend: + $(MAKE) -- --containerized---compile-frontend WATCH=--watch + +# .PHONY: --serve-frontend +# --serve-frontend: WATCH=--watch +# --serve-frontend: --compile-frontend; .PHONY: --lint-frontend --lint-frontend: eslint.config.js @@ -97,17 +117,15 @@ node_modules: package.json package-lock.json package-lock.json: package.json npm install --cache .npm --prefer-offline -assets: node_modules +assets: assets/favicons assets/icons +assets/favicons: + ./utils/faviconize.pl assets/favicon.svg long assets/favicons +assets/icons: node_modules ./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/solid utils/rename-fa.json assets/icons/fradrive ./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/regular utils/rename-fa.json assets/icons/fradrive -assets/.assets: -# no-op target -well-known: node_modules assets well-known/.well-known +well-known: node_modules assets npx webpack --progress - touch well-known/.well-known -well-known/.well-known: -# no-op target ##### FRONTEND TARGETS ##### ############################ @@ -135,14 +153,15 @@ well-known/.well-known: --%-prod-backend: --image-build --containerized-%-backend; .PHONY: serve-backend +serve-backend: CONTAINER_INTERACTIVE=-it serve-backend: - DEV_PORT_HTTP=`docker/backend/dev_port.pl 3000 | tee .dev-port-http` \ - DEV_PORT_HTTPS=`docker/backend/dev_port.pl 3443 | tee .dev-port-https` \ + DEV_PORT_HTTP=`docker/backend/dev_port.pl 3000 | tee .dev-port-http`; \ + DEV_PORT_HTTPS=`docker/backend/dev_port.pl 3443 | tee .dev-port-https`; \ $(MAKE) -- --containerized---serve-dev-backend DEV_PORT_HTTP=$${DEV_PORT_HTTP} DEV_PORT_HTTPS=$${DEV_PORT_HTTPS} .PHONY: --serve-dev-backend --serve-dev-backend: start.sh - DEV_PORT_HTTP=`cat .dev-port-http` \ - DEV_PORT_HTTPS=`cat .dev-port-https` \ + DEV_PORT_HTTP=`cat .dev-port-http`; \ + DEV_PORT_HTTPS=`cat .dev-port-https`; \ ./start.sh .PHONY: --compile-backend @@ -159,23 +178,31 @@ serve-backend: # TODO: maybe deprecated .PHONY: database -database: .stack .stack-work.lock compile-backend-prod +database: .stack compile-backend-prod export SERVER_SESSION_ACID_FALLBACK=$${SERVER_SESSION_ACID_FALLBACK:-true} export AVSPASS=$${AVSPASS:-nopasswordset} stack exec uniworxdb -- $(db) .PHONY: serve-database +serve-database: CONTAINER_INTERACTIVE=-it serve-database: --containerized-database -.PHONY: .stack +.PHONY: database-% +database-%: + @echo "This target, intended to fill, clear, migrate, ... the database using uniworxdb from inside the backend container is yet to be implemented" + exit 1 + +# .PHONY: .stack .stack: stack.yaml stack.yaml.lock .stack: $(MAKE) -- --image-run---.stack +.PHONY: --.stack --.stack: stack.yaml stack.yaml.lock stack build --fast --only-dependencies $(stackopts) -.stack-work.lock: - [ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || : +# TODO: deprecated, remove +# .stack-work.lock: +# [ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || : ##### BACKEND TARGETS ##### ########################### @@ -186,9 +213,11 @@ serve-database: --containerized-database .PHONY: --containerized-database --containerized-database: FRADRIVE_SERVICE=database +# port forwarding is disabled in --network=host mode; nevertheless it is stated here for documentation reasons +--containerized-database: CONTAINER_PORTS=-p 5432:5432/tcp --containerized-database: --image-build if [ "$(IN_CONTAINER)" == "false" ] ; then \ - $(CONTAINER_COMMAND) run fradrive/$(FRADRIVE_SERVICE) ; \ + $(CONTAINER_COMMAND) run -it $(CONTAINER_PORTS) --name fradrive.$(FRADRIVE_SERVICE).$$(date +'%Y-%m-%dT%H-%M-%S') fradrive/$(FRADRIVE_SERVICE) ; \ fi .PHONY: --containerized-%-frontend @@ -200,8 +229,9 @@ serve-database: --containerized-database .PHONY: --containerized-%-backend --containerized-%-backend: FRADRIVE_SERVICE=backend #--containerized-%-backend: --image-build --image-run-%-backend; +--containerized-%-backend: CONTAINER_PORTS=-p 127.0.0.1:$(DEV_PORT_HTTP):3000/tcp -p 127.0.0.1:$(DEV_PORT_HTTPS):3443/tcp --containerized-%-backend: --image-build - $(MAKE) -- --image-run-$*-backend + $(MAKE) -- --image-run-$*-backend .PHONY: image-rebuild image-rebuild-%: @@ -225,7 +255,7 @@ image-rebuild-%: if [ "$(IN_CONTAINER)" == "true" ] ; then \ $(MAKE) -- $* ; \ else \ - $(CONTAINER_COMMAND) run -v $(PWD):$${MOUNT_DIR} --env IN_CONTAINER=true --env FRADRIVE_MAKE_TARGET=$* fradrive/$(FRADRIVE_SERVICE) ; \ + $(CONTAINER_COMMAND) run $(CONTAINER_INTERACTIVE) -v $(PWD):$${MOUNT_DIR} $(CONTAINER_PORTS) --env IN_CONTAINER=true --env FRADRIVE_MAKE_TARGET=$* --env WATCH=$(WATCH) --name fradrive.$(FRADRIVE_SERVICE).$$(date +'%Y-%m-%dT%H-%M-%S') fradrive/$(FRADRIVE_SERVICE) ; \ fi ##### CONTAINER TARGETS ##### diff --git a/assets/apple-icon-180x180.png b/assets/apple-icon-180x180.png deleted file mode 100644 index 7616ebd51..000000000 Binary files a/assets/apple-icon-180x180.png and /dev/null differ diff --git a/assets/apple-icon-180x180.png.license b/assets/apple-icon-180x180.png.license deleted file mode 100644 index dfb358d6a..000000000 --- a/assets/apple-icon-180x180.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2022 Fraport AG - -SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design diff --git a/assets/favicon.ico b/assets/favicon.ico deleted file mode 100644 index 8d3db0787..000000000 Binary files a/assets/favicon.ico and /dev/null differ diff --git a/assets/favicon.ico.license b/assets/favicon.ico.license deleted file mode 100644 index dfb358d6a..000000000 --- a/assets/favicon.ico.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2022 Fraport AG - -SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design diff --git a/assets/favicon.svg.license b/assets/favicon.svg.license deleted file mode 100644 index dfb358d6a..000000000 --- a/assets/favicon.svg.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2022 Fraport AG - -SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design diff --git a/assets/manifest.webmanifest b/assets/manifest.webmanifest deleted file mode 100644 index 013d4a6a5..000000000 --- a/assets/manifest.webmanifest +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "App", - "icons": [ - { - "src": "\/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "\/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "\/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "\/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "\/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "\/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} \ No newline at end of file diff --git a/assets/manifest.webmanifest.license b/assets/manifest.webmanifest.license deleted file mode 100644 index e7b3ee229..000000000 --- a/assets/manifest.webmanifest.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2022 Steffen Jost - -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/compose.yaml b/compose.yaml index 5fa1e5191..4aca9a548 100644 --- a/compose.yaml +++ b/compose.yaml @@ -19,6 +19,7 @@ services: - *fradrive-mnt depends_on: - frontend + stdin_open: true database: # image: registry.uniworx.de/fradrive/fradrive/database # pull_policy: if_not_present diff --git a/config/favicon.json b/config/favicon.json deleted file mode 100644 index 029319487..000000000 --- a/config/favicon.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "masterPicture": "assets/favicon.svg", - "design": { - "desktop_browser": {}, - "ios": { - "picture_aspect": "background_and_margin", - "margin": "5%", - "background_color": "#ffffff", - "startup_image": { - "background_color": "#ffffff" - }, - "app_name": "FRADrive", - "assets": { - "ios6_and_prior_icons": false, - "ios7_and_later_icons": true, - "precomposed_icons": true, - "declare_only_default_icon": true - } - }, - "windows": { - "picture_aspect": "white_silhouette", - "background_color": "#0a9342", - "app_name": "FRADrive" - }, - "firefox_app": { - "picture_aspect": "circle", - "keep_picture_in_circle": false, - "circle_inner_margin": "5%", - "background_color": "#ffffff", - "overlay": false, - "manifest": { - "app_name": "FRADrive", - "app_description": { - "_i18n": true, - "de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem", - "en-eu": "A web based training management system" - }, - "developer_name": "Uni2work-Team", - "developer_url": "https://uni2work.ifi.lmu.de/info", - "display": "browser", - "start_url": "/" - } - }, - "android_chrome": { - "picture_aspect": "shadow", - "manifest": { - "name": "FRADrive", - "display": "browser", - "orientation": "portrait", - "start_url": "/" - }, - "assets": { - "legacy_icon": true, - "low_resolution_icons": false - } - }, - "safari_pinned_tab": { - "picture_aspect": "silhouette", - "theme_color": "#0a9342" - }, - "coast": { - "picture_aspect": "background_and_margin", - "background_color": "#ffffff", - "margin": "10%" - }, - "open_graph": { - "picture_aspect": "background_and_margin", - "background_color": "#ffffff", - "margin": "10%", - "ratio": "square" - } - }, - "settings": { - "html_code_file": true - } -} diff --git a/config/favicon.json.license b/config/favicon.json.license deleted file mode 100644 index a0992def9..000000000 --- a/config/favicon.json.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2022 Gregor Kleen ,Steffen Jost - -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/config/i18n.json b/config/i18n.json new file mode 100644 index 000000000..26938eb86 --- /dev/null +++ b/config/i18n.json @@ -0,0 +1,5 @@ +{ + "_i18n": true, + "de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem", + "en-eu": "A web-based training management system" +} \ No newline at end of file diff --git a/config/settings.yml b/config/settings.yml index 602c9c0e2..f9a1ae1d8 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -123,7 +123,7 @@ auth-pw-hash: database: user: "_env:PGUSER:uniworx" password: "_env:PGPASS:uniworx" - host: "_env:PGHOST:127.0.0.1" + host: "_env:PGHOST:host.docker.internal" port: "_env:PGPORT:5432" # See config/test-settings.yml for an override during tests database: "_env:PGDATABASE:uniworx" diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index 3f688472f..77cbc6fe6 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.uniworx.de/uniworx/containers/debian:12.5 +FROM debian:12.5 RUN apt-get -y update && apt-get -y install haskell-stack git RUN apt-get -y update && apt-get -y install alex g++ happy libghc-zlib-dev libpq-dev libsodium-dev locales locales-all pkg-config @@ -12,19 +12,20 @@ ENV LANG=en_US.UTF-8 # in CI-pipelines these two should be different, so that the container caches the compilation results. ARG MOUNT_DIR=/mnt/fradrive ARG PROJECT_DIR=/fradrive -RUN mkdir -p ${PROJECT_DIR} -RUN if [ "${PROJECT_DIR}" != "${MOUNT_DIR}" ] ; then cp -r ${MOUNT_DIR}/* ${PROJECT_DIR} ; fi -WORKDIR ${PROJECT_DIR} -ENV HOME=${PROJECT_DIR} -RUN mkdir -p /.stack -ENV STACK_ROOT=/.stack +RUN mkdir -p "${PROJECT_DIR}" +RUN if [ "${PROJECT_DIR}" != "${MOUNT_DIR}" ] ; then cp -r "${MOUNT_DIR}"/* "${PROJECT_DIR}" ; fi +WORKDIR "${PROJECT_DIR}" +ENV HOME="${PROJECT_DIR}" + +RUN mkdir -p "${PROJECT_DIR}/.stack" +ENV STACK_ROOT="${PROJECT_DIR}/.stack" RUN make .stack STACK_ROOT=${STACK_ROOT} IN_CONTAINER=true RUN stack build yesod-bin ENV FRADRIVE_MAKE_TARGET=serve-backend -ENTRYPOINT make -- ${FRADRIVE_MAKE_TARGET} STACK_ROOT=${STACK_ROOT} IN_CONTAINER=true +ENTRYPOINT make -- ${FRADRIVE_MAKE_TARGET} STACK_ROOT="${STACK_ROOT}" IN_CONTAINER=true EXPOSE 3000/tcp EXPOSE 3443/tcp diff --git a/docker/database/Dockerfile b/docker/database/Dockerfile index ab40f473f..d486280bf 100644 --- a/docker/database/Dockerfile +++ b/docker/database/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.uniworx.de/fradrive/fradrive/postgres:12 +FROM docker.io/postgres:12 # Allow for connecting to database without password authentication ENV POSTGRES_HOST_AUTH_METHOD=trust @@ -15,5 +15,4 @@ USER postgres # ADD --chmod=755 ./initdb.sh /etc/fradrive-db ENTRYPOINT /etc/fradrive-db -EXPOSE $DEV_PORT_HTTP/tcp -EXPOSE $DEV_PORT_HTTPS/tcp \ No newline at end of file +EXPOSE 5432/tcp \ No newline at end of file diff --git a/docker/frontend/Dockerfile b/docker/frontend/Dockerfile index 96bd9a7c9..8d59ba76a 100644 --- a/docker/frontend/Dockerfile +++ b/docker/frontend/Dockerfile @@ -1,10 +1,11 @@ -FROM registry.uniworx.de/uniworx/containers/debian:12.5 +FROM debian:12.5 # Basic dependencies RUN apt-get -y update && apt-get -y install curl npm # Build and watch dependencies RUN apt-get -y update && apt-get -y install exiftool +RUN apt-get -y update && apt-get -y install imagemagick # Test dependencies RUN apt-get -y update && apt-get -y install chromium @@ -19,7 +20,7 @@ RUN n 20.17.0 ARG MOUNT_DIR=/mnt/fradrive ARG PROJECT_DIR=/fradrive RUN mkdir -p ${PROJECT_DIR} -RUN if [ "${PROJECT_DIR}" != "${MOUNT_DIR}"]; then cp -r ${MOUNT_DIR}/* ${PROJECT_DIR} ; fi +RUN if [ "${PROJECT_DIR}" != "${MOUNT_DIR}" ] ; then cp -r ${MOUNT_DIR}/* ${PROJECT_DIR} ; fi WORKDIR ${PROJECT_DIR} ENV HOME=${PROJECT_DIR} diff --git a/docker/podman/Dockerfile b/docker/podman/Dockerfile index 2d5b6fbfe..e7a950419 100644 --- a/docker/podman/Dockerfile +++ b/docker/podman/Dockerfile @@ -4,7 +4,7 @@ # Yoinked with love from: # https://www.redhat.com/sysadmin/podman-inside-container -FROM registry.uniworx.de/uniworx/containers/debian:12.5 +FROM debian:12.5 RUN apt-get -y update diff --git a/package-lock.json b/package-lock.json index e80665bbe..308d262a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,6 @@ "null-loader": "^4.0.1", "postcss-loader": "^8.1.1", "postcss-preset-env": "^10.0.2", - "real-favicon-webpack-plugin": "^0.2.3", "remove-files-webpack-plugin": "^1.5.0", "resolve-url-loader": "^5.0.0", "sass": "^1.77.8", @@ -3601,14 +3600,6 @@ "@types/node": "*" } }, - "node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -3660,73 +3651,6 @@ "undici-types": "~6.19.2" } }, - "node_modules/@types/source-list-map": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", - "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/tapable": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", - "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/uglify-js": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", - "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/webpack": { - "version": "4.41.39", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.39.tgz", - "integrity": "sha512-otxUJvoi6FbBq/64gGH34eblpKLgdi+gf08GaAh8Bx6So0ZZic028Ev/SUxD22gbthMKCkeeiXEat1kHLDJfYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -4232,29 +4156,6 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", - "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", @@ -4330,13 +4231,6 @@ "inherits": "2.0.3" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4525,20 +4419,6 @@ "node": "*" } }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4581,9 +4461,9 @@ "peer": true }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "license": "MIT", "dependencies": { @@ -4595,7 +4475,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5034,15 +4914,6 @@ "license": "MIT", "peer": true }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -5099,18 +4970,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -5154,19 +5013,6 @@ "nanoassert": "^2.0.0" } }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "license": "MIT/X11", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5182,205 +5028,6 @@ "node": ">=4" } }, - "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=18.17" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5444,20 +5091,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -5903,7 +5536,8 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cors": { "version": "2.8.5", @@ -6220,24 +5854,6 @@ "postcss": "^8.4" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -6778,17 +6394,6 @@ "node": ">=4" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "utila": "~0.4" - } - }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -6802,22 +6407,6 @@ "void-elements": "^2.0.0" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, "node_modules/domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -6843,51 +6432,6 @@ ], "license": "BSD-2-Clause" }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -7016,33 +6560,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/encoding-sniffer/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -7122,17 +6639,6 @@ "node": ">= 0.4" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -7227,14 +6733,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -8099,23 +7597,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -8527,17 +8008,6 @@ "node": "*" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "he": "bin/he" - } - }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -8558,95 +8028,6 @@ "dev": true, "license": "ISC" }, - "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -8658,27 +8039,6 @@ "node": ">=0.10" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -9418,13 +8778,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "license": "MIT" - }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -10291,17 +9644,6 @@ "node": ">=8.0" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10336,17 +9678,6 @@ "semver": "bin/semver" } }, - "node_modules/match-stream": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", - "integrity": "sha512-TbN21KrvmZ4mHzKqSFeNNNYeOGNNoEE0sQjhOGlHc+W6XhV4nEhJqaQTJj106NF+NYjyJ7pXh23+OQ1d306ORw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffers": "~0.1.1", - "readable-stream": "~1.0.0" - } - }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10403,19 +9734,6 @@ "node": ">= 8" } }, - "node_modules/metaparser": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/metaparser/-/metaparser-1.0.7.tgz", - "integrity": "sha512-9f7r6vL2F9LA7T6tvt5cwBrNOfjb7QgGpbnv5qgvCInlQyfBfJV5i+yvvm3b2667N4FF5fJrGVIsnSCTevR8zQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "async": "*", - "cheerio": "*", - "mkdirp": "*", - "underscore": "*" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -10798,18 +10116,6 @@ "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -10817,21 +10123,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-unzip-2": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/node-unzip-2/-/node-unzip-2-0.2.8.tgz", - "integrity": "sha512-fmJi73zTRW7RSo/1wyrKc2srKMwb3L6Ppke/7elzQ0QRt6sUjfiIcVsWdrqO5uEHAdvRKXjoySuo4HYe5BB0rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary": "~0.3.0", - "fstream": "~1.0.12", - "match-stream": "~0.0.2", - "pullstream": "~0.4.0", - "readable-stream": "~1.0.0", - "setimmediate": "~1.0.1" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -13433,29 +12724,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", - "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -13551,16 +12819,6 @@ "shell-quote": "^1.4.2" } }, - "node_modules/over": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", - "integrity": "sha512-EEc3GCT5ce2VgLYKGeomTSgQT+4wkS13Ya9XzKiskHtemWPx0YhVErn7PtiowTOsYtRlFe6FksgwFeWG1aOJdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/p-finally": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", @@ -13638,18 +12896,6 @@ "license": "(MIT AND Zlib)", "peer": true }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -13712,75 +12958,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13791,18 +12968,6 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -15407,18 +14572,6 @@ "node": ">= 0.8.0" } }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -15469,19 +14622,6 @@ "license": "MIT", "peer": true }, - "node_modules/pullstream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", - "integrity": "sha512-8ckaufxE74rtbwA0lD0GO2Pk/miCfje3uZtGZd/MQpxkoRIBB004aKBnhdc4Y8L7sip0cis/ekib/1lUwUwxuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "over": ">= 0.0.5 < 1", - "readable-stream": "~1.0.31", - "setimmediate": ">= 1.0.2 < 2", - "slice-stream": ">= 1.0.0 < 2" - } - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -15511,13 +14651,13 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15698,19 +14838,6 @@ "node": ">=4" } }, - "node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -15724,19 +14851,6 @@ "node": ">=8.10.0" } }, - "node_modules/real-favicon-webpack-plugin": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/real-favicon-webpack-plugin/-/real-favicon-webpack-plugin-0.2.3.tgz", - "integrity": "sha512-w9CS4DdISimLk+hD1qAqVstWfkAXLpnU7a7UOmArHR1pDnmB4SYBO/fwfuu+ObWEcWtIkfsAhJaD6eKSN4Bq6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfg-api": "^0.5.0" - }, - "peerDependencies": { - "html-webpack-plugin": "^4.0.0-beta.5" - } - }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -15852,17 +14966,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/remove-files-webpack-plugin": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/remove-files-webpack-plugin/-/remove-files-webpack-plugin-1.5.0.tgz", @@ -15902,46 +15005,6 @@ "node": ">=6" } }, - "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -16062,33 +15125,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rfg-api": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/rfg-api/-/rfg-api-0.5.3.tgz", - "integrity": "sha512-KQ4Vwc/LrwQ1IFBDEyJdGtn1XsII1GDowLRTtY+rAbJav9R5wwxZiyIQOcetDYKSTH551v9b+Gn4CPw9noQ0bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "axios": "^0.21.1", - "fstream": "^1.0.2", - "metaparser": "^1.0.7", - "mkdirp": "^0.5.0", - "node-unzip-2": "^0.2.7" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/rfg-api/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -16403,13 +15439,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "license": "MIT" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -16602,16 +15631,6 @@ "node": ">=6" } }, - "node_modules/slice-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", - "integrity": "sha512-fJu1TYTr85OZEkT4lqcCW6oPWPIS5omPnIsB/dL7QWo2sNk03VQ6did4plhh0y3Sf0nJlq5QEUR3vMYevydn7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.31" - } - }, "node_modules/socket.io": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", @@ -16997,13 +16016,6 @@ "node": ">= 4.0.0" } }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -17399,36 +16411,6 @@ "acorn-node": "^1.2.0" } }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", @@ -17550,14 +16532,6 @@ "node": ">=10" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17813,24 +16787,6 @@ "node": ">=0.10.0" } }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "license": "MIT/X11", - "engines": { - "node": "*" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true, - "license": "0BSD", - "peer": true - }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -18020,23 +16976,6 @@ "undeclared-identifiers": "bin.js" } }, - "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -18187,23 +17126,6 @@ "node": ">= 0.4" } }, - "node_modules/url/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -18239,26 +17161,6 @@ "dev": true, "license": "MIT" }, - "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -18601,48 +17503,12 @@ "node": ">=6" } }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index f4cfa0f0d..15a4082f4 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "null-loader": "^4.0.1", "postcss-loader": "^8.1.1", "postcss-preset-env": "^10.0.2", - "real-favicon-webpack-plugin": "^0.2.3", "remove-files-webpack-plugin": "^1.5.0", "resolve-url-loader": "^5.0.0", "sass": "^1.77.8", diff --git a/records.json b/records.json index efeb5b9e7..59bd08227 100644 --- a/records.json +++ b/records.json @@ -1,17 +1,4 @@ { - "app-manifest-webpack-plugin for \"../../config/favicon.json\"": [ - { - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - }, - "modules": { - "byIdentifier": {}, - "usedIds": {} - } - } - ], "app-manifest-webpack-plugin for \"/home/gkleen/projects/uni2work/static/wp-4.41/iconstats-[hash].json\"": [ { "chunks": { diff --git a/stack.yaml.lock b/stack.yaml.lock index db6b0fcb9..5b382d570 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -6,7 +6,7 @@ packages: - completed: commit: 22fc3bb14841d8d50997aa47f1be3852e666f787 - git: https://gitlab.uniworx.de/haskell/encoding.git + git: https://gitea.uniworx.systems/haskell/encoding.git name: encoding pantry-tree: sha256: fec12328951021bb4d9326ae0b35f0c459e65f28442366efd4366cd1e18abe19 @@ -14,10 +14,10 @@ packages: version: 0.8.2 original: commit: 22fc3bb14841d8d50997aa47f1be3852e666f787 - git: https://gitlab.uniworx.de/haskell/encoding.git + git: https://gitea.uniworx.systems/haskell/encoding.git - completed: commit: b7071df50bad3a251a544b984e4bf98fa09b8fae - git: https://gitlab.uniworx.de/haskell/memcached-binary.git + git: https://gitea.uniworx.systems/haskell/memcached-binary.git name: memcached-binary pantry-tree: sha256: 0da0539b7b9a56d03a116dcd666bc1bbbef085659910420849484d1418aa0857 @@ -25,10 +25,10 @@ packages: version: 0.2.0 original: commit: b7071df50bad3a251a544b984e4bf98fa09b8fae - git: https://gitlab.uniworx.de/haskell/memcached-binary.git + git: https://gitea.uniworx.systems/haskell/memcached-binary.git - completed: commit: cbea6159c2975d42f948525e03e12fc390da53c5 - git: https://gitlab.uniworx.de/haskell/conduit-resumablesink.git + git: https://gitea.uniworx.systems/haskell/conduit-resumablesink.git name: conduit-resumablesink pantry-tree: sha256: 0cccf4684bbd84f81d2d3d53dd81c46cb103b5322f1d8e89e9b222211281e1b7 @@ -36,7 +36,7 @@ packages: version: '0.3' original: commit: cbea6159c2975d42f948525e03e12fc390da53c5 - git: https://gitlab.uniworx.de/haskell/conduit-resumablesink.git + git: https://gitea.uniworx.systems/haskell/conduit-resumablesink.git - completed: commit: 5aa1f3b009253b02c4822005ac59ee208a10a347 git: https://github.com/jtdaugherty/HaskellNet.git @@ -50,7 +50,7 @@ packages: git: https://github.com/jtdaugherty/HaskellNet.git - completed: commit: 40393c938111ac78232dc2c7eec5edb4a22d03e8 - git: https://gitlab.uniworx.de/haskell/HaskellNet-SSL.git + git: https://gitea.uniworx.systems/haskell/HaskellNet-SSL.git name: HaskellNet-SSL pantry-tree: sha256: 95dcec22fdb8af986e59f0f60aa76d4a48f34a546dca799bd571e1d183f773e0 @@ -58,10 +58,10 @@ packages: version: 0.3.4.1 original: commit: 40393c938111ac78232dc2c7eec5edb4a22d03e8 - git: https://gitlab.uniworx.de/haskell/HaskellNet-SSL.git + git: https://gitea.uniworx.systems/haskell/HaskellNet-SSL.git - completed: commit: 01afaf599ba6f8a9d804c269e91d3190b249d3f0 - git: https://gitlab.uniworx.de/haskell/ldap-client.git + git: https://gitea.uniworx.systems/haskell/ldap-client.git name: ldap-client pantry-tree: sha256: 3fa8f102427b437b2baaec15cf884e88b47a1621b1c3fd4d8919f0263fde8656 @@ -69,10 +69,10 @@ packages: version: 0.4.0 original: commit: 01afaf599ba6f8a9d804c269e91d3190b249d3f0 - git: https://gitlab.uniworx.de/haskell/ldap-client.git + git: https://gitea.uniworx.systems/haskell/ldap-client.git - completed: commit: fda3a000f9039e35e76e28f8e88c4942fac9fd69 - git: https://gitlab.uniworx.de/haskell/serversession.git + git: https://gitea.uniworx.systems/haskell/serversession.git name: serversession pantry-tree: sha256: 83ac78a987399db3da62f84bbd335fead11aadebd57251d0688127fca984db23 @@ -81,11 +81,11 @@ packages: version: 1.0.2 original: commit: fda3a000f9039e35e76e28f8e88c4942fac9fd69 - git: https://gitlab.uniworx.de/haskell/serversession.git + git: https://gitea.uniworx.systems/haskell/serversession.git subdir: serversession - completed: commit: fda3a000f9039e35e76e28f8e88c4942fac9fd69 - git: https://gitlab.uniworx.de/haskell/serversession.git + git: https://gitea.uniworx.systems/haskell/serversession.git name: serversession-backend-acid-state pantry-tree: sha256: 4804260c6245c12e1728c78dd33bf16e95b7f2b69b38b6900a4e65b1ef3e04b7 @@ -94,11 +94,11 @@ packages: version: 1.0.4 original: commit: fda3a000f9039e35e76e28f8e88c4942fac9fd69 - git: https://gitlab.uniworx.de/haskell/serversession.git + git: https://gitea.uniworx.systems/haskell/serversession.git subdir: serversession-backend-acid-state - completed: commit: dc928c3a456074b8777603bea20e81937321777f - git: https://gitlab.uniworx.de/haskell/xss-sanitize.git + git: https://gitea.uniworx.systems/haskell/xss-sanitize.git name: xss-sanitize pantry-tree: sha256: f567a1c834448daaa164f2029fad164e6c8df2d4c92b51f811bae19cc0c95975 @@ -106,10 +106,10 @@ packages: version: 0.3.6 original: commit: dc928c3a456074b8777603bea20e81937321777f - git: https://gitlab.uniworx.de/haskell/xss-sanitize.git + git: https://gitea.uniworx.systems/haskell/xss-sanitize.git - completed: commit: f8170266ab25b533576e96715bedffc5aa4f19fa - git: https://gitlab.uniworx.de/haskell/colonnade.git + git: https://gitea.uniworx.systems/haskell/colonnade.git name: colonnade pantry-tree: sha256: 392393652cc0f354d351482557b9385c8e6122e706359b030373656565f2e045 @@ -118,11 +118,11 @@ packages: version: 1.2.0.2 original: commit: f8170266ab25b533576e96715bedffc5aa4f19fa - git: https://gitlab.uniworx.de/haskell/colonnade.git + git: https://gitea.uniworx.systems/haskell/colonnade.git subdir: colonnade - completed: commit: 42103ab247057c04c8ce7a83d9d4c160713a3df1 - git: https://gitlab.uniworx.de/haskell/minio-hs.git + git: https://gitea.uniworx.systems/haskell/minio-hs.git name: minio-hs pantry-tree: sha256: c5faff15fa22a7a63f45cd903c9bd11ae03f422c26f24750f5c44cb4d0db70fc @@ -130,10 +130,10 @@ packages: version: 1.5.2 original: commit: 42103ab247057c04c8ce7a83d9d4c160713a3df1 - git: https://gitlab.uniworx.de/haskell/minio-hs.git + git: https://gitea.uniworx.systems/haskell/minio-hs.git - completed: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git name: cryptoids-class pantry-tree: sha256: 30466648d273ffb1d580b7961188d67a0bedb3703d6d5f8cca3c15a45295f203 @@ -142,11 +142,11 @@ packages: version: 0.0.0 original: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git subdir: cryptoids-class - completed: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git name: cryptoids-types pantry-tree: sha256: 824ac5c55c2ad553bd401bb5a99731bbdccc828ecc5d71f174e9375c4e03c46e @@ -155,11 +155,11 @@ packages: version: 1.0.0 original: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git subdir: cryptoids-types - completed: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git name: cryptoids pantry-tree: sha256: b1f49dde76ff7e78b76e7f2f3b3f76c55e5e61555d1df5415ad3b6eb80dda2cb @@ -168,11 +168,11 @@ packages: version: 0.5.1.0 original: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git subdir: cryptoids - completed: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git name: filepath-crypto pantry-tree: sha256: 9c31a2ffb2b1c86f9ba34eb83529c7a5a7dc68a49f89813c9b553427474654d9 @@ -181,11 +181,11 @@ packages: version: 0.1.0.0 original: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git subdir: filepath-crypto - completed: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git name: uuid-crypto pantry-tree: sha256: 852e59807df1f2cf4b5a3748c46fa149d15a78651c93addfe5fc31d2d94c47f4 @@ -194,7 +194,7 @@ packages: version: 1.4.0.0 original: commit: 130b0dcbf2b09ccdf387b50262f1efbbbf1819e3 - git: https://gitlab.uniworx.de/haskell/cryptoids.git + git: https://gitea.uniworx.systems/haskell/cryptoids.git subdir: uuid-crypto - completed: commit: f216e3c0a1efa11a62fd4c9c2db38f7e2b7ac72d @@ -224,7 +224,7 @@ packages: subdir: fastcdc - completed: commit: 843683d024f767de236f74d24a3348f69181a720 - git: https://gitlab.uniworx.de/haskell/zip-stream.git + git: https://gitea.uniworx.systems/haskell/zip-stream.git name: zip-stream pantry-tree: sha256: 0da8bc38d73034962d2e2d1a7586b6dee848a629319fce9cbbf578348c61118c @@ -232,10 +232,10 @@ packages: version: 0.2.0.1 original: commit: 843683d024f767de236f74d24a3348f69181a720 - git: https://gitlab.uniworx.de/haskell/zip-stream.git + git: https://gitea.uniworx.systems/haskell/zip-stream.git - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-core pantry-tree: sha256: 08c8da10b32c8d9f784238fd87232bf90b752e82f81ef2c52c62210f9aadda9a @@ -244,11 +244,11 @@ packages: version: 1.6.20.2 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-core - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-static pantry-tree: sha256: 32c1608243a5309005ce11e2aa379ac1d6f8c380c529785eb510770118f3da06 @@ -257,11 +257,11 @@ packages: version: 1.6.1.0 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-static - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-persistent pantry-tree: sha256: 3778ef2964e1a3890afc22cc9124eacb40e64b62bed4983a85d3b99897f54c5c @@ -270,11 +270,11 @@ packages: version: 1.6.0.7 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-persistent - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-newsfeed pantry-tree: sha256: 53ebad62655863a657dcf749ffd3de46f6af90dd71f55bc4d50805ac48ddb099 @@ -283,11 +283,11 @@ packages: version: 1.7.0.0 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-newsfeed - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-form pantry-tree: sha256: 260b7f16a8e1d58da137eb91aeed3a11ccbe59ba3e614457a635b9dc3e71426f @@ -296,11 +296,11 @@ packages: version: 1.7.0 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-form - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-form-multi pantry-tree: sha256: b21fc50db43733dfe6e285345856610ba4feb83329e9cf953bf8047ba18ecbd6 @@ -309,11 +309,11 @@ packages: version: 1.7.0.2 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-form-multi - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-auth pantry-tree: sha256: d335b940a207f8155f421b7146746a72d20db6ad54412154f2c829a59bf21e08 @@ -322,11 +322,11 @@ packages: version: 1.6.10.3 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-auth - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-auth-oauth pantry-tree: sha256: 39d2f7d5d1abb3a2953858c5f23880e60ecfcdad0549ddc2570204f9c47649f4 @@ -335,11 +335,11 @@ packages: version: 1.6.0.3 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-auth-oauth - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-sitemap pantry-tree: sha256: 971f48af7011ff7816872d067e5de9cadafdd371bdf209170b77df36001abd27 @@ -348,11 +348,11 @@ packages: version: 1.6.0 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-sitemap - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-test pantry-tree: sha256: 3d5022e8e3f8e77abcf075c42cf49efaa26f4951159bbb5ab50b69fdfeacb7c1 @@ -361,11 +361,11 @@ packages: version: 1.6.12 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-test - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-bin pantry-tree: sha256: 422d7816965b79826c6c24582d76dadbacd1bfb3e9a8f31208867cd788f2a5b8 @@ -374,11 +374,11 @@ packages: version: 1.6.1 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-bin - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod pantry-tree: sha256: cb53ef3f2036185d2b4752d6fbc5d78470b4504e646e7eb4dd2397f2599daf42 @@ -387,11 +387,11 @@ packages: version: 1.6.1.1 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-eventsource pantry-tree: sha256: 6d393201852cd024e377159ba836398e24d191563e08165430113d3c1384aff2 @@ -400,11 +400,11 @@ packages: version: 1.6.0.1 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-eventsource - completed: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git name: yesod-websockets pantry-tree: sha256: 02df6117e9b74a77879ea750130ba2d8ad8d3c99e14ca678320cb578984301e5 @@ -413,11 +413,11 @@ packages: version: 0.3.0.3 original: commit: aa671eb41fdad360f2f7cb844f8de03479efe3f7 - git: https://gitlab.uniworx.de/haskell/yesod.git + git: https://gitea.uniworx.systems/haskell/yesod.git subdir: yesod-websockets - completed: commit: 71a630edaf5f22c464e24fac8d9d310f4055ea1f - git: https://gitlab.uniworx.de/haskell/cryptonite.git + git: https://gitea.uniworx.systems/haskell/cryptonite.git name: cryptonite pantry-tree: sha256: 19e49259fa5e3c257495d72b3c7c3c49537aeafd508c780c2430ddca2ef71a91 @@ -425,10 +425,10 @@ packages: version: '0.29' original: commit: 71a630edaf5f22c464e24fac8d9d310f4055ea1f - git: https://gitlab.uniworx.de/haskell/cryptonite.git + git: https://gitea.uniworx.systems/haskell/cryptonite.git - completed: commit: e18dd125c5ea26fa4e88bed079b61d8c1365ee37 - git: https://gitlab.uniworx.de/haskell/esqueleto.git + git: https://gitea.uniworx.systems/haskell/esqueleto.git name: esqueleto pantry-tree: sha256: 8a93dc98eb4529ff64aa5bcdaa3c00dcdf0378033ad675864e2b0fc3d869d947 @@ -436,7 +436,7 @@ packages: version: 3.5.4.0 original: commit: e18dd125c5ea26fa4e88bed079b61d8c1365ee37 - git: https://gitlab.uniworx.de/haskell/esqueleto.git + git: https://gitea.uniworx.systems/haskell/esqueleto.git - completed: hackage: classy-prelude-yesod-1.5.0@sha256:8f7e183bdfd6d2ea9674284c4f285294ab086aff60d9be4e5d7d2f3c1a2b05b7,1330 pantry-tree: diff --git a/test/Handler/CommonSpec.hs b/test/Handler/CommonSpec.hs index 334bee7d5..27be88c40 100644 --- a/test/Handler/CommonSpec.hs +++ b/test/Handler/CommonSpec.hs @@ -15,7 +15,8 @@ spec = withApp $ do it "has correct User-agent" $ do get $ WellKnownR RobotsTxt bodyContains "User-agent: *" - describe "favicon.ico" $ do - it "gives a 200" $ do - get $ WellKnownR FaviconIco - statusIs 200 + -- FIXME: deprecated, check for assets/favicons instead! + --describe "favicon.ico" $ do + -- it "gives a 200" $ do + -- get $ WellKnownR FaviconIco + -- statusIs 200 diff --git a/utils/faviconize.pl b/utils/faviconize.pl new file mode 100755 index 000000000..02d64829d --- /dev/null +++ b/utils/faviconize.pl @@ -0,0 +1,46 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +my ($file, $sizes, $faviconDir) = @ARGV; + +die "usage: $0 [origfile] [sizes] [faviconDir] (sizes is ,-seperated list of side length or short, medium or long\n" unless defined $file and defined $sizes and defined $faviconDir; + +die "File '$file' not found!\n" unless -e $file; + +$sizes = '16,32' if 'short' eq $sizes; +$sizes = '16,32,48,64,128,256' if 'medium' eq $sizes; +$sizes = '16,32,48,64,128,192,228,230,256,512' if 'long' eq $sizes; + +my @sizes = split m/,/, $sizes; + +my $include = ""; + +mkdir($faviconDir); +my $dir = undef; +opendir($dir, $faviconDir) or die "Could not read directory '$faviconDir', because: $!\n"; +while(my $fn = readdir($dir)) { + unlink("$faviconDir/$fn") if -d "$faviconDir/$fn" +} +for my $s(@sizes) { + resize($s, "favicon-${s}x$s.png"); +} + +resize(180, "apple-touch-icon.png"); + +sub resize { + my ($size, $newfile) = @_; + my $ret = system("convert '$file' -resize '${size}x$size' '$faviconDir/$newfile'"); + die "$0: convert exited with error code $ret on generating '$faviconDir/$newfile'\n" if $ret; + die "$0: output file '$faviconDir/$newfile' could not be generated\n" unless -e "$faviconDir/$newfile"; + my $icon = "icon"; + $icon = "apple-touch-icon" if $newfile=~m#apple#; + $include .= qq## +} + +my $wh = undef; +open($wh, '>', "$faviconDir/include.html") or die "Could not write '$faviconDir/include.html', because: $!"; +print $wh $include; + + diff --git a/webpack.config.js b/webpack.config.js index d4c18129f..d9b28412b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -20,7 +20,6 @@ import TerserPlugin from 'terser-webpack-plugin'; import yaml from 'js-yaml'; import postcssPresetEnv from 'postcss-preset-env'; import RemovePlugin from 'remove-files-webpack-plugin'; -import RealFaviconPlugin from 'real-favicon-webpack-plugin'; import crypto from 'crypto'; // import { version as webpackVersion } from 'webpack/package.json' assert { type: 'json' }; // version.split('.').slice(0, 2).join('.'); @@ -30,22 +29,14 @@ import webpackJson from 'webpack/package.json' assert { type: "json" }; const webpackVersion = webpackJson.version.split('.').slice(0, 2).join('.'); import packageJson from './package.json' assert { type: "json" }; const packageVersion = packageJson.version; - -import faviconJson from './config/favicon.json' assert { type: 'json' }; +import i18nJson from './config/i18n.json' assert { type: 'json' }; async function webpackConfig() { - const wellKnownCacheDir = resolve('.cache/well-known'); - const assetsDirectory = resolve('assets'); - let faviconApiVersion = undefined; - - if (!fs.existsSync(wellKnownCacheDir)) { - try { - const faviconApiChangelog = await axios.get('https://realfavicongenerator.net/api/versions'); - faviconApiVersion = faviconApiChangelog.data.filter(vObj => vObj.relevance.automated_update).slice(-1)[0].version; - } catch(e) { - console.error(e); - } - } + const wellKnownDir = 'well-known'; + const wellKnownCacheDir = '.cache/well-known'; + const staticDir = 'static'; + const assetsDir = 'assets'; + const faviconsDir = `${assetsDir}/favicons`; return { module: { @@ -131,8 +122,8 @@ async function webpackConfig() { serialize: yaml.dump }), new CleanWebpackPlugin({ - cleanOnceBeforeBuildPatterns: [ resolve('static'), - resolve('well-known'), + cleanOnceBeforeBuildPatterns: [ resolve(staticDir), + resolve(wellKnownDir), ] }), new webpack.IgnorePlugin({ @@ -144,44 +135,26 @@ async function webpackConfig() { }), ...(() => { const langs = new Set(); - function findLangs(json) { + function findLangs(json, langs = new Set()) { if (json && json._i18n) { Object.keys(json).forEach(key => { if (key !== '_i18n') { langs.add(key); } }) - } else if (Array.isArray(json)) { - json.forEach(elem => findLangs(elem)); - } else if (typeof json === 'object') { - Object.keys(json).forEach(key => findLangs(json[key])); - } - } - findLangs(faviconJson); - - function selectLang(lang, json) { - if (json && json._i18n) { - return json[lang]; - } else if (Array.isArray(json)) { - return json.map(elem => selectLang(lang, elem)); - } else if (typeof json === 'object') { - return Object.fromEntries(Object.entries(json).map(([k, v]) => [k, selectLang(lang, v)])); } else { - return json; + console.error('Invalid i18nJson format!'); } + return langs; } - - const langJsons = {}; - Array.from(langs).forEach(lang => { - langJsons[lang] = selectLang(lang, faviconJson); - }); + findLangs(i18nJson, langs); const cacheHash = crypto.createHash('sha256'); - cacheHash.update(JSON.stringify(langJsons)); + cacheHash.update(JSON.stringify(langs)); const cacheFiles = new Set([ - ...(Array.from(langs).map(lang => resolve(langJsons[lang].masterPicture))), resolve('config/robots.txt'), + resolve('assets/favicon.svg'), ]); for (const cacheFile of cacheFiles) { @@ -192,7 +165,7 @@ async function webpackConfig() { let cachedVersion = undefined; - const versionFile = resolve('.well-known-cache', `${cacheDigest}.version`); + const versionFile = resolve(wellKnownCacheDir, `${cacheDigest}.version`); try { if (fs.existsSync(versionFile)) { cachedVersion = fs.readFileSync(versionFile, 'utf8'); @@ -201,66 +174,18 @@ async function webpackConfig() { console.error(e); } - if (faviconApiVersion) { - cacheHash.update(faviconApiVersion); - } const versionDigest = cacheHash.digest('hex'); return Array.from(langs).map(lang => { - const faviconConfig = { versioning: { param_name: 'v', param_value: versionDigest.substr(0,10) }, ...langJsons[lang] }; - - const cacheDirectory = resolve('.well-known-cache', `${cacheDigest}-${lang}`); - - if (fs.existsSync(wellKnownCacheDir)) { - console.log("Using favicons generated by nix"); - return [ - new CopyPlugin({ - patterns: [ - { from: resolve(wellKnownCacheDir, lang), to: resolve('well-known', lang) } - ] - }) - ]; - } else if (fs.existsSync(cacheDirectory) && (!faviconApiVersion || faviconApiVersion === cachedVersion)) { - console.log(`Using cached well-known from ${cacheDirectory} for ${lang}`); - return [ - new CopyPlugin({ - patterns: [ - { from: cacheDirectory, to: resolve('well-known', lang) } - ] - }) - ]; - } else { - const tmpobj = tmp.fileSync({ postfix: ".json" }); - fs.writeSync(tmpobj.fd, JSON.stringify(faviconConfig)); - fs.close(tmpobj.fd); - - return [ - new RealFaviconPlugin({ - faviconJson: relative(".", tmpobj.name), - outputPath: resolve('well-known', lang), - inject: false - }), - new CopyPlugin({ - patterns: [ - { from: 'config/robots.txt', to: resolve('well-known', lang, 'robots.txt') }, - ] - }), - { apply: compiler => compiler.hooks.afterEmit.tap('AfterEmitPlugin', compilation => { - const imgFiles = globSync(resolve('well-known', lang) + '/*.@(png)'); - const imgFilesArgs = Array.from(imgFiles).join(" "); - execSync(`exiftool -overwrite_original -all= ${imgFilesArgs}`, { stdio: 'inherit' }); - }) - }, - { apply: compiler => compiler.hooks.afterEmit.tap('AfterEmitPlugin', compilation => { - fs.ensureDirSync('.well-known-cache'); - fs.copySync(resolve('well-known', lang), cacheDirectory); - if (!fs.existsSync(versionFile)) { - fs.writeFileSync(versionFile, faviconApiVersion, { encoding: 'utf8' }); - } - }) - } - ]; - } + return [ + new CopyPlugin({ + patterns: [ + { from: 'config/robots.txt', to: resolve(wellKnownDir, lang, 'robots.txt') }, + { from: `${faviconsDir}/include.html`, to: resolve(wellKnownDir, lang, 'html_code.html') }, + { from: `${faviconsDir}/*.png`, to: resolve(wellKnownDir, lang, '[name][ext]') }, + ] + }), + ]; }).flat(1); })() ], @@ -268,8 +193,8 @@ async function webpackConfig() { output: { chunkFilename: '[chunkhash].js', filename: '[chunkhash].js', - path: resolve('static', `wp-${webpackVersion}`), - publicPath: `/static/res/wp-${webpackVersion}/`, + path: resolve(staticDir, `wp-${webpackVersion}`), + publicPath: `/${staticDir}/res/wp-${webpackVersion}/`, hashFunction: 'shake256', hashDigestLength: 36 }, @@ -303,4 +228,4 @@ async function webpackConfig() { }; } -export default webpackConfig; +export default webpackConfig; \ No newline at end of file