From d81dfc30682aecd9dabf94e6ee192fbdbd0f7fd1 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 18 Dec 2022 11:34:36 +0100
Subject: [PATCH] Refactor vite call out into utility function

---
 .../core/management/commands/vite_bundle.py   | 23 ++---------
 aleksis/core/util/frontend_helpers.py         | 38 +++++++++++++++++++
 aleksis/core/vite.config.js                   |  3 ++
 3 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/aleksis/core/management/commands/vite_bundle.py b/aleksis/core/management/commands/vite_bundle.py
index c230fc2f4..01ab9654b 100644
--- a/aleksis/core/management/commands/vite_bundle.py
+++ b/aleksis/core/management/commands/vite_bundle.py
@@ -1,13 +1,11 @@
-import json
 import os
-import shutil
 
 from django.conf import settings
 
 from django_yarnpkg.management.base import BaseYarnCommand
 from django_yarnpkg.yarn import yarn_adapter
 
-from ...util.frontend_helpers import get_apps_with_assets
+from ...util.frontend_helpers import run_vite, write_vite_values
 
 
 class Command(BaseYarnCommand):
@@ -17,23 +15,10 @@ class Command(BaseYarnCommand):
         super(Command, self).handle(*args, **options)
 
         # Inject settings into Vite
-        vite_values = {
-            "static_url": settings.STATIC_URL,
-        }
-        # Write rollup entrypoints for all apps
-        vite_values["entrypoints"] = {
-            app: os.path.join(path, "index")
-            for app, path in get_apps_with_assets().items()
-        }
-        vite_values["entrypoints"]["core"] = os.path.join(settings.BASE_DIR, "aleksis", "core", "assets", "index")
-        with open(os.path.join(settings.NODE_MODULES_ROOT, "django-vite-values.json"), "w") as out:
-            json.dump(vite_values, out)
+        write_vite_values(os.path.join(settings.NODE_MODULES_ROOT, "django-vite-values.json"))
 
         # Install Node dependencies
         yarn_adapter.install(settings.YARN_INSTALLED_APPS)
 
-        # Run Vite
-        config_path = os.path.join(settings.BASE_DIR, "aleksis", "core", "vite.config.js")
-        shutil.copy(config_path, settings.NODE_MODULES_ROOT)
-        mode = "development" if settings.DEBUG else "production"
-        yarn_adapter.call_yarn(["run", "vite", "build", "-m", mode])
+        # Run Vite build
+        run_vite(["build"])
diff --git a/aleksis/core/util/frontend_helpers.py b/aleksis/core/util/frontend_helpers.py
index 664707500..379802465 100644
--- a/aleksis/core/util/frontend_helpers.py
+++ b/aleksis/core/util/frontend_helpers.py
@@ -1,7 +1,12 @@
+import json
 import os
+import shutil
+from typing import Any, Optional, Sequence
 
 from django.conf import settings
 
+from django_yarnpkg.yarn import yarn_adapter
+
 from .core_helpers import get_app_module, get_app_packages
 
 
@@ -17,6 +22,39 @@ def get_apps_with_assets():
     return assets
 
 
+def write_vite_values(out_path: str) -> dict[str, Any]:
+    vite_values = {
+        "static_url": settings.STATIC_URL,
+    }
+    # Write rollup entrypoints for all apps
+    vite_values["entrypoints"] = {
+        app: os.path.join(path, "index") for app, path in get_apps_with_assets().items()
+    }
+    vite_values["entrypoints"]["core"] = os.path.join(
+        settings.BASE_DIR, "aleksis", "core", "assets", "index"
+    )
+    with open(out_path, "w") as out:
+        json.dump(vite_values, out)
+
+
+def run_vite(args: Optional[Sequence[str]] = None) -> None:
+    args = list(args) if args else []
+
+    config_path = os.path.join(settings.BASE_DIR, "aleksis", "core", "vite.config.js")
+    shutil.copy(config_path, settings.NODE_MODULES_ROOT)
+
+    mode = "development" if settings.DEBUG else "production"
+    args += ["-m", mode]
+
+    log_level = settings.LOGGING["root"]["level"]
+    if settings.DEBUG or log_level == "DEBUG":
+        args.append("-d")
+    log_level = {"INFO": "info", "WARNING": "warn", "ERROR": "error"}.get(log_level, "silent")
+    args += ["-l", log_level]
+
+    yarn_adapter.call_yarn(["run", "vite"] + args)
+
+
 def get_language_cookie(code: str) -> str:
     """Build a cookie string to set a new language."""
     cookie_parts = [f"{settings.LANGUAGE_COOKIE_NAME}={code}"]
diff --git a/aleksis/core/vite.config.js b/aleksis/core/vite.config.js
index b917bbef0..f48cb2d6b 100644
--- a/aleksis/core/vite.config.js
+++ b/aleksis/core/vite.config.js
@@ -19,6 +19,9 @@ export default defineConfig({
       plugins: [nodeResolve({modulePaths: [path.resolve("./node_modules")]}), graphql()],
     },
   },
+  server: {
+    strictPort: true,
+  },
   plugins: [vue()],
   resolve: {
     alias: {
-- 
GitLab