Added libs

This commit is contained in:
Lucas
2026-01-25 13:55:46 +10:00
parent 575c682afc
commit f70af3c4ea
229 changed files with 26983 additions and 0 deletions

137
vueNoSys/vueNoSys.py Normal file
View File

@@ -0,0 +1,137 @@
import os
import json
import pathlib
import shutil
import subprocess
from tempfile import mkstemp
from shutil import move, copymode
from os import fdopen, remove
from threading import Thread
from libs.noSys.noSysModule import NoSysModule
from libs.vueNoSys.vueNoSysApiBlueprint import Blueprint
from libs.app.common.logging import get_logger
from libs.app.common.paths import ROOT_DIR
from libs.app.common.network_utils import check_url
logger = get_logger()
class VueNoSys(NoSysModule):
def __init__(self, nosys_core):
super().__init__(nosys_core)
self.server_port = self.config.get("server", {"port":"3001"}).get("port", "3001")
self.npm_cmd = "npm.cmd" if os.name == "nt" else "npm"
self.npm_cwd = os.path.join(pathlib.Path(__file__).parent.resolve())
def setup(self):
self.nosys_core.modules.api.register_blueprint(Blueprint(self).blueprint)
self.move_modules_vue_files()
self.install_modules_dependencies()
self.config_env()
self.check_npm_version()
if self.config.get("server", {"enabled":False}).get("enabled", False):
self.run_npm_dev()
self.run_npm_build()
def on_nosys_ready(self, event):
pass
def check_npm_version(self):
try:
out = subprocess.check_output([self.npm_cmd, "--version"], shell=True, cwd=self.npm_cwd)
except subprocess.CalledProcessError:
# TODO Open npm download page
logger.exception("Command NPM version failed. Please install Node.js to fix this error. https://nodejs.org/en/download")
return None
logger.debug(f"NPM Version {out.decode()}")
def run_npm_dev(self):
try:
dev_server_url = f"https://localhost:{self.server_port}"
if check_url(dev_server_url, timeout=3, retries=2):
logger.debug(f"Not starting dev server - HTTP already running in {dev_server_url}")
return
subprocess.check_call([self.npm_cmd, "install"], shell=True, cwd=self.npm_cwd)
flag = subprocess.CREATE_NEW_CONSOLE # subprocess.CREATE_NO_WINDOW
npm_process = subprocess.Popen([self.npm_cmd, "run", "dev"], cwd=self.npm_cwd, creationflags=flag)
logger.debug(f"NPM dev server started, PID={npm_process.pid}")
except:
logger.exception(f"Failed to start npm dev server")
def run_npm_build(self):
try:
subprocess.check_call([self.npm_cmd, "install"], cwd=self.npm_cwd)
subprocess.check_call([self.npm_cmd, "run", "build"], cwd=self.npm_cwd)
logger.info("Vue build completed successfully")
except:
logger.exception(f"Failed to build Vue frontend")
return None
return os.path.join(self.npm_cwd, "dist")
def install_modules_dependencies(self, lib_id=None):
modules_path = os.path.join(pathlib.Path(__file__).parent.resolve(), 'src', 'modules')
modules = [lib_id] if lib_id else os.listdir(modules_path)
for module in modules:
module_path = os.path.join(modules_path, module)
dep_file = os.path.join(module_path, "dependencies.txt")
if os.path.exists(dep_file):
with open(dep_file, "r") as f:
dependencies = [
line.strip() for line in f.readlines() if line.strip()
]
if dependencies:
logger.debug(f"Installing dependencies for {module}: {dependencies}")
try:
subprocess.run(
["npm.cmd", "install"] + dependencies,
cwd=self.npm_cwd,
check=True
)
except:
logger.exception(f"Error installing dependencies for module {module}")
else:
logger.debug(f"Module {module} has no dependencies.txt")
def move_modules_vue_files(self):
for lib in self.nosys_core.config.get("app", "libs"):
lib_id = lib.get("id")
frontend = self.nosys_core.config.get(lib_id, "info", "frontend")
if frontend == 'vue':
from_path = os.path.join(ROOT_DIR, 'libs', lib_id, 'vue')
to_path = os.path.join(pathlib.Path(__file__).parent.resolve(), 'src', 'modules', lib_id)
if(os.path.exists(from_path)):
if(os.path.exists(to_path)):
shutil.rmtree(to_path)
pathlib.Path(to_path).mkdir(parents=True, exist_ok=True)
try:
for file_name in os.listdir(from_path):
shutil.move(os.path.join(from_path, file_name), os.path.join(to_path, file_name))
shutil.rmtree(from_path)
except Exception as e:
logger.error(f'Error while moving files from {os.path.join(from_path, file_name)} to {os.path.join(to_path, file_name)}: {e}')
def config_env(self):
api_config = self.nosys_core.config.get("api")
env_file = os.path.join(pathlib.Path(__file__).parent.resolve(), '.env')
fh, abs_path = mkstemp()
with fdopen(fh,'w') as new_file:
with open(env_file) as old_file:
for line in old_file:
if "VITE_PORT=" in line:
line = f"VITE_PORT={self.server_port}\n"
elif "VITE_BACKEND_API_HOST=" in line:
vite_backend_api_host = api_config["server"]["host"]
line = f"VITE_BACKEND_API_HOST=https://{vite_backend_api_host}\n"
elif "VITE_BACKEND_API_PORT=" in line:
vite_backend_api_port = api_config["server"]["port"]
line = f"VITE_BACKEND_API_PORT={vite_backend_api_port}\n"
new_file.write(line)
copymode(env_file, abs_path)
remove(env_file)
move(abs_path, env_file)