Add CLI written in Node

This commit is contained in:
Vrganj 2021-01-16 13:14:17 +01:00
parent d666e5c19d
commit d8b6379b9a
9 changed files with 321 additions and 192 deletions

View file

@ -1,48 +0,0 @@
const { writeFile } = require('fs/promises');
const { spawn } = require('child_process');
async function execute(res, language, body) {
const stamp = new Date().getTime();
const sourceFile = `/tmp/${stamp}.code`;
await writeFile(sourceFile, body.source);
const process = spawn(__dirname + '/../../lxc/execute', [
language.name,
sourceFile,
body.args?.join('\n') ?? '',
]);
const result = {
ran: true,
language: language.name,
stderr: '',
stdout: '',
output: '',
};
if (language.version)
result.version = language.version;
process.stderr.on('data', chunk => {
result.stderr += chunk;
result.output += chunk;
});
process.stdout.on('data', chunk => {
result.stdout += chunk;
result.output += chunk;
});
process.on('exit', () => {
result.stderr = result.stderr.trim().substring(0, 65535);
result.stdout = result.stdout.trim().substring(0, 65535);
result.output = result.output.trim().substring(0, 65535);
res.json(result);
});
}
module.exports = {
execute,
};

View file

@ -1,5 +1,5 @@
const express = require('express');
const { execute } = require('./execute');
const { execute } = require('../../shared/execute');
const { languages } = require('./languages');
const { checkSchema, validationResult } = require('express-validator');
@ -41,7 +41,7 @@ app.post(
},
}
}),
(req, res) => {
async (req, res) => {
const errors = validationResult(req).array();
if (errors.length === 0) {
@ -49,7 +49,16 @@ app.post(
language.aliases.includes(req.body.language.toLowerCase())
);
execute(res, language, req.body);
const { stdout, stderr, output } = await execute(language, req.body.source, req.body.args);
res.status(200).json({
ran: true,
language: language.name,
version: language.version,
stdout,
stderr,
output,
});
} else {
res.status(400).json({
message: errors[0].msg,

View file

@ -1,119 +1,5 @@
const { spawn } = require('child_process');
const languages = [
{
name: 'nasm',
aliases: ['asm', 'nasm'],
},
{
name: 'nasm64',
aliases: ['asm64', 'nasm64'],
},
{
name: 'awk',
aliases: ['awk'],
},
{
name: 'bash',
aliases: ['bash'],
},
{
name: 'brainfuck',
aliases: ['bf', 'brainfuck'],
},
{
name: 'c',
aliases: ['c'],
},
{
name: 'csharp',
aliases: ['c#', 'cs', 'csharp'],
},
{
name: 'cpp',
aliases: ['c++', 'cpp'],
},
{
name: 'deno',
aliases: ['deno', 'denojs', 'denots'],
},
{
name: 'ruby',
aliases: ['duby', 'rb', 'ruby'],
},
{
name: 'emacs',
aliases: ['el', 'elisp', 'emacs'],
},
{
name: 'elixir',
aliases: ['elixir'],
},
{
name: 'haskell',
aliases: ['haskell', 'hs'],
},
{
name: 'go',
aliases: ['go'],
},
{
name: 'java',
aliases: ['java'],
},
{
name: 'node',
aliases: ['javascript', 'js', 'node'],
},
{
name: 'jelly',
aliases: ['jelly'],
},
{
name: 'julia',
aliases: ['jl', 'julia'],
},
{
name: 'kotlin',
aliases: ['kotlin'],
},
{
name: 'lua',
aliases: ['lua'],
},
{
name: 'paradoc',
aliases: ['paradoc'],
},
{
name: 'perl',
aliases: ['perl'],
},
{
name: 'php',
aliases: ['php', 'php3', 'php4', 'php5'],
},
{
name: 'python3',
aliases: ['py', 'py3', 'python', 'python3'],
},
{
name: 'python2',
aliases: ['python2'],
},
{
name: 'rust',
aliases: ['rs', 'rust'],
},
{
name: 'swift',
aliases: ['swift'],
},
{
name: 'typescript',
aliases: ['ts', 'typescript'],
},
];
const languages = require('../../shared/languages.json');
{
const process = spawn(__dirname + '/../../lxc/versions');