diff --git a/package-lock.json b/package-lock.json index b83922a..591e228 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "name": "apiforgejs", - "version": "1.0.2", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "apiforgejs", - "version": "1.0.2", + "version": "2.0.0", "license": "MIT", "dependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/standalone": "^7.27.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "engines": { "node": ">=22.5.0" @@ -19,6 +20,15 @@ "express": ">=4.0.0" } }, + "node_modules/@babel/standalone": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.29.7.tgz", + "integrity": "sha512-oFh9XoGL20UuHIeIuBQHOvF7r2dOCRnZW0r4SageGb9SWnt6HhbuPLREykNaEnP7/SRpMUwr50SSMJLrmeHvnQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", diff --git a/package.json b/package.json index 0f34810..c5e361d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apiforgejs", - "version": "2.0.0", + "version": "2.1.0", "description": "API observability & intelligence SDK for Express.js — local-first, privacy-first", "main": "src/index.js", "keywords": [ @@ -24,6 +24,11 @@ "engines": { "node": ">=22.5.0" }, + "dependencies": { + "@babel/standalone": "^7.27.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, "peerDependencies": { "express": ">=4.0.0" }, diff --git a/src/dashboard.js b/src/dashboard.js index 60e66a7..be30af6 100644 --- a/src/dashboard.js +++ b/src/dashboard.js @@ -23,6 +23,7 @@ function resolveAsset(pkg, file) { const REACT_PATH = resolveAsset('react', 'react.production.min.js'); const REACT_DOM_PATH = resolveAsset('react-dom', 'react-dom.production.min.js'); +const BABEL_PATH = resolveAsset('@babel/standalone', 'babel.min.js'); function startDashboard(db, port) { const server = http.createServer((req, res) => { @@ -78,6 +79,16 @@ function route(req, res, url, db) { return; } + if (req.method === 'GET' && pathname === '/assets/babel.js') { + if (BABEL_PATH) { + serveFile(res, BABEL_PATH, 'application/javascript'); + } else { + res.writeHead(404); + res.end('// @babel/standalone not found — run npm install inside apiforgejs'); + } + return; + } + // ── API: summary ────────────────────────────────────────────────────────── if (req.method === 'GET' && pathname === '/api/summary') { const data = db.getSummary(); diff --git a/src/index.js b/src/index.js index 0fd4d0f..2f80133 100644 --- a/src/index.js +++ b/src/index.js @@ -58,14 +58,15 @@ function apiforge(options = {}) { const aggregator = new Aggregator(transport, config.flushInterval); aggregator.start(); - if (!isCloud && config.dashboardPort) { - startDashboard(db, config.dashboardPort); - } + const dashboardServer = (!isCloud && config.dashboardPort) + ? startDashboard(db, config.dashboardPort) + : null; const middleware = createInterceptor(aggregator, db, config); middleware.shutdown = () => { aggregator.stop(); + if (dashboardServer) dashboardServer.close(); if (db) db.close(); }; diff --git a/src/ui.html b/src/ui.html index ad7a42f..33ee90e 100644 --- a/src/ui.html +++ b/src/ui.html @@ -5,6 +5,10 @@ APIForge — Local Dashboard + + + +