From 16938ebde2fcdd79c907c13806c9016b9918c6f0 Mon Sep 17 00:00:00 2001 From: gitsad Date: Fri, 13 Mar 2026 16:38:15 +0100 Subject: [PATCH 1/2] fix: fixed running app with npx --- packages/cli/package.json | 2 +- packages/cli/src/server/dev-server.ts | 64 ++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 2084850..d4c29b1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@mobile-reality/mdma-cli", - "version": "0.1.0", + "version": "0.1.2", "type": "module", "bin": { "mdma": "./dist/bin/mdma.js" diff --git a/packages/cli/src/server/dev-server.ts b/packages/cli/src/server/dev-server.ts index 3e7c2b2..995049f 100644 --- a/packages/cli/src/server/dev-server.ts +++ b/packages/cli/src/server/dev-server.ts @@ -1,21 +1,61 @@ -import { createServer } from 'vite'; +import { createServer as createHttpServer } from 'node:http'; +import { readFile } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; +import open from 'open'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const MIME_TYPES: Record = { + '.html': 'text/html', + '.js': 'application/javascript', + '.css': 'text/css', + '.json': 'application/json', + '.png': 'image/png', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2', +}; + export async function startDevServer(port: number): Promise { - const appRoot = path.resolve(__dirname, '../../app'); - - const server = await createServer({ - root: appRoot, - configFile: path.resolve(appRoot, 'vite.config.ts'), - server: { - port, - open: true, - }, + const appRoot = path.resolve(__dirname, '../../app-dist'); + + const server = createHttpServer(async (req, res) => { + let urlPath = req.url?.split('?')[0] ?? '/'; + if (urlPath === '/') urlPath = '/index.html'; + + const filePath = path.join(appRoot, urlPath); + + // Prevent path traversal + if (!filePath.startsWith(appRoot)) { + res.writeHead(403); + res.end('Forbidden'); + return; + } + + try { + const data = await readFile(filePath); + const ext = path.extname(filePath); + res.writeHead(200, { 'Content-Type': MIME_TYPES[ext] || 'application/octet-stream' }); + res.end(data); + } catch { + // SPA fallback — serve index.html for unknown routes + try { + const index = await readFile(path.join(appRoot, 'index.html')); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(index); + } catch { + res.writeHead(404); + res.end('Not found'); + } + } + }); + + server.listen(port, () => { + open(`http://localhost:${port}`); }); - await server.listen(); - server.printUrls(); + // Keep the process alive + await new Promise(() => {}); } From 6acadfe17492a7378eddd1b6611fae3b5d555714 Mon Sep 17 00:00:00 2001 From: gitsad Date: Fri, 13 Mar 2026 16:44:52 +0100 Subject: [PATCH 2/2] chore: fixed comments --- packages/cli/package.json | 2 +- packages/cli/src/server/dev-server.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index d4c29b1..d110a64 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@mobile-reality/mdma-cli", - "version": "0.1.2", + "version": "0.1.3", "type": "module", "bin": { "mdma": "./dist/bin/mdma.js" diff --git a/packages/cli/src/server/dev-server.ts b/packages/cli/src/server/dev-server.ts index 995049f..4e04449 100644 --- a/packages/cli/src/server/dev-server.ts +++ b/packages/cli/src/server/dev-server.ts @@ -28,7 +28,7 @@ export async function startDevServer(port: number): Promise { const filePath = path.join(appRoot, urlPath); // Prevent path traversal - if (!filePath.startsWith(appRoot)) { + if (!filePath.startsWith(appRoot + path.sep)) { res.writeHead(403); res.end('Forbidden'); return; @@ -52,10 +52,10 @@ export async function startDevServer(port: number): Promise { } }); - server.listen(port, () => { - open(`http://localhost:${port}`); + await new Promise((resolve) => { + server.listen(port, () => { + open(`http://localhost:${port}`); + resolve(); + }); }); - - // Keep the process alive - await new Promise(() => {}); }