test-bdk-cli 0.1.17 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/run.js +143 -4
- package/package.json +1 -1
package/dist/commands/run.js
CHANGED
|
@@ -1,16 +1,155 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.registerRun = registerRun;
|
|
37
|
+
const http = __importStar(require("http"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
4
41
|
function registerRun(program) {
|
|
5
42
|
program
|
|
6
|
-
.command('run')
|
|
43
|
+
.command('run [source]')
|
|
7
44
|
.alias('apps:run')
|
|
8
45
|
.description('Run the app locally with live reload')
|
|
9
46
|
.option('--port <number>', 'port to run', '3000')
|
|
10
47
|
.option('--env <env>', 'environment', 'dev')
|
|
11
48
|
.option('--open', 'open browser after start', false)
|
|
12
|
-
.action((opts) => {
|
|
13
|
-
|
|
14
|
-
|
|
49
|
+
.action((sourceArg, opts) => {
|
|
50
|
+
const sourceDir = path.resolve(process.cwd(), sourceArg || '.');
|
|
51
|
+
const port = parseInt(opts.port || '3000', 10);
|
|
52
|
+
const env = opts.env || 'dev';
|
|
53
|
+
// Check if manifest.json exists
|
|
54
|
+
const manifestPath = path.join(sourceDir, 'manifest.json');
|
|
55
|
+
if (!fs.existsSync(manifestPath)) {
|
|
56
|
+
console.error(`manifest.json not found in ${sourceDir}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
// Create a simple HTTP server
|
|
60
|
+
const server = http.createServer((req, res) => {
|
|
61
|
+
let filePath = req.url || '/';
|
|
62
|
+
if (filePath === '/') {
|
|
63
|
+
filePath = '/assets/iframe.html';
|
|
64
|
+
}
|
|
65
|
+
// Resolve the file path
|
|
66
|
+
const fullPath = path.join(sourceDir, filePath);
|
|
67
|
+
// Security: prevent directory traversal attacks
|
|
68
|
+
const resolvedPath = path.resolve(fullPath);
|
|
69
|
+
const basePath = path.resolve(sourceDir);
|
|
70
|
+
if (!resolvedPath.startsWith(basePath)) {
|
|
71
|
+
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
72
|
+
res.end('Forbidden');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Try to serve the file
|
|
76
|
+
fs.readFile(resolvedPath, (err, data) => {
|
|
77
|
+
if (err) {
|
|
78
|
+
// If file not found, try to serve index.html or 404
|
|
79
|
+
if (err.code === 'ENOENT') {
|
|
80
|
+
res.writeHead(404, { 'Content-Type': 'text/html' });
|
|
81
|
+
res.end(`
|
|
82
|
+
<!DOCTYPE html>
|
|
83
|
+
<html>
|
|
84
|
+
<head><title>404 Not Found</title></head>
|
|
85
|
+
<body>
|
|
86
|
+
<h1>404 - File Not Found</h1>
|
|
87
|
+
<p>Could not find: ${filePath}</p>
|
|
88
|
+
<p><a href="/">Go back</a></p>
|
|
89
|
+
</body>
|
|
90
|
+
</html>
|
|
91
|
+
`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
95
|
+
res.end('Internal Server Error');
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Determine content type
|
|
100
|
+
const ext = path.extname(resolvedPath);
|
|
101
|
+
let contentType = 'application/octet-stream';
|
|
102
|
+
if (ext === '.html')
|
|
103
|
+
contentType = 'text/html; charset=utf-8';
|
|
104
|
+
else if (ext === '.js')
|
|
105
|
+
contentType = 'application/javascript; charset=utf-8';
|
|
106
|
+
else if (ext === '.json')
|
|
107
|
+
contentType = 'application/json; charset=utf-8';
|
|
108
|
+
else if (ext === '.css')
|
|
109
|
+
contentType = 'text/css; charset=utf-8';
|
|
110
|
+
else if (ext === '.svg')
|
|
111
|
+
contentType = 'image/svg+xml';
|
|
112
|
+
else if (ext === '.png')
|
|
113
|
+
contentType = 'image/png';
|
|
114
|
+
else if (ext === '.jpg' || ext === '.jpeg')
|
|
115
|
+
contentType = 'image/jpeg';
|
|
116
|
+
else if (ext === '.gif')
|
|
117
|
+
contentType = 'image/gif';
|
|
118
|
+
res.writeHead(200, { 'Content-Type': contentType });
|
|
119
|
+
res.end(data);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
server.listen(port, () => {
|
|
123
|
+
console.log(`✅ Dev server started on http://localhost:${port} (env=${env})`);
|
|
124
|
+
console.log(`📁 Serving from: ${sourceDir}`);
|
|
125
|
+
console.log(`📄 Iframe: http://localhost:${port}/assets/iframe.html`);
|
|
126
|
+
console.log(`\nPress Ctrl+C to stop the server\n`);
|
|
127
|
+
// Open browser if --open flag is set
|
|
128
|
+
if (opts.open) {
|
|
129
|
+
const url = `http://localhost:${port}`;
|
|
130
|
+
try {
|
|
131
|
+
const isWindows = process.platform === 'win32';
|
|
132
|
+
const command = isWindows
|
|
133
|
+
? `start ${url}`
|
|
134
|
+
: process.platform === 'darwin'
|
|
135
|
+
? `open ${url}`
|
|
136
|
+
: `xdg-open ${url}`;
|
|
137
|
+
(0, child_process_1.execSync)(command, { stdio: 'ignore' });
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
// Silently ignore if browser open fails
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
server.on('error', (err) => {
|
|
145
|
+
if (err.code === 'EADDRINUSE') {
|
|
146
|
+
console.error(`❌ Port ${port} is already in use. Try a different port:`);
|
|
147
|
+
console.error(` npx test-bdk-cli apps:run [source] --port 3001`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.error(`❌ Server error: ${err.message}`);
|
|
151
|
+
}
|
|
152
|
+
process.exit(1);
|
|
153
|
+
});
|
|
15
154
|
});
|
|
16
155
|
}
|