From 3ee98664f0a83ace72bd71b241c3f21cab60c38b Mon Sep 17 00:00:00 2001 From: LukeGus Date: Tue, 6 Oct 2026 15:58:27 -0500 Subject: [PATCH] chore: clean up npm scripts, make npm run dev the full runner and drop concurrently --- CONTRIBUTING.md | 3 +- electron/main.cjs | 4 +- package-lock.json | 121 ------------------------------------- package.json | 27 +++------ scripts/dev.mjs | 2 +- scripts/lib/dev-docker.mjs | 2 +- scripts/lib/dev-runner.mjs | 5 +- 7 files changed, 17 insertions(+), 147 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9db7959d3..3540568bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,10 +23,9 @@ Run the following commands: ```sh npm run dev -npm run dev:backend ``` -This will start the backend and the frontend Vite server. You can access Termix by going to `http://localhost:5174/`. +This builds everything, starts the backend and then the Vite server at `http://localhost:5173/`. Backend changes restart the backend, and plugin changes in `../Termix-Plugins` rebuild and reload that plugin. `npm run dev:electron` does the same with the desktop app, and `npm run dev -- --help` lists the other options. ## Contributing diff --git a/electron/main.cjs b/electron/main.cjs index d0214b38c..a5ed24361 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -655,7 +655,7 @@ async function handleBackendRequest(msg) { if (!msg || msg.type !== "backend-request") return; const { id, channel, payload } = msg; const handler = BACKEND_REQUEST_HANDLERS[channel]; - // Under dev:all the runner owns the backend and relays these messages. + // Under npm run dev:electron the runner owns the backend and relays these messages. const target = backendProcess && !backendProcess.killed ? backendProcess @@ -3775,7 +3775,7 @@ app.whenReady().then(async () => { logToFile("startBackendServer result:", result); } else { logToFile( - "Skipping embedded backend (isDev=true) - expecting separate dev:backend process", + "Skipping embedded backend (isDev=true) - expecting the dev runner's backend", ); if (isDevRunner()) { process.on("message", (msg) => void handleBackendRequest(msg)); diff --git a/package-lock.json b/package-lock.json index 97cc1df8b..af6e4a1aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,6 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "concurrently": "^10.0.5", "drizzle-kit": "^0.31.10", "electron": "^43.4.1", "electron-builder": "^26.15.3", @@ -8026,80 +8025,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concurrently": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.5.tgz", - "integrity": "sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "5.6.2", - "rxjs": "7.8.2", - "shell-quote": "1.9.0", - "supports-color": "10.2.2", - "tree-kill": "1.2.2", - "yargs": "18.0.0" - }, - "bin": { - "conc": "dist/bin/index.js", - "concurrently": "dist/bin/index.js" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concurrently/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -13015,16 +12940,6 @@ "node": ">= 18" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -13271,19 +13186,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", @@ -13720,19 +13622,6 @@ "node": ">=6.6.0" } }, - "node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/svg-parser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.1.0.tgz", @@ -13958,16 +13847,6 @@ "node": ">=20" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", diff --git a/package.json b/package.json index ecdbeffb2..5bf418712 100644 --- a/package.json +++ b/package.json @@ -26,32 +26,24 @@ "test:watch": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", - "dev": "vite", + "dev": "node scripts/dev.mjs", + "dev:electron": "node scripts/dev.mjs electron", + "dev:docker": "node scripts/dev.mjs docker", + "dev:frontend": "vite", "build": "npm run build:sdk && vite build && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins", "build:backend": "npm run build:sdk && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins", - "dev:backend": "npm run build:sdk && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins && node ./dist/backend/backend/starter.js", - "dev:all": "node scripts/dev.mjs", - "dev:backend:local": "npm run build:sdk && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins:local && node ./dist/backend/backend/starter.js", - "dev:docker": "docker stop termix-dev 2>nul & docker rm termix-dev 2>nul & docker build -f docker/Dockerfile -t termix:dev --no-cache . && docker run -d --name termix-dev -p 3000:3000 -p 8080:8080 -p 30001:30001 -v \"%cd%\\db\\data:/app/data\" termix:dev", - "dev:docker:restart": "docker stop termix-dev 2>nul & docker rm termix-dev 2>nul & docker run -d --name termix-dev -p 8080:8080 -p 30001:30001 -v \"%cd%\\db\\data:/app/data\" termix:dev", "generate:openapi": "tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && node ./dist/backend/backend/utils/swagger.js", - "preview": "vite preview", - "electron:dev": "concurrently \"npm run dev\" \"powershell -c \\\"Start-Sleep -Seconds 5\\\" && electron .\"", - "electron:patch-builder": "node scripts/patch-app-builder-lib.cjs", "electron:rebuild": "electron-rebuild -f -o better-sqlite3,@serialport/bindings-cpp,node-pty", - "build:win-portable": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --win --dir", - "build:win-installer": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --win --publish=never", - "build:linux-portable": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --linux --dir", - "build:linux-appimage": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --linux AppImage", - "build:linux-targz": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --linux tar.gz", - "build:mac": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --mac --universal", - "build:mac-dev": "npm run build && npm run electron:rebuild && npm run electron:patch-builder && electron-builder --mac dir --publish=never", + "build:win-portable": "npm run build && npm run electron:rebuild && electron-builder --win --dir", + "build:win-installer": "npm run build && npm run electron:rebuild && electron-builder --win --publish=never", + "build:linux-appimage": "npm run build && npm run electron:rebuild && electron-builder --linux AppImage", + "build:linux-targz": "npm run build && npm run electron:rebuild && electron-builder --linux tar.gz", + "build:mac": "npm run build && npm run electron:rebuild && electron-builder --mac --universal", "schema:generate": "node scripts/generate-dialect-schema.cjs", "schema:check": "node scripts/generate-dialect-schema.cjs --check", "schema:migrations": "drizzle-kit generate --config=drizzle.config.sqlite.ts && drizzle-kit generate --config=drizzle.config.pg.ts && drizzle-kit generate --config=drizzle.config.mysql.ts", "build:sdk": "npm run build --workspace @termix-ssh/plugin-sdk && node scripts/build-sdk-host.mjs", "build:plugins": "node scripts/build-plugins.cjs", - "build:plugins:local": "node scripts/build-plugins.cjs --local ../Termix-Plugins", "plugins:pin": "node scripts/pin-bundled-plugins.cjs" }, "dependencies": { @@ -135,7 +127,6 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "concurrently": "^10.0.5", "drizzle-kit": "^0.31.10", "electron": "^43.4.1", "electron-builder": "^26.15.3", diff --git a/scripts/dev.mjs b/scripts/dev.mjs index 0d0716833..37fa96cbd 100644 --- a/scripts/dev.mjs +++ b/scripts/dev.mjs @@ -1,5 +1,5 @@ /** - * dev:all, one command for manual testing. Run with --help for the targets + * npm run dev, one command for manual testing. Run with --help for the targets * and options. * * Every target builds the SDK and stages plugins (local builds from diff --git a/scripts/lib/dev-docker.mjs b/scripts/lib/dev-docker.mjs index 55644c883..79070ad98 100644 --- a/scripts/lib/dev-docker.mjs +++ b/scripts/lib/dev-docker.mjs @@ -2,7 +2,7 @@ export const NETWORK = "termix-dev"; export const APP_CONTAINER = "termix-dev"; export const APP_IMAGE = "termix:dev"; -/** Side containers dev:all can run. hostPort is what the local backend uses. */ +/** Side containers npm run dev can run. hostPort is what the local backend uses. */ export const SERVICES = { postgres: { container: "termix-dev-postgres", diff --git a/scripts/lib/dev-runner.mjs b/scripts/lib/dev-runner.mjs index 0bfed7c57..a2b6362dd 100644 --- a/scripts/lib/dev-runner.mjs +++ b/scripts/lib/dev-runner.mjs @@ -87,7 +87,8 @@ export function createDebouncer(ms, fn) { export const TARGETS = ["web", "electron", "docker"]; export const DATABASES = ["sqlite", "postgres", "mysql"]; -export const HELP = `Usage: npm run dev:all -- [target] [options] +export const HELP = `Usage: npm run dev -- [target] [options] + (npm run dev:electron and npm run dev:docker pick the target) Targets web Backend and Vite on http://localhost:5173 (default) @@ -112,7 +113,7 @@ Keys while running o open the app in a browser q quit`; -/** Reads dev:all arguments. Throws on anything it does not know. */ +/** Reads npm run dev arguments. Throws on anything it does not know. */ export function parseDevArgs(argv) { const options = { target: "web",