From 81f109f8304768cb873a3a836a29cd7824f45c0c Mon Sep 17 00:00:00 2001 From: C4illin Date: Thu, 7 Aug 2025 23:28:02 +0200 Subject: [PATCH] chore: format files --- .github/ISSUE_TEMPLATE/bug_report.md | 7 ++--- .github/ISSUE_TEMPLATE/converter_request.md | 10 ++++--- .github/ISSUE_TEMPLATE/feature_request.md | 3 +-- CHANGELOG.md | 3 +-- README.md | 1 - renovate.json | 5 +--- src/converters/calibre.ts | 28 +++++++++---------- src/converters/main.ts | 30 +++++++++------------ src/converters/msgconvert.ts | 12 ++++++--- src/helpers/env.ts | 7 +++-- src/pages/convert.tsx | 5 ++++ src/pages/download.tsx | 17 +++++++++--- src/pages/results.tsx | 6 ++--- src/pages/root.tsx | 4 ++- src/theme/theme.css | 2 +- 15 files changed, 77 insertions(+), 63 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 175d11a..d6ed108 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,10 +1,9 @@ --- name: Bug report about: Create a report to help us improve -title: '' +title: "" labels: bug -assignees: '' - +assignees: "" --- **Describe the bug** @@ -12,10 +11,12 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Checklist:** + - [ ] I am accessing ConvertX over HTTPS or have `HTTP_ALLOWED=true` diff --git a/.github/ISSUE_TEMPLATE/converter_request.md b/.github/ISSUE_TEMPLATE/converter_request.md index 609d75d..910feec 100644 --- a/.github/ISSUE_TEMPLATE/converter_request.md +++ b/.github/ISSUE_TEMPLATE/converter_request.md @@ -3,20 +3,24 @@ name: Converter request about: Suggest an converter for this project title: "[Converter Request]" labels: "converter request" -assignees: '' - +assignees: "" --- **What file formats is missing?** + **What converter should be added** + **Are you willing to add it?** + + - [ ] Yes - [ ] No **Additional context** - \ No newline at end of file + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 7e3bd6b..5140554 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -3,8 +3,7 @@ name: Feature request about: Suggest an idea for this project title: "[Feature Request]" labels: enhancement -assignees: '' - +assignees: "" --- **Describe the solution you'd like** diff --git a/CHANGELOG.md b/CHANGELOG.md index 0654d68..49b69ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,9 @@ ## [0.14.1](https://github.com/C4illin/ConvertX/compare/v0.14.0...v0.14.1) (2025-06-04) - ### Bug Fixes -* change to baseline build ([6ea3058](https://github.com/C4illin/ConvertX/commit/6ea3058e66262f7a14633bddcecd5573948f524a)), closes [#311](https://github.com/C4illin/ConvertX/issues/311) +- change to baseline build ([6ea3058](https://github.com/C4illin/ConvertX/commit/6ea3058e66262f7a14633bddcecd5573948f524a)), closes [#311](https://github.com/C4illin/ConvertX/issues/311) ## [0.14.0](https://github.com/C4illin/ConvertX/compare/v0.13.0...v0.14.0) (2025-06-03) diff --git a/README.md b/README.md index 3d24b74..446a4e9 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,6 @@ All are optional, JWT_SECRET is recommended to be set. | LANGUAGE | en | Language to format date strings in, specified as a [BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) | | UNAUTHENTICATED_USER_SHARING | false | Shares conversion history between all unauthenticated users | - ### Docker images There is a `:latest` tag that is updated with every release and a `:main` tag that is updated with every push to the main branch. `:latest` is recommended for normal use. diff --git a/renovate.json b/renovate.json index eac34ee..ec32b06 100644 --- a/renovate.json +++ b/renovate.json @@ -5,8 +5,5 @@ "enabled": true, "automerge": true }, - "ignoreDeps": [ - "bun-types", - "@types/bun" - ] + "ignoreDeps": ["bun-types", "@types/bun"] } diff --git a/src/converters/calibre.ts b/src/converters/calibre.ts index 8ebdbd1..f217b07 100644 --- a/src/converters/calibre.ts +++ b/src/converters/calibre.ts @@ -66,24 +66,20 @@ export async function convert( options?: unknown, ): Promise { return new Promise((resolve, reject) => { - execFile( - "ebook-convert", - [filePath, targetPath], - (error, stdout, stderr) => { - if (error) { - reject(`error: ${error}`); - } + execFile("ebook-convert", [filePath, targetPath], (error, stdout, stderr) => { + if (error) { + reject(`error: ${error}`); + } - if (stdout) { - console.log(`stdout: ${stdout}`); - } + if (stdout) { + console.log(`stdout: ${stdout}`); + } - if (stderr) { - console.error(`stderr: ${stderr}`); - } + if (stderr) { + console.error(`stderr: ${stderr}`); + } - resolve("Done"); - }, - ); + resolve("Done"); + }); }); } diff --git a/src/converters/main.ts b/src/converters/main.ts index 63106ff..c74ff62 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -1,3 +1,4 @@ +import { Cookie } from "elysia"; import db from "../db/db"; import { MAX_CONVERT_PROCESS } from "../helpers/env"; import { normalizeFiletype, normalizeOutputFiletype } from "../helpers/normalizeFiletype"; @@ -119,11 +120,11 @@ const properties: Record< }; function chunks(arr: T[], size: number): T[][] { - if(size <= 0){ - return [arr] + if (size <= 0) { + return [arr]; } return Array.from({ length: Math.ceil(arr.length / size) }, (_: T, i: number) => - arr.slice(i * size, i * size + size) + arr.slice(i * size, i * size + size), ); } @@ -133,17 +134,15 @@ export async function handleConvert( userOutputDir: string, convertTo: string, converterName: string, - jobId: any + jobId: Cookie, ) { - const query = db.query( "INSERT INTO file_names (job_id, file_name, output_file_name, status) VALUES (?1, ?2, ?3, ?4)", ); - for (const chunk of chunks(fileNames, MAX_CONVERT_PROCESS)) { const toProcess: Promise[] = []; - for(const fileName of chunk) { + for (const fileName of chunk) { const filePath = `${userUploadsDir}${fileName}`; const fileTypeOrig = fileName.split(".").pop() ?? ""; const fileType = normalizeFiletype(fileTypeOrig); @@ -154,21 +153,16 @@ export async function handleConvert( ); const targetPath = `${userOutputDir}${newFileName}`; toProcess.push( - new Promise((resolve, reject) => { - mainConverter( - filePath, - fileType, - convertTo, - targetPath, - {}, - converterName, - ).then(r => { + new Promise((resolve, reject) => { + mainConverter(filePath, fileType, convertTo, targetPath, {}, converterName) + .then((r) => { if (jobId.value) { query.run(jobId.value, fileName, newFileName, r); } resolve(r); - }).catch(c => reject(c)); - }) + }) + .catch((c) => reject(c)); + }), ); } await Promise.all(toProcess); diff --git a/src/converters/msgconvert.ts b/src/converters/msgconvert.ts index b6bf826..8e95496 100644 --- a/src/converters/msgconvert.ts +++ b/src/converters/msgconvert.ts @@ -23,7 +23,7 @@ export function convert( // msgconvert will output to the same directory as the input file with .eml extension // We need to use --outfile to specify the target path const args = ["--outfile", targetPath, filePath]; - + execFile("msgconvert", args, (error, stdout, stderr) => { if (error) { reject(new Error(`msgconvert failed: ${error.message}`)); @@ -33,13 +33,19 @@ export function convert( if (stderr) { // Log sanitized stderr to avoid exposing sensitive paths const sanitizedStderr = stderr.replace(/(\/[^\s]+)/g, "[REDACTED_PATH]"); - console.warn(`msgconvert stderr: ${sanitizedStderr.length > 200 ? sanitizedStderr.slice(0, 200) + '...' : sanitizedStderr}`); + console.warn( + `msgconvert stderr: ${sanitizedStderr.length > 200 ? sanitizedStderr.slice(0, 200) + "..." : sanitizedStderr}`, + ); } resolve(targetPath); }); } else { - reject(new Error(`Unsupported conversion from ${fileType} to ${convertTo}. Only MSG to EML conversion is currently supported.`)); + reject( + new Error( + `Unsupported conversion from ${fileType} to ${convertTo}. Only MSG to EML conversion is currently supported.`, + ), + ); } }); } diff --git a/src/helpers/env.ts b/src/helpers/env.ts index 6722c54..4c8c067 100644 --- a/src/helpers/env.ts +++ b/src/helpers/env.ts @@ -16,7 +16,10 @@ export const WEBROOT = process.env.WEBROOT ?? ""; export const LANGUAGE = process.env.LANGUAGE?.toLowerCase() || "en"; -export const MAX_CONVERT_PROCESS = process.env.MAX_CONVERT_PROCESS && Number(process.env.MAX_CONVERT_PROCESS) > 0 ? Number(process.env.MAX_CONVERT_PROCESS) : 0 +export const MAX_CONVERT_PROCESS = + process.env.MAX_CONVERT_PROCESS && Number(process.env.MAX_CONVERT_PROCESS) > 0 + ? Number(process.env.MAX_CONVERT_PROCESS) + : 0; export const UNAUTHENTICATED_USER_SHARING = - process.env.UNAUTHENTICATED_USER_SHARING?.toLowerCase() === "true" || false; \ No newline at end of file + process.env.UNAUTHENTICATED_USER_SHARING?.toLowerCase() === "true" || false; diff --git a/src/pages/convert.tsx b/src/pages/convert.tsx index 3dbb892..fe4c325 100644 --- a/src/pages/convert.tsx +++ b/src/pages/convert.tsx @@ -46,6 +46,11 @@ export const convert = new Elysia().use(userService).post( const convertTo = normalizeFiletype(body.convert_to.split(",")[0] ?? ""); const converterName = body.convert_to.split(",")[1]; + + if (!converterName) { + return redirect(`${WEBROOT}/`, 302); + } + const fileNames = JSON.parse(body.file_names) as string[]; for (let i = 0; i < fileNames.length; i++) { diff --git a/src/pages/download.tsx b/src/pages/download.tsx index 3333396..e5d7576 100644 --- a/src/pages/download.tsx +++ b/src/pages/download.tsx @@ -1,11 +1,11 @@ +import path from "node:path"; import { Elysia } from "elysia"; import sanitize from "sanitize-filename"; +import * as tar from "tar"; import { outputDir } from ".."; import db from "../db/db"; import { WEBROOT } from "../helpers/env"; import { userService } from "./user"; -import path from "node:path"; -import * as tar from "tar"; export const download = new Elysia() .use(userService) @@ -58,8 +58,17 @@ export const download = new Elysia() const userId = decodeURIComponent(params.userId); const jobId = decodeURIComponent(params.jobId); const outputPath = `${outputDir}${userId}/${jobId}`; - const outputTar = path.join(outputPath, `converted_files_${jobId}.tar`) + const outputTar = path.join(outputPath, `converted_files_${jobId}.tar`); - await tar.create({file: outputTar, cwd: outputPath, filter: (path) => { return !path.match(".*\\.tar"); }}, ["."]); + await tar.create( + { + file: outputTar, + cwd: outputPath, + filter: (path) => { + return !path.match(".*\\.tar"); + }, + }, + ["."], + ); return Bun.file(outputTar); }); diff --git a/src/pages/results.tsx b/src/pages/results.tsx index edd70e7..c881f55 100644 --- a/src/pages/results.tsx +++ b/src/pages/results.tsx @@ -1,4 +1,5 @@ import { Html } from "@elysiajs/html"; +import { JWTPayloadSpec } from "@elysiajs/jwt"; import { Elysia } from "elysia"; import { BaseHtml } from "../components/base"; import { Header } from "../components/header"; @@ -6,7 +7,6 @@ import db from "../db/db"; import { Filename, Jobs } from "../db/types"; import { ALLOW_UNAUTHENTICATED, WEBROOT } from "../helpers/env"; import { userService } from "./user"; -import { JWTPayloadSpec } from "@elysiajs/jwt"; function ResultsArticle({ user, @@ -26,7 +26,7 @@ function ResultsArticle({

Results

- + > {files.length === job.num_files ? "Download All" : "Converting..."} diff --git a/src/pages/root.tsx b/src/pages/root.tsx index b8aaf1b..fa4c8a8 100644 --- a/src/pages/root.tsx +++ b/src/pages/root.tsx @@ -34,7 +34,9 @@ export const root = new Elysia() let user: ({ id: string } & JWTPayloadSpec) | false = false; if (ALLOW_UNAUTHENTICATED) { const newUserId = String( - UNAUTHENTICATED_USER_SHARING ? 0 : randomInt(2 ** 24, Math.min(2 ** 48 + 2 ** 24 - 1, Number.MAX_SAFE_INTEGER)), + UNAUTHENTICATED_USER_SHARING + ? 0 + : randomInt(2 ** 24, Math.min(2 ** 48 + 2 ** 24 - 1, Number.MAX_SAFE_INTEGER)), ); const accessToken = await jwt.sign({ id: newUserId, diff --git a/src/theme/theme.css b/src/theme/theme.css index cc55666..34a0051 100644 --- a/src/theme/theme.css +++ b/src/theme/theme.css @@ -44,4 +44,4 @@ /* lime-400 */ --accent-400: oklch(84.1% 0.238 128.85); } -} \ No newline at end of file +}