From 1357a1118ff6a24984693af1a48329dfaeeabbb9 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 26 Oct 2025 22:50:07 +0100 Subject: [PATCH 1/2] Handle the case with missing file for symlink --- webapp/src/Service/DOMJudgeService.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapp/src/Service/DOMJudgeService.php b/webapp/src/Service/DOMJudgeService.php index cebc0fabe7..41ef0a70da 100644 --- a/webapp/src/Service/DOMJudgeService.php +++ b/webapp/src/Service/DOMJudgeService.php @@ -1568,6 +1568,9 @@ public function getScoreboardZip( $publicPath = realpath(sprintf('%s/public/', $this->projectDir)); foreach ($assetMatches[1] as $file) { $filepath = realpath($publicPath . '/' . $file); + if ($filepath === false) { + throw new Exception("Could not find (possibly symlinked) file: " . $file . ", at: " . $publicPath); + } if (!str_starts_with($filepath, $publicPath) && !str_starts_with($filepath, $this->vendorDir) ) { From 5de30a585c6424630262c960468108b3765283b9 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 26 Oct 2025 19:53:07 +0100 Subject: [PATCH 2/2] Manage JS frontend libraries with yarn Either Composer managed those before, or those were checked into git. Now we track those with `yarn`: - Coloris - JQuery debounce - Monaco editor - Bootstrap-toggle - File-saver - d3 - nvd3 - Select2 D3 has a newer release but we can't upgrade because of the nvd3 which needs this specific Major version. --- .github/jobs/baseinstall.sh | 7 + .github/workflows/codeql-analysis.yml | 6 + Makefile | 15 +- doc/manual/develop.rst | 4 +- etc/domserver-static.php.in | 21 +- webapp/.gitignore | 1 + webapp/Makefile | 17 +- webapp/composer.json | 4 - webapp/composer.lock | 149 +- webapp/config/static.yaml.in | 1 + webapp/package.json | 12 + webapp/public/css/nv.d3.min.css | 2 +- webapp/public/css/nv.d3.min.css.map | 2 +- webapp/public/css/select2.min.css | 2 +- webapp/public/js/FileSaver.min.js | 2 +- webapp/public/js/FileSaver.min.js.map | 2 +- webapp/public/js/bootstrap-toggle.min.js | 10 +- webapp/public/js/bootstrap-toggle.min.js.map | 2 +- webapp/public/js/coloris.min.js | 7 +- webapp/public/js/d3.min.js | 2 +- webapp/public/js/jquery.debounce.min.js | 10 +- webapp/public/js/monaco/vs | 1 + .../browser/ui/codicons/codicon/codicon.ttf | Bin 80340 -> 0 bytes .../js/monaco/vs/base/worker/workerMain.js | 31 - .../js/monaco/vs/basic-languages/abap/abap.js | 10 - .../js/monaco/vs/basic-languages/apex/apex.js | 10 - .../monaco/vs/basic-languages/azcli/azcli.js | 10 - .../js/monaco/vs/basic-languages/bat/bat.js | 10 - .../monaco/vs/basic-languages/bicep/bicep.js | 11 - .../vs/basic-languages/cameligo/cameligo.js | 10 - .../vs/basic-languages/clojure/clojure.js | 10 - .../vs/basic-languages/coffee/coffee.js | 10 - .../js/monaco/vs/basic-languages/cpp/cpp.js | 10 - .../vs/basic-languages/csharp/csharp.js | 10 - .../js/monaco/vs/basic-languages/csp/csp.js | 10 - .../js/monaco/vs/basic-languages/css/css.js | 12 - .../vs/basic-languages/cypher/cypher.js | 10 - .../js/monaco/vs/basic-languages/dart/dart.js | 10 - .../basic-languages/dockerfile/dockerfile.js | 10 - .../js/monaco/vs/basic-languages/ecl/ecl.js | 10 - .../vs/basic-languages/elixir/elixir.js | 10 - .../monaco/vs/basic-languages/flow9/flow9.js | 10 - .../freemarker2/freemarker2.js | 12 - .../vs/basic-languages/fsharp/fsharp.js | 10 - .../js/monaco/vs/basic-languages/go/go.js | 10 - .../vs/basic-languages/graphql/graphql.js | 10 - .../basic-languages/handlebars/handlebars.js | 10 - .../js/monaco/vs/basic-languages/hcl/hcl.js | 10 - .../js/monaco/vs/basic-languages/html/html.js | 10 - .../js/monaco/vs/basic-languages/ini/ini.js | 10 - .../js/monaco/vs/basic-languages/java/java.js | 10 - .../basic-languages/javascript/javascript.js | 10 - .../monaco/vs/basic-languages/julia/julia.js | 10 - .../vs/basic-languages/kotlin/kotlin.js | 10 - .../js/monaco/vs/basic-languages/less/less.js | 11 - .../monaco/vs/basic-languages/lexon/lexon.js | 10 - .../vs/basic-languages/liquid/liquid.js | 10 - .../js/monaco/vs/basic-languages/lua/lua.js | 10 - .../js/monaco/vs/basic-languages/m3/m3.js | 10 - .../vs/basic-languages/markdown/markdown.js | 10 - .../js/monaco/vs/basic-languages/mdx/mdx.js | 10 - .../js/monaco/vs/basic-languages/mips/mips.js | 10 - .../monaco/vs/basic-languages/msdax/msdax.js | 10 - .../monaco/vs/basic-languages/mysql/mysql.js | 10 - .../objective-c/objective-c.js | 10 - .../vs/basic-languages/pascal/pascal.js | 10 - .../vs/basic-languages/pascaligo/pascaligo.js | 10 - .../js/monaco/vs/basic-languages/perl/perl.js | 10 - .../monaco/vs/basic-languages/pgsql/pgsql.js | 10 - .../js/monaco/vs/basic-languages/php/php.js | 10 - .../js/monaco/vs/basic-languages/pla/pla.js | 10 - .../vs/basic-languages/postiats/postiats.js | 10 - .../basic-languages/powerquery/powerquery.js | 10 - .../basic-languages/powershell/powershell.js | 10 - .../vs/basic-languages/protobuf/protobuf.js | 11 - .../js/monaco/vs/basic-languages/pug/pug.js | 10 - .../vs/basic-languages/python/python.js | 10 - .../vs/basic-languages/qsharp/qsharp.js | 10 - .../js/monaco/vs/basic-languages/r/r.js | 10 - .../monaco/vs/basic-languages/razor/razor.js | 10 - .../monaco/vs/basic-languages/redis/redis.js | 10 - .../vs/basic-languages/redshift/redshift.js | 10 - .../restructuredtext/restructuredtext.js | 10 - .../js/monaco/vs/basic-languages/ruby/ruby.js | 10 - .../js/monaco/vs/basic-languages/rust/rust.js | 10 - .../js/monaco/vs/basic-languages/sb/sb.js | 10 - .../monaco/vs/basic-languages/scala/scala.js | 10 - .../vs/basic-languages/scheme/scheme.js | 10 - .../js/monaco/vs/basic-languages/scss/scss.js | 12 - .../monaco/vs/basic-languages/shell/shell.js | 10 - .../vs/basic-languages/solidity/solidity.js | 10 - .../vs/basic-languages/sophia/sophia.js | 10 - .../vs/basic-languages/sparql/sparql.js | 10 - .../js/monaco/vs/basic-languages/sql/sql.js | 10 - .../js/monaco/vs/basic-languages/st/st.js | 10 - .../monaco/vs/basic-languages/swift/swift.js | 13 - .../systemverilog/systemverilog.js | 10 - .../js/monaco/vs/basic-languages/tcl/tcl.js | 10 - .../js/monaco/vs/basic-languages/twig/twig.js | 10 - .../basic-languages/typescript/typescript.js | 10 - .../vs/basic-languages/typespec/typespec.js | 10 - .../js/monaco/vs/basic-languages/vb/vb.js | 10 - .../js/monaco/vs/basic-languages/wgsl/wgsl.js | 307 - .../js/monaco/vs/basic-languages/xml/xml.js | 10 - .../js/monaco/vs/basic-languages/yaml/yaml.js | 10 - .../js/monaco/vs/editor/editor.main.css | 8 - .../public/js/monaco/vs/editor/editor.main.js | 798 - .../js/monaco/vs/language/css/cssMode.js | 13 - .../js/monaco/vs/language/css/cssWorker.js | 77 - .../js/monaco/vs/language/html/htmlMode.js | 13 - .../js/monaco/vs/language/html/htmlWorker.js | 454 - .../js/monaco/vs/language/json/jsonMode.js | 19 - .../js/monaco/vs/language/json/jsonWorker.js | 42 - .../monaco/vs/language/typescript/tsMode.js | 20 - .../monaco/vs/language/typescript/tsWorker.js | 51328 ---------------- webapp/public/js/monaco/vs/loader.js | 11 - webapp/public/js/monaco/vs/nls.messages.de.js | 20 - webapp/public/js/monaco/vs/nls.messages.es.js | 20 - webapp/public/js/monaco/vs/nls.messages.fr.js | 18 - webapp/public/js/monaco/vs/nls.messages.it.js | 18 - webapp/public/js/monaco/vs/nls.messages.ja.js | 20 - webapp/public/js/monaco/vs/nls.messages.ko.js | 18 - webapp/public/js/monaco/vs/nls.messages.ru.js | 20 - .../public/js/monaco/vs/nls.messages.zh-cn.js | 20 - .../public/js/monaco/vs/nls.messages.zh-tw.js | 18 - webapp/public/js/nv.d3.min.js | 2 +- webapp/public/js/nv.d3.min.js.map | 2 +- webapp/public/js/select2.min.js | 2 +- webapp/src/Service/DOMJudgeService.php | 7 +- webapp/symfony.lock | 9 - webapp/yarn.lock | 50 + 131 files changed, 131 insertions(+), 54325 deletions(-) create mode 100644 webapp/package.json mode change 100644 => 120000 webapp/public/js/bootstrap-toggle.min.js mode change 100644 => 120000 webapp/public/js/bootstrap-toggle.min.js.map mode change 100644 => 120000 webapp/public/js/coloris.min.js mode change 100644 => 120000 webapp/public/js/jquery.debounce.min.js create mode 120000 webapp/public/js/monaco/vs delete mode 100644 webapp/public/js/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf delete mode 100644 webapp/public/js/monaco/vs/base/worker/workerMain.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/abap/abap.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/apex/apex.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/azcli/azcli.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/bat/bat.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/bicep/bicep.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/cameligo/cameligo.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/clojure/clojure.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/coffee/coffee.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/cpp/cpp.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/csharp/csharp.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/csp/csp.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/css/css.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/cypher/cypher.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/dart/dart.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/dockerfile/dockerfile.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/ecl/ecl.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/elixir/elixir.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/flow9/flow9.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/freemarker2/freemarker2.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/fsharp/fsharp.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/go/go.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/graphql/graphql.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/handlebars/handlebars.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/hcl/hcl.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/html/html.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/ini/ini.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/java/java.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/javascript/javascript.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/julia/julia.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/kotlin/kotlin.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/less/less.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/lexon/lexon.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/liquid/liquid.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/lua/lua.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/m3/m3.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/markdown/markdown.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/mdx/mdx.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/mips/mips.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/msdax/msdax.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/mysql/mysql.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/objective-c/objective-c.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/pascal/pascal.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/pascaligo/pascaligo.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/perl/perl.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/pgsql/pgsql.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/php/php.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/pla/pla.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/postiats/postiats.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/powerquery/powerquery.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/powershell/powershell.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/protobuf/protobuf.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/pug/pug.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/python/python.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/qsharp/qsharp.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/r/r.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/razor/razor.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/redis/redis.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/redshift/redshift.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/restructuredtext/restructuredtext.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/ruby/ruby.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/rust/rust.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/sb/sb.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/scala/scala.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/scheme/scheme.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/scss/scss.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/shell/shell.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/solidity/solidity.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/sophia/sophia.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/sparql/sparql.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/sql/sql.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/st/st.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/swift/swift.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/systemverilog/systemverilog.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/tcl/tcl.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/twig/twig.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/typescript/typescript.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/typespec/typespec.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/vb/vb.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/wgsl/wgsl.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/xml/xml.js delete mode 100644 webapp/public/js/monaco/vs/basic-languages/yaml/yaml.js delete mode 100644 webapp/public/js/monaco/vs/editor/editor.main.css delete mode 100644 webapp/public/js/monaco/vs/editor/editor.main.js delete mode 100644 webapp/public/js/monaco/vs/language/css/cssMode.js delete mode 100644 webapp/public/js/monaco/vs/language/css/cssWorker.js delete mode 100644 webapp/public/js/monaco/vs/language/html/htmlMode.js delete mode 100644 webapp/public/js/monaco/vs/language/html/htmlWorker.js delete mode 100644 webapp/public/js/monaco/vs/language/json/jsonMode.js delete mode 100644 webapp/public/js/monaco/vs/language/json/jsonWorker.js delete mode 100644 webapp/public/js/monaco/vs/language/typescript/tsMode.js delete mode 100644 webapp/public/js/monaco/vs/language/typescript/tsWorker.js delete mode 100644 webapp/public/js/monaco/vs/loader.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.de.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.es.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.fr.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.it.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.ja.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.ko.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.ru.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.zh-cn.js delete mode 100644 webapp/public/js/monaco/vs/nls.messages.zh-tw.js create mode 100644 webapp/yarn.lock diff --git a/.github/jobs/baseinstall.sh b/.github/jobs/baseinstall.sh index 50db376a52..40d1ab2103 100755 --- a/.github/jobs/baseinstall.sh +++ b/.github/jobs/baseinstall.sh @@ -28,6 +28,13 @@ composer install --no-scripts |tee "$ARTIFACTS"/composer_out.txt cd .. section_end +section_start "Install JS frontend dependencies" +cd webapp +apt-get update; apt-get install -y yarnpkg +yarnpkg install +cd .. +section_end + section_start "Set simple admin password" echo "password" > ./etc/initial_admin_password.secret echo "default login admin password password" > ~/.netrc diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 77a7a5852c..60d5fba2a1 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -42,6 +42,12 @@ jobs: cd webapp composer install --no-scripts + - name: Install frontend dependencies + if: ${{ contains(env.COMPILED, matrix.language) }} + run: | + cd webapp + yarnpkg install + - name: Configure Makefile if: ${{ contains(env.COMPILED, matrix.language) }} run: | diff --git a/Makefile b/Makefile index d6c99df521..910aeb1f8e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ export TOPDIR = $(shell pwd) REC_TARGETS=build domserver install-domserver judgehost install-judgehost \ docs install-docs inplace-install inplace-uninstall maintainer-conf \ - maintainer-install composer-dependencies composer-dependencies-dev + maintainer-install dependencies dependencies-dev # Global Makefile definitions include $(TOPDIR)/Makefile.global @@ -54,7 +54,7 @@ docs: paths.mk config install-domserver: domserver domserver-create-dirs install-judgehost: judgehost judgehost-create-dirs install-docs: docs-create-dirs -dist: configure composer-dependencies +dist: configure dependencies domserver-configure: ifneq "$(DOMSERVER_BUILD_ENABLED)" "yes" @@ -98,8 +98,8 @@ dist: SUBDIRS= lib sql misc-tools clean: SUBDIRS=etc doc lib sql judge misc-tools webapp distclean: SUBDIRS=etc doc lib sql judge misc-tools webapp maintainer-clean: SUBDIRS=etc doc lib sql judge misc-tools webapp -composer-dependencies: SUBDIRS= webapp -composer-dependencies-dev: SUBDIRS= webapp +dependencies: SUBDIRS= webapp +dependencies-dev: SUBDIRS= webapp domserver-create-dirs: $(INSTALL_DIR) $(addprefix $(DESTDIR),$(domserver_dirs)) @@ -191,8 +191,8 @@ paths.mk: @exit 1 # Configure for running in source tree, not meant for normal use: -maintainer-conf: inplace-conf-common composer-dependencies-dev -inplace-conf: inplace-conf-common composer-dependencies +maintainer-conf: inplace-conf-common dependencies-dev +inplace-conf: inplace-conf-common dependencies inplace-conf-common: dist ./configure $(subst 1,-q,$(QUIET)) --prefix=$(CURDIR) \ --with-domserver_root=$(CURDIR) \ @@ -385,5 +385,4 @@ clean-autoconf: .PHONY: $(addsuffix -create-dirs,domserver judgehost docs) check-root \ $(addprefix inplace-,conf conf-common install uninstall) \ $(addprefix maintainer-,conf install) clean-autoconf config distdocs \ - composer-dependencies composer-dependencies-dev \ - coverity-conf coverity-build + dependencies dependencies-dev coverity-conf coverity-build diff --git a/doc/manual/develop.rst b/doc/manual/develop.rst index 10952ad37f..7ba7483ce0 100644 --- a/doc/manual/develop.rst +++ b/doc/manual/develop.rst @@ -41,12 +41,12 @@ already listed under sudo apt install autoconf automake bats \ python3-sphinx python3-sphinx-rtd-theme fontconfig python3-yaml \ - latexmk texlive-latex-recommended texlive-latex-extra tex-gyre + latexmk yarnpkg texlive-latex-recommended texlive-latex-extra tex-gyre For Fedora use:: sudo dnf install git autoconf automake bats \ - sphinx-build python3-sphinx_rtd_theme latexmk texlive-cmap \ + sphinx-build python3-sphinx_rtd_theme latexmk yarnpkg texlive-cmap \ texlive-metafont texlive-tex-gyre texlive-fncychap texlive-wrapfig \ texlive-capt-of texlive-framed texlive-upquote texlive-needspace \ texlive-tabulary texlive-parskip texlive-oberdiek texlive-makeindex \ diff --git a/etc/domserver-static.php.in b/etc/domserver-static.php.in index e49796726a..2884196093 100644 --- a/etc/domserver-static.php.in +++ b/etc/domserver-static.php.in @@ -8,14 +8,15 @@ define('DOMJUDGE_VERSION', '@DOMJUDGE_VERSION@'); define('DOMJUDGE_INSTALL_METHOD', '@INSTALL_METHOD@'); -define('BINDIR', '@domserver_bindir@'); -define('ETCDIR', '@domserver_etcdir@'); -define('WEBAPPDIR', '@domserver_webappdir@'); -define('LIBDIR', '@domserver_libdir@'); -define('SQLDIR', '@domserver_sqldir@'); -define('VENDORDIR', '@domserver_webappdir@/vendor'); -define('LOGDIR', '@domserver_logdir@'); -define('RUNDIR', '@domserver_rundir@'); -define('TMPDIR', '@domserver_tmpdir@'); +define('BINDIR', '@domserver_bindir@'); +define('ETCDIR', '@domserver_etcdir@'); +define('WEBAPPDIR', '@domserver_webappdir@'); +define('LIBDIR', '@domserver_libdir@'); +define('SQLDIR', '@domserver_sqldir@'); +define('VENDORDIR', '@domserver_webappdir@/vendor'); +define('NODEMODULESDIR', '@domserver_webappdir@/node_modules'); +define('LOGDIR', '@domserver_logdir@'); +define('RUNDIR', '@domserver_rundir@'); +define('TMPDIR', '@domserver_tmpdir@'); -define('BASEURL', '@BASEURL@'); +define('BASEURL', '@BASEURL@'); diff --git a/webapp/.gitignore b/webapp/.gitignore index 70a4c6b3b2..dedaef8acc 100644 --- a/webapp/.gitignore +++ b/webapp/.gitignore @@ -8,6 +8,7 @@ /var/log/* !var/log/.gitkeep /vendor/ +/node_modules/ ###> phpunit/phpunit ### /phpunit.xml diff --git a/webapp/Makefile b/webapp/Makefile index 5eac62ea13..a9274772c5 100644 --- a/webapp/Makefile +++ b/webapp/Makefile @@ -11,6 +11,8 @@ SUBDIRS = config domserver: composer-dump-autoload +dependencies: composer-dependencies node-dependencies + # Install PHP dependencies composer-dependencies: ifeq (, $(shell command -v composer 2> /dev/null)) @@ -20,6 +22,8 @@ endif # not generated yet, which is needed to run the post-install scripts. composer $(subst 1,-q,$(QUIET)) install --prefer-dist -o -a --no-scripts --no-plugins +dependencies-dev: composer-dependencies-dev node-dependencies + composer-dependencies-dev: composer $(subst 1,-q,$(QUIET)) install --prefer-dist --no-scripts --no-plugins @@ -36,6 +40,13 @@ vendor/autoload_runtime.php: composer-dump-autoload-dev: composer $(subst 1,-q,$(QUIET)) dump-autoload +node-dependencies: +ifeq (, $(shell command -v yarn || command -v yarnpkg 2> /dev/null)) + $(error "neither 'yarnpkg' nor 'yarn' command found in $(PATH), install it via your package manager or https://yarnpkg.com/cli/node") +endif + @YARN_CMD=$(shell command -v yarn || command -v yarnpkg); \ + $$YARN_CMD install + # Run Symfony in dev mode (for maintainer-mode): .env.local: @echo "Creating file '$@'..." @@ -58,7 +69,7 @@ install-domserver: # This must be done first to install with the rest. $(MAKE) copy-bundle-assets $(INSTALL_DIR) $(DESTDIR)$(domserver_webappdir); - for d in bin config migrations public resources src templates tests vendor; do \ + for d in bin config migrations public resources src templates tests vendor node_modules; do \ $(call install_tree,$(DESTDIR)$(domserver_webappdir),$$d) ; \ done # Add Symlink to Symfony console that is in the standard path @@ -78,5 +89,5 @@ maintainer-clean-l: done ; \ done -.PHONY: composer-dump-autoload composer-dump-autoload-dev \ - copy-bundle-assets +.PHONY: composer-dump-autoload composer-dump-autoload-dev copy-bundle-assets \ + composer-dependencies composer-dependencies-dev node-dependencies diff --git a/webapp/composer.json b/webapp/composer.json index b3930db922..4885128f1a 100644 --- a/webapp/composer.json +++ b/webapp/composer.json @@ -63,7 +63,6 @@ "doctrine/doctrine-fixtures-bundle": "^4.0", "doctrine/doctrine-migrations-bundle": "^3.2", "doctrine/orm": "^2.14", - "eligrey/filesaver": "2.*", "enshrined/svg-sanitize": "^0.22.0", "fortawesome/font-awesome": "6.*", "friendsofsymfony/rest-bundle": "^3.5", @@ -71,16 +70,13 @@ "jms/serializer-bundle": "^5.2", "knplabs/knp-paginator-bundle": "^6.6", "league/commonmark": "^2.3", - "mbostock/d3": "^3.5", "nelmio/api-doc-bundle": "^5.0", "nelmio/cors-bundle": "^2.4", - "novus/nvd3": "^1.8", "phpdocumentor/reflection-docblock": "^5.3", "phpstan/phpdoc-parser": "^2.0", "promphp/prometheus_client_php": "^2.6", "ramsey/uuid": "^4.2", "riverline/multipart-parser": "^2.1", - "select2/select2": "4.*", "sentry/sentry-symfony": "^5.0", "symfony/asset": "6.4.*", "symfony/browser-kit": "6.4.*", diff --git a/webapp/composer.lock b/webapp/composer.lock index c6b0c1bcbb..99a5839324 100644 --- a/webapp/composer.lock +++ b/webapp/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "88f6e44e48730e8efd3a8ccaeefb5ed7", + "content-hash": "629e7d2150fc6058701b85863ce56292", "packages": [ { "name": "apalfrey/select2-bootstrap-5-theme", @@ -1852,15 +1852,6 @@ }, "time": "2025-01-24T11:45:48+00:00" }, - { - "name": "eligrey/filesaver", - "version": "2.0.4", - "dist": { - "type": "zip", - "url": "https://github.com/eligrey/FileSaver.js/archive/v2.0.4.zip" - }, - "type": "library" - }, { "name": "enshrined/svg-sanitize", "version": "0.22.0", @@ -3089,49 +3080,6 @@ }, "time": "2024-03-31T07:05:07+00:00" }, - { - "name": "mbostock/d3", - "version": "v3.5.17", - "source": { - "type": "git", - "url": "https://github.com/mbostock/d3.git", - "reference": "9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mbostock/d3/zipball/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74", - "reference": "9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74", - "shasum": "" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Mike Bostock", - "homepage": "http://bost.ocks.org/mike" - } - ], - "description": "A JavaScript visualization library for HTML and SVG.", - "homepage": "http://d3js.org/", - "keywords": [ - "W3C", - "animation", - "canvas", - "dom", - "svg", - "visualization" - ], - "support": { - "API": "https://github.com/mbostock/d3/wiki/API-Reference", - "issues": "https://github.com/mbostock/d3/issues", - "source": "https://github.com/mbostock/d3", - "wiki": "https://github.com/mbostock/d3/wiki" - }, - "time": "2016-05-05T00:29:22+00:00" - }, { "name": "monolog/monolog", "version": "3.9.0", @@ -3626,59 +3574,6 @@ }, "time": "2025-05-31T08:24:38+00:00" }, - { - "name": "novus/nvd3", - "version": "v1.8.6", - "source": { - "type": "git", - "url": "https://github.com/novus/nvd3.git", - "reference": "d273ea52d91b482d044f8cef1e921256f2bfddcd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/novus/nvd3/zipball/d273ea52d91b482d044f8cef1e921256f2bfddcd", - "reference": "d273ea52d91b482d044f8cef1e921256f2bfddcd", - "shasum": "" - }, - "require": { - "mbostock/d3": "@stable" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bob Monteverde" - }, - { - "name": "Tyler Wolf" - }, - { - "name": "Robin Hu" - }, - { - "name": "Frank Shao" - }, - { - "name": "liquidpele" - } - ], - "description": "A reusable charting library written in d3.js", - "homepage": "https://github.com/novus/nvd3", - "keywords": [ - "chart", - "d3", - "graph", - "nvd3" - ], - "support": { - "issues": "https://github.com/novus/nvd3/issues", - "source": "https://github.com/novus/nvd3/tree/v1.8.6" - }, - "time": "2017-08-24T01:23:44+00:00" - }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -4581,48 +4476,6 @@ }, "time": "2025-04-29T08:38:14+00:00" }, - { - "name": "select2/select2", - "version": "4.0.13", - "source": { - "type": "git", - "url": "https://github.com/select2/select2.git", - "reference": "45f2b83ceed5231afa7b3d5b12b58ad335edd82e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/select2/select2/zipball/45f2b83ceed5231afa7b3d5b12b58ad335edd82e", - "reference": "45f2b83ceed5231afa7b3d5b12b58ad335edd82e", - "shasum": "" - }, - "type": "component", - "extra": { - "component": { - "files": [ - "dist/js/select2.js", - "dist/js/i18n/*.js", - "dist/css/select2.css" - ], - "styles": [ - "dist/css/select2.css" - ], - "scripts": [ - "dist/js/select2.js" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Select2 is a jQuery based replacement for select boxes.", - "homepage": "https://select2.org/", - "support": { - "issues": "https://github.com/select2/select2/issues", - "source": "https://github.com/select2/select2/tree/4.0.13" - }, - "time": "2020-01-28T05:01:22+00:00" - }, { "name": "sentry/sentry", "version": "4.14.1", diff --git a/webapp/config/static.yaml.in b/webapp/config/static.yaml.in index 9a3d23ec76..84a5a8ab91 100644 --- a/webapp/config/static.yaml.in +++ b/webapp/config/static.yaml.in @@ -9,6 +9,7 @@ parameters: domjudge.libdir: @domserver_libdir@ domjudge.sqldir: @domserver_sqldir@ domjudge.vendordir: @domserver_webappdir@/vendor + domjudge.nodemodulesdir: @domserver_webappdir@/node_modules domjudge.logdir: @domserver_logdir@ domjudge.rundir: @domserver_rundir@ domjudge.tmpdir: @domserver_tmpdir@ diff --git a/webapp/package.json b/webapp/package.json new file mode 100644 index 0000000000..80d349ca3c --- /dev/null +++ b/webapp/package.json @@ -0,0 +1,12 @@ +{ + "dependencies": { + "@melloware/coloris": "^0.25.0", + "bootstrap-toggle": "^2.2.2", + "d3": "3.5.17", + "file-saver": "^2.0.5", + "jquery-debounce-throttle": "^1.0.6-rc.0", + "monaco": "^1.201704190613.0", + "nvd3": "1.8.6", + "select2": "^4.0.13" + } +} diff --git a/webapp/public/css/nv.d3.min.css b/webapp/public/css/nv.d3.min.css index 9a26ecc6cd..f04472c55d 120000 --- a/webapp/public/css/nv.d3.min.css +++ b/webapp/public/css/nv.d3.min.css @@ -1 +1 @@ -../../vendor/novus/nvd3/build/nv.d3.min.css \ No newline at end of file +../../node_modules/nvd3/build/nv.d3.min.css \ No newline at end of file diff --git a/webapp/public/css/nv.d3.min.css.map b/webapp/public/css/nv.d3.min.css.map index 220b5722a5..6519ed8a66 120000 --- a/webapp/public/css/nv.d3.min.css.map +++ b/webapp/public/css/nv.d3.min.css.map @@ -1 +1 @@ -../../vendor/novus/nvd3/build/nv.d3.min.css.map \ No newline at end of file +../../node_modules/nvd3/build/nv.d3.min.css.map \ No newline at end of file diff --git a/webapp/public/css/select2.min.css b/webapp/public/css/select2.min.css index adb8a9e6fc..ff13487987 120000 --- a/webapp/public/css/select2.min.css +++ b/webapp/public/css/select2.min.css @@ -1 +1 @@ -../../vendor/select2/select2/dist/css/select2.min.css \ No newline at end of file +../../node_modules/select2/dist/css/select2.min.css \ No newline at end of file diff --git a/webapp/public/js/FileSaver.min.js b/webapp/public/js/FileSaver.min.js index 2d4de7b278..54e4aeea16 120000 --- a/webapp/public/js/FileSaver.min.js +++ b/webapp/public/js/FileSaver.min.js @@ -1 +1 @@ -../../vendor/eligrey/filesaver/dist/FileSaver.min.js \ No newline at end of file +../../node_modules/file-saver/dist/FileSaver.min.js \ No newline at end of file diff --git a/webapp/public/js/FileSaver.min.js.map b/webapp/public/js/FileSaver.min.js.map index 8c92a5a1b1..85c7a83595 120000 --- a/webapp/public/js/FileSaver.min.js.map +++ b/webapp/public/js/FileSaver.min.js.map @@ -1 +1 @@ -../../vendor/eligrey/filesaver/dist/FileSaver.min.js.map \ No newline at end of file +../../node_modules/file-saver/dist/FileSaver.min.js.map \ No newline at end of file diff --git a/webapp/public/js/bootstrap-toggle.min.js b/webapp/public/js/bootstrap-toggle.min.js deleted file mode 100644 index 37113200bf..0000000000 --- a/webapp/public/js/bootstrap-toggle.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! ======================================================================== - * Bootstrap Toggle: bootstrap-toggle.js v2.2.0 - * http://www.bootstraptoggle.com - * ======================================================================== - * Copyright 2014 Min Hur, The New York Times Company - * Licensed under MIT - * ======================================================================== */ -+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('