From 09fa7b74fa5987a4019aa0c956a7a20d716c6107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Krzeslak?= Date: Sat, 24 Oct 2026 16:23:37 +0200 Subject: [PATCH] feat: migrate from clientside javascript to elysiajs eden # Conflicts: # public/script.js # src/index.tsx --- .gitignore | 2 + bun.lock | 3 + bunfig.toml | 2 + eslint.config.ts | 2 +- package.json | 8 +- public/results.js | 38 ----- public/results.ts | 46 ++++++ public/script.js | 252 ------------------------------- public/script.ts | 331 +++++++++++++++++++++++++++++++++++++++++ src/eden.ts | 40 +++++ src/index.tsx | 9 ++ tests/eden/app.test.ts | 63 ++++++++ tsconfig.eslint.json | 2 +- tsconfig.json | 4 +- 14 files changed, 505 insertions(+), 297 deletions(-) delete mode 100644 public/results.js create mode 100644 public/results.ts create mode 100644 public/script.ts create mode 100644 src/eden.ts create mode 100644 tests/eden/app.test.ts diff --git a/.gitignore b/.gitignore index 6fb8d4d..3c91b40 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,5 @@ package-lock.json /Bruno /tsconfig.tsbuildinfo /public/generated.css +/public/results.js +/public/script.js diff --git a/bun.lock b/bun.lock index c64edcd..82af52c 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "convertx-frontend", "dependencies": { + "@elysiajs/eden": "^1.4.9", "@elysiajs/html": "^1.4.2", "@elysiajs/jwt": "^1.4.2", "@elysiajs/static": "^1.4.10", @@ -48,6 +49,8 @@ "@dual-bundle/import-meta-resolve": ["@dual-bundle/import-meta-resolve@4.2.1", "", {}, "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg=="], + "@elysiajs/eden": ["@elysiajs/eden@1.4.9", "", { "peerDependencies": { "elysia": ">=1.4.19" } }, "sha512-3CKVD4ycVjB8nCNssfmhnUuq3SzSHkUES3v5PNCFr9LxIrx39/HVRAZ8z2sLxrFqzUs48dCBZaxoZzJ5UUVHDA=="], + "@elysiajs/html": ["@elysiajs/html@1.4.2", "", { "dependencies": { "@kitajs/html": "^4.1.0", "@kitajs/ts-html-plugin": "^4.0.1" }, "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-Db7dmbkN7gptckMpU0/Fq9Qi3QuhQr/CH60A+8rs+RT+74NUC8sONs5nkfMm5oL+6kCUWCv19uUwOjBP7zsjYQ=="], "@elysiajs/jwt": ["@elysiajs/jwt@1.4.2", "", { "dependencies": { "jose": "^6.0.11" }, "peerDependencies": { "elysia": ">= 1.4.27" } }, "sha512-gSPjF8KoL7cQIxL3kb+Ui9g5jpBdO4iUTe2+F52w66JVFct2K8cTLum8PEArxRZNg4PBrg100h6i1bJ2zfcqMg=="], diff --git a/bunfig.toml b/bunfig.toml index deb6d9b..c96f47e 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -2,6 +2,7 @@ preload = ["./tests/preload.ts"] coverage = true coveragePathIgnorePatterns = ["tests/converters/helpers/commonTests.ts"] +pathIgnorePatterns = ["**/integration/**"] [fmt] arrowParens = "always" @@ -13,3 +14,4 @@ sortImports = true sortTailwindcss = false sortPackageJson = true jsdoc = true +ignorePatterns = ["public/*.js"] diff --git a/eslint.config.ts b/eslint.config.ts index 8b493b3..fcab69d 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -6,7 +6,7 @@ import tseslint, { parser as eslintParserTypeScript } from "typescript-eslint"; export default defineConfig( { - ignores: ["**/node_modules/**", "dist/**"], + ignores: ["**/node_modules/**", "dist/**", "**/public/**/*.js"], }, js.configs.recommended, tseslint.configs.recommended, diff --git a/package.json b/package.json index 62c7d96..c691d5d 100644 --- a/package.json +++ b/package.json @@ -10,20 +10,22 @@ "format:eslint": "eslint --fix .", "format:prettier": "bun fmt", "build:css": "bun x @tailwindcss/cli -i ./src/main.css -o ./public/generated.css", + "build:client": "bun build public/script.ts public/results.ts --outdir public/ --target browser --minify", "build:js": "tsc", - "build:bin": "bun run build:css && bun build --compile --minify --sourcemap --bytecode --format=esm --define 'process.env.NODE_ENV=\"production\"' src/index.tsx --outfile dist/convertx", + "build:bin": "bun run build:css && bun run build:client && bun build --compile --minify --sourcemap --bytecode --format=esm --define 'process.env.NODE_ENV=\"production\"' src/index.tsx --outfile dist/convertx", "build:docker": "docker compose build", - "build": "bun run build:css && bun run build:js", + "build": "bun run build:css && bun run build:client && bun run build:js", "lint": "npm-run-all 'lint:*'", "lint:tsc": "bun check", "lint:knip": "knip", "lint:eslint": "eslint .", "lint:prettier": "bun fmt --check", "lint:xss": "xss-scan", - "test": "bun test --path-ignore-patterns=tests/integration", + "test": "bun test", "test:integration": "docker build --target test -t convertx:test . && docker run --rm -t -v ./tests:/app/tests -v ./src:/app/src -v ./package.json:/app/package.json convertx:test bun test tests/integration" }, "dependencies": { + "@elysiajs/eden": "^1.4.9", "@elysiajs/html": "^1.4.2", "@elysiajs/jwt": "^1.4.2", "@elysiajs/static": "^1.4.10", diff --git a/public/results.js b/public/results.js deleted file mode 100644 index 60c07eb..0000000 --- a/public/results.js +++ /dev/null @@ -1,38 +0,0 @@ -const webroot = document.querySelector("meta[name='webroot']").content; -const jobId = window.location.pathname.split("/").pop(); -const main = document.querySelector("main"); -let progressElem = document.querySelector("progress"); - -const refreshData = () => { - // console.log("Refreshing data...", progressElem.value, progressElem.max); - if (progressElem.value !== progressElem.max) { - fetch(`${webroot}/progress/${jobId}`, { - method: "POST", - }) - .then((res) => res.text()) - .then((html) => { - main.innerHTML = html; - }) - .catch((err) => console.log(err)); - - setTimeout(refreshData, 1000); - } - - progressElem = document.querySelector("progress"); -}; - -refreshData(); - -window.downloadAll = function () { - // Get all download links - const downloadLinks = document.querySelectorAll("tbody a[download]"); - - // Trigger download for each link - downloadLinks.forEach((link, index) => { - // We add a delay for each download to prevent them from starting at the same time - setTimeout(() => { - const event = new MouseEvent("click"); - link.dispatchEvent(event); - }, index * 300); - }); -}; diff --git a/public/results.ts b/public/results.ts new file mode 100644 index 0000000..ba68794 --- /dev/null +++ b/public/results.ts @@ -0,0 +1,46 @@ +// Results page logic — monitors conversion progress via polling. +// Loaded as a