aboutsummaryrefslogtreecommitdiff
path: root/modules/ext
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-06-10 06:00:30 +0200
committerAgando <roduccomm@gmail.com>2026-06-10 06:00:30 +0200
commit39b2df36ee5ccea52558d0537bfee87058558e94 (patch)
tree7cac66cf09b128c07fa0300da0a46d016d4459e5 /modules/ext
parente8d4985bbb60797936d31b65604a7f94c76bf623 (diff)
auto: 2026-06-10_06:00 changes
Diffstat (limited to 'modules/ext')
-rw-r--r--modules/ext/console.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/modules/ext/console.js b/modules/ext/console.js
new file mode 100644
index 0000000..b0f6938
--- /dev/null
+++ b/modules/ext/console.js
@@ -0,0 +1,76 @@
+class JSConsoleModule {
+ constructor() {
+ this.commands = {};
+ this.commandsMeta = { 'js': { argType: 'file' }, 'js-run': { argType: 'file' } };
+ this.terminal = null;
+ }
+
+ getHelpInfo() {
+ return {
+ 'js': 'js <expression> — Evaluate JavaScript in page context',
+ 'js-run': 'js-run <path> — Load and execute a JS file from VFS'
+ };
+ }
+
+ registerCommands() {
+ this.commands['js'] = (args) => this.evalJS(args);
+ this.commands['js-run'] = (args) => this.evalJSFile(args);
+ }
+
+ evalJS(args) {
+ if (!args[0]) return this.terminal.print('Usage: js <expression>', 'warning');
+ const expr = args.join(' ');
+ try {
+ const result = eval(expr);
+ const output = result === undefined ? 'undefined' :
+ typeof result === 'string' ? result :
+ result === null ? 'null' :
+ typeof result === 'object' ? JSON.stringify(result, null, 2) :
+ String(result);
+ this.terminal.print(output, 'success');
+ } catch (e) {
+ this.terminal.print(`Error: ${e.message}`, 'error');
+ }
+ }
+
+ evalJSFile(args) {
+ if (!args[0]) return this.terminal.print('Usage: js-run <path>', 'warning');
+ const path = args.join(' ');
+ try {
+ const content = this.terminal.fs.readFile(path);
+ if (content === null || content === undefined || content === false) {
+ return this.terminal.print(`js-run: ${path}: No such file`, 'error');
+ }
+ // Wrap in an async IIFE so multi-line scripts with await work
+ const wrapped = `(async () => {\n${content}\n})()`;
+ const result = eval(wrapped);
+ // If it returns a promise, wait for it via .then
+ if (result && typeof result.then === 'function') {
+ result.then(val => {
+ const output = val === undefined ? '✓ Script executed' :
+ typeof val === 'string' ? val :
+ val === null ? 'null' :
+ typeof val === 'object' ? JSON.stringify(val, null, 2) :
+ String(val);
+ this.terminal.print(output, 'success');
+ }).catch(e => {
+ this.terminal.print(`Error: ${e.message}`, 'error');
+ });
+ return;
+ }
+ const output = result === undefined ? '✓ Script executed' :
+ typeof result === 'string' ? result :
+ result === null ? 'null' :
+ typeof result === 'object' ? JSON.stringify(result, null, 2) :
+ String(result);
+ this.terminal.print(output, 'success');
+ } catch (e) {
+ this.terminal.print(`Error: ${e.message}`, 'error');
+ }
+ }
+
+ seed() {}
+ init() {}
+}
+
+if (typeof window !== 'undefined') window.JSConsoleModule = JSConsoleModule;