Showing
8 changed files
with
319 additions
and
0 deletions
.gitignore
0 → 100644
package-lock.json
0 → 100644
This diff could not be displayed because it is too large.
package.json
0 → 100644
1 | +{ | ||
2 | + "name": "learn_with_code", | ||
3 | + "version": "1.0.0", | ||
4 | + "description": "", | ||
5 | + "main": "index.js", | ||
6 | + "scripts": { | ||
7 | + "test": "echo \"Error: no test specified\" && exit 1", | ||
8 | + "start": "npm run build:live", | ||
9 | + "build": "tsc -p .", | ||
10 | + "build:live": "nodemon --watch 'src/**/*.ts' --exec \"ts-node\" src/index.ts" | ||
11 | + }, | ||
12 | + "keywords": [], | ||
13 | + "author": "", | ||
14 | + "license": "ISC", | ||
15 | + "devDependencies": { | ||
16 | + "@types/express": "^4.17.13", | ||
17 | + "@types/node": "^16.11.6", | ||
18 | + "nodemon": "^2.0.14", | ||
19 | + "ts-node": "^10.4.0", | ||
20 | + "typescript": "^4.4.4" | ||
21 | + }, | ||
22 | + "dependencies": { | ||
23 | + "express": "^4.17.1" | ||
24 | + } | ||
25 | +} |
src/index.ts
0 → 100644
1 | +const _PORT = 3000; | ||
2 | + | ||
3 | +import * as express from "express"; | ||
4 | +import {Runner} from "./runner"; | ||
5 | + | ||
6 | +const app = express.default(); | ||
7 | + | ||
8 | +app.use(express.json()); | ||
9 | + | ||
10 | +/*RESTful API*/ | ||
11 | + | ||
12 | +app.post("/runcode", function (req, res) { | ||
13 | + var run = new Runner(req); | ||
14 | + run.run(); | ||
15 | + res.send(run.output); | ||
16 | +}); | ||
17 | + | ||
18 | + | ||
19 | + | ||
20 | +app.listen(_PORT, () => { | ||
21 | + console.log("server started at port " + _PORT); | ||
22 | +}); |
src/runner.ts
0 → 100644
1 | +import * as child_process from "child_process"; | ||
2 | +import * as fs from "fs"; | ||
3 | + | ||
4 | +export class Runner { | ||
5 | + type: string; | ||
6 | + input: Array<string>; | ||
7 | + output: Array<string> = []; | ||
8 | + time: Date = new Date(); | ||
9 | + constructor(req: any) { | ||
10 | + this.type = req.body.type; | ||
11 | + this.input = req.body.input; | ||
12 | + fs.writeFileSync("tmp." + this.type, req.body.code); | ||
13 | + } | ||
14 | + run() { | ||
15 | + switch (this.type) { | ||
16 | + case "c": { | ||
17 | + this.c(); | ||
18 | + } | ||
19 | + case "c++": { | ||
20 | + this.cpp(); | ||
21 | + } | ||
22 | + case "js": { | ||
23 | + this.js(); | ||
24 | + } | ||
25 | + case "go": { | ||
26 | + this.go(); | ||
27 | + } | ||
28 | + case "ts": { | ||
29 | + this.ts(); | ||
30 | + } | ||
31 | + } | ||
32 | + } | ||
33 | + c() { | ||
34 | + if ((this.input = [])) { | ||
35 | + const test = child_process.spawnSync("gcc", ["~/OSS/main/tmp.c"], { | ||
36 | + encoding: "utf8", | ||
37 | + shell: true, | ||
38 | + }); | ||
39 | + console.log(test.stderr); | ||
40 | + const result = child_process.spawnSync("~/OSS/main/a.out", { | ||
41 | + encoding: "utf8", | ||
42 | + shell: true, | ||
43 | + }); | ||
44 | + console.log(result.stdout); | ||
45 | + this.output.push(fix(result.stdout)); | ||
46 | + } | ||
47 | + for (let ip of this.input) { | ||
48 | + const test = child_process.spawnSync("gcc", ["~/OSS/main/tmp.c"], { | ||
49 | + encoding: "utf8", | ||
50 | + shell: true, | ||
51 | + }); | ||
52 | + console.log(test.stderr); | ||
53 | + const result = child_process.spawnSync("~/OSS/main/a.out", { | ||
54 | + encoding: "utf8", | ||
55 | + shell: true, | ||
56 | + input: ip, | ||
57 | + }); | ||
58 | + console.log(result.stdout); | ||
59 | + this.output.push(fix(result.stdout)); | ||
60 | + } | ||
61 | + } | ||
62 | + cpp() { | ||
63 | + if (this.input = []) { | ||
64 | + const test = child_process.spawnSync("gcc", ["~/OSS/main/tmp.c"], { | ||
65 | + encoding: "utf8", | ||
66 | + shell: true, | ||
67 | + }); | ||
68 | + console.log(test.stderr); | ||
69 | + const result = child_process.spawnSync("~/OSS/main/a.out", { | ||
70 | + encoding: "utf8", | ||
71 | + shell: true, | ||
72 | + }); | ||
73 | + console.log(result.stdout); | ||
74 | + this.output.push(fix(result.stdout)); | ||
75 | + } | ||
76 | + for (let ip of this.input) { | ||
77 | + const test = child_process.spawnSync("gcc", ["~/OSS/main/tmp.c"], { | ||
78 | + encoding: "utf8", | ||
79 | + shell: true, | ||
80 | + }); | ||
81 | + console.log(test.stderr); | ||
82 | + const result = child_process.spawnSync("~/OSS/main/a.out", { | ||
83 | + encoding: "utf8", | ||
84 | + shell: true, | ||
85 | + input: ip, | ||
86 | + }); | ||
87 | + console.log(result.stdout); | ||
88 | + this.output.push(fix(result.stdout)); | ||
89 | + } | ||
90 | + } | ||
91 | + js() { | ||
92 | + if (this.input = []) { | ||
93 | + const test = child_process.spawnSync("node", ["~/OSS/main/tmp.c"], { | ||
94 | + encoding: "utf8", | ||
95 | + shell: true, | ||
96 | + }); | ||
97 | + console.log(test.stdout); | ||
98 | + this.output.push(fix(test.stdout)); | ||
99 | + } | ||
100 | + for (let ip of this.input) { | ||
101 | + const test = child_process.spawnSync("node", ["~/OSS/main/tmp.c"], { | ||
102 | + encoding: "utf8", | ||
103 | + shell: true, | ||
104 | + input: ip, | ||
105 | + }); | ||
106 | + console.log(test.stdout); | ||
107 | + this.output.push(fix(test.stdout)); | ||
108 | + } | ||
109 | + } | ||
110 | + go() { | ||
111 | + if (this.input = []) { | ||
112 | + const test = child_process.spawnSync("go", ["run", "~/OSS/main/tmp.c"], { | ||
113 | + encoding: "utf8", | ||
114 | + shell: true, | ||
115 | + }); | ||
116 | + console.log(test.stdout); | ||
117 | + this.output.push(fix(test.stdout)); | ||
118 | + } | ||
119 | + for (let ip of this.input) { | ||
120 | + const test = child_process.spawnSync("go", ["run", "~/OSS/main/tmp.c"], { | ||
121 | + encoding: "utf8", | ||
122 | + shell: true, | ||
123 | + input: ip, | ||
124 | + }); | ||
125 | + console.log(test.stdout); | ||
126 | + this.output.push(fix(test.stdout)); | ||
127 | + } | ||
128 | + } | ||
129 | + ts() { | ||
130 | + if (this.input = []) { | ||
131 | + const test = child_process.spawnSync("ts-node", ["run", "~/OSS/main/tmp.c"], { | ||
132 | + encoding: "utf8", | ||
133 | + shell: true, | ||
134 | + }); | ||
135 | + console.log(test.stdout); | ||
136 | + this.output.push(fix(test.stdout)); | ||
137 | + } | ||
138 | + for (let ip of this.input) { | ||
139 | + const test = child_process.spawnSync("ts-node", ["run", "~/OSS/main/tmp.c"], { | ||
140 | + encoding: "utf8", | ||
141 | + shell: true, | ||
142 | + input: ip, | ||
143 | + }); | ||
144 | + console.log(test.stdout); | ||
145 | + this.output.push(fix(test.stdout)); | ||
146 | + } | ||
147 | + } | ||
148 | +} | ||
149 | + | ||
150 | +const fix = (a: any): string => { | ||
151 | + if (typeof a === "string") { | ||
152 | + return a; | ||
153 | + } | ||
154 | + return ""; | ||
155 | +}; |
tsconfig.json
0 → 100644
1 | +{ | ||
2 | + "compilerOptions": { | ||
3 | + /* Visit https://aka.ms/tsconfig.json to read more about this file */ | ||
4 | + | ||
5 | + /* Projects */ | ||
6 | + // "incremental": true, /* Enable incremental compilation */ | ||
7 | + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ | ||
8 | + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ | ||
9 | + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ | ||
10 | + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ | ||
11 | + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ | ||
12 | + | ||
13 | + /* Language and Environment */ | ||
14 | + "target": "es5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ | ||
15 | + "lib": ["es6","dom"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ | ||
16 | + // "jsx": "preserve", /* Specify what JSX code is generated. */ | ||
17 | + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ | ||
18 | + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ | ||
19 | + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ | ||
20 | + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ | ||
21 | + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ | ||
22 | + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ | ||
23 | + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ | ||
24 | + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ | ||
25 | + | ||
26 | + /* Modules */ | ||
27 | + "module": "commonjs", /* Specify what module code is generated. */ | ||
28 | + "rootDir": "src", /* Specify the root folder within your source files. */ | ||
29 | + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ | ||
30 | + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ | ||
31 | + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ | ||
32 | + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ | ||
33 | + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ | ||
34 | + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ | ||
35 | + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ | ||
36 | + "resolveJsonModule": true, /* Enable importing .json files */ | ||
37 | + // "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */ | ||
38 | + | ||
39 | + /* JavaScript Support */ | ||
40 | + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ | ||
41 | + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ | ||
42 | + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ | ||
43 | + | ||
44 | + /* Emit */ | ||
45 | + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ | ||
46 | + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ | ||
47 | + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ | ||
48 | + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ | ||
49 | + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ | ||
50 | + "outDir": "lib", /* Specify an output folder for all emitted files. */ | ||
51 | + // "removeComments": true, /* Disable emitting comments. */ | ||
52 | + // "noEmit": true, /* Disable emitting files from a compilation. */ | ||
53 | + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ | ||
54 | + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ | ||
55 | + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ | ||
56 | + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ | ||
57 | + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ | ||
58 | + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ | ||
59 | + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ | ||
60 | + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ | ||
61 | + // "newLine": "crlf", /* Set the newline character for emitting files. */ | ||
62 | + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ | ||
63 | + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ | ||
64 | + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ | ||
65 | + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ | ||
66 | + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ | ||
67 | + | ||
68 | + /* Interop Constraints */ | ||
69 | + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ | ||
70 | + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ | ||
71 | + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ | ||
72 | + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ | ||
73 | + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ | ||
74 | + | ||
75 | + /* Type Checking */ | ||
76 | + "strict": true, /* Enable all strict type-checking options. */ | ||
77 | + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ | ||
78 | + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ | ||
79 | + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ | ||
80 | + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ | ||
81 | + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ | ||
82 | + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ | ||
83 | + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ | ||
84 | + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ | ||
85 | + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ | ||
86 | + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ | ||
87 | + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ | ||
88 | + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ | ||
89 | + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ | ||
90 | + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ | ||
91 | + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ | ||
92 | + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ | ||
93 | + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ | ||
94 | + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ | ||
95 | + | ||
96 | + /* Completeness */ | ||
97 | + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ | ||
98 | + "skipLibCheck": true /* Skip type checking all .d.ts files. */ | ||
99 | + } | ||
100 | +} |
views/css/style.css
0 → 100644
File mode changed
views/index.html
0 → 100644
-
Please register or login to post a comment