Updated konsole
All checks were successful
Build Website / Build NPM Project (push) Successful in 21s
Build Website / Tag Version (push) Successful in 7s
Build Website / Build & Push Dockerfile (push) Successful in 1m4s

This commit is contained in:
Zakary Timson 2024-01-07 16:36:14 -05:00
parent 0046dc1cb4
commit b71b2092c3
11 changed files with 92 additions and 10 deletions

View File

@ -0,0 +1,14 @@
window.cli.exec['cat'] = {
autocomplete: () => {
return [];
},
help: () => {
return 'Display file contents';
},
run: args => {
if(!args[0]) throw new Error('cat: missing operand');
const file = window.cli.fs(args[0]);
if(file == null) throw new Error('cat: File does not exist');
return file;
}
}

View File

@ -3,11 +3,12 @@ window.cli.exec['cd'] = {
return []; return [];
}, },
help: () => { help: () => {
return 'Clear console output'; return 'Change present working directory';
}, },
run: args => { run: args => {
const path = window.cli.fs(args[0]); const path = window.cli.fs(args[0]);
if(!path) throw new Error(`cd: \'${args[0]}\': No such file or directory`) if(!path) throw new Error(`cd: \'${args[0]}\': No such file or directory`);
if(typeof path != 'object') throw new Error(`cd: \'${args[0]}\': Not a directory`);
window.cli.pwd = window.cli.path(args[0]); window.cli.pwd = window.cli.path(args[0]);
window.cli._prompt.innerText = window.cli._buildPrompt(); window.cli._prompt.innerText = window.cli._buildPrompt();

View File

@ -7,7 +7,14 @@ window.cli.exec['ls'] = {
}, },
run: args => { run: args => {
const target = window.cli.fs(args[0]); const target = window.cli.fs(args[0]);
if(!target) throw new Error(`ls: cannot access \'${args[0]}\': No such file or directory`) if(!target || typeof target != 'object') throw new Error(`ls: cannot access \'${args[0]}\': No such file or directory`)
return Object.keys(target).reduce((acc, p) => acc + `${p}\n`, ''); return Object.keys(target)
.sort((a, b) => {
if(a > b) return 1;
if(b > a) return -1;
return 0;
})
.map(p => `-rwxrw---- 1 root root ${typeof target[p] =='object' ? '-' : target[p].length} ${p}`)
.join('\n');
} }
} }

View File

@ -7,6 +7,7 @@ window.cli.exec['mkdir'] = {
}, },
run: args => { run: args => {
if(!args[0]) throw new Error('mkdir: missing operand'); if(!args[0]) throw new Error('mkdir: missing operand');
if(window.cli.fs(args[0]) != null) throw new Error('mkdir: File or directory already exists');
window.cli.fs(args[0], {}); window.cli.fs(args[0], {});
} }
} }

View File

@ -6,7 +6,7 @@ window.cli.exec['rm'] = {
return 'Delete file or directory'; return 'Delete file or directory';
}, },
run: args => { run: args => {
if(!args[0]) throw new Error('rm: missing operand'); if(!args.length) throw new Error('rm: missing operand');
window.cli.fs(args[0], null); args.forEach(a => window.cli.fs(a, null));
} }
} }

View File

@ -0,0 +1,12 @@
window.cli.exec['touch'] = {
autocomplete: () => {
return [];
},
help: () => {
return 'Change file timestamps & create file if missing';
},
run: args => {
if(!args[0]) throw new Error('touch: missing operand');
if(!window.cli.fs(args[0])) window.cli.fs(args[0], '');
}
}

View File

@ -3,6 +3,7 @@ import './konsole.css';
// CLI Commands // CLI Commands
import './commands/banner.js'; import './commands/banner.js';
import './commands/cat.js';
import './commands/cd.js' import './commands/cd.js'
import './commands/clear.js'; import './commands/clear.js';
import './commands/date.js'; import './commands/date.js';
@ -15,5 +16,6 @@ import './commands/man.js';
import './commands/mkdir.js'; import './commands/mkdir.js';
import './commands/pwd.js'; import './commands/pwd.js';
import './commands/rm.js'; import './commands/rm.js';
import './commands/shower-thoughts.js'; import './commands/shower-thought.js';
import './commands/touch.js';
import './commands/whoami.js'; import './commands/whoami.js';

View File

@ -5,6 +5,7 @@
overflow-y: auto; overflow-y: auto;
min-height: 150px; min-height: 150px;
max-height: 300px; max-height: 300px;
tab-size: 4;
} }
.cli-stdout { .cli-stdout {

View File

@ -28,7 +28,7 @@ window.cli = {
<div class="cli-stdout"></div> <div class="cli-stdout"></div>
<div class="cli-stdin" onclick="window.cli._input.focus()"> <div class="cli-stdin" onclick="window.cli._input.focus()">
<label for="${elementId}-cli-stdin-input" class="cli-stdin-prompt">${window.cli._buildPrompt()}</label> <label for="${elementId}-cli-stdin-input" class="cli-stdin-prompt">${window.cli._buildPrompt()}</label>
<input id="${elementId}-cli-stdin-input" class="cli-stdin-input" type="text" /> <input id="${elementId}-cli-stdin-input" class="cli-stdin-input" type="text" autocomplete="off"/>
</div> </div>
</div>`; </div>`;
@ -119,11 +119,10 @@ window.cli = {
try { try {
const args = parts.slice(1).map(a => (a[0] == '"' || a[0] == "'") ? a.slice(1, -1) : a); const args = parts.slice(1).map(a => (a[0] == '"' || a[0] == "'") ? a.slice(1, -1) : a);
const out = exec.run(args); const out = exec.run(args);
if(!suppress) window.cli.stdOut(`${window.cli._buildPrompt()} ${command}${out ? '\n' + out : ''}`); if(!suppress) window.cli.stdOut(`${window.cli._buildPrompt()} ${command}${out != null ? '\n' + (out || '\n') : ''}`);
} catch(err) { } catch(err) {
console.error(err); console.error(err);
if(!suppress) { if(!suppress) {
window.cli._output.removeChild(window.cli._output.children[window.cli._output.children.length - 1]);
window.cli.stdErr(`${window.cli._buildPrompt()} ${command}\n${err.message || `${parts[0]}: exited with a non-zero status`}`); window.cli.stdErr(`${window.cli._buildPrompt()} ${command}\n${err.message || `${parts[0]}: exited with a non-zero status`}`);
} }
} }

View File

@ -0,0 +1,45 @@
export class CliFile {
owner = window.cli.user;
group = window.cli.user;
permissions = 750;
created = new Date();
modified = new Date();
#data;
get date() { return this.#data; }
set date(d) {
this.modified = new Date();
this.#data = d;
}
static instanceOf(f) {
return f.hasOwnProperty('data');
}
size() {
return this.#data.toString().length;
}
permsString() {
return '-' + this.permissions.toString().split('').map(p => {
switch (p) {
case 0:
return '---';
case 1:
return '--x';
case 2:
return '-w-';
case 3:
return '-wx';
case 4:
return 'r--';
case 5:
return 'r-x';
case 6:
return 'rw-';
case 7:
return 'rwx';
}
}).join('');
}
}