Skip to content

Commit be5b650

Browse files
committed
javascript.workerのrunFiles()を実装
1 parent 1fa0d9a commit be5b650

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

app/terminal/page.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,10 @@ const sampleConfig: Record<RuntimeLang, SampleConfig> = {
6969
javascript: {
7070
repl: true,
7171
replInitContent: '> console.log("Hello, World!");\nHello, World!',
72-
editor: false,
73-
exec: false,
72+
editor: {
73+
"main.js": 'console.log("Hello, World!");',
74+
},
75+
exec: ["main.js"],
7476
},
7577
cpp: {
7678
repl: false,

app/terminal/tests.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ export function defineTests(
6060
python: [`${varName} = ${value}`, `print(${varName})`],
6161
ruby: [`${varName} = ${value}`, `puts ${varName}`],
6262
cpp: [null, null],
63-
javascript: [`var ${varName} = ${value}`, `console.log(${varName})`],
63+
javascript: [
64+
`var ${varName} = ${value}`,
65+
`console.log(${varName})`,
66+
],
6467
} satisfies Record<RuntimeLang, string[] | null[]>
6568
)[lang];
6669
if (!setIntVarCode || !printIntVarCode) {
@@ -109,7 +112,11 @@ export function defineTests(
109112
python: [`testVar = 42`, `while True:\n pass`, `print(testVar)`],
110113
ruby: [`testVar = 42`, `loop do\nend`, `puts testVar`],
111114
cpp: [null, null, null],
112-
javascript: [`var testVar = 42`, `while(true) {}`, `console.log(testVar)`],
115+
javascript: [
116+
`var testVar = 42`,
117+
`while(true) {}`,
118+
`console.log(testVar)`,
119+
],
113120
} satisfies Record<RuntimeLang, (string | null)[]>
114121
)[lang];
115122
if (!setIntVarCode || !infLoopCode || !printIntVarCode) {
@@ -156,7 +163,7 @@ export function defineTests(
156163
"test.cpp",
157164
`#include <iostream>\nint main() {\n std::cout << "${msg}" << std::endl;\n return 0;\n}\n`,
158165
],
159-
javascript: [null, null],
166+
javascript: ["test.js", `console.log("${msg}")`],
160167
} satisfies Record<RuntimeLang, [string, string] | [null, null]>
161168
)[lang];
162169
if (!filename || !code) {
@@ -185,7 +192,7 @@ export function defineTests(
185192
"test_error.cpp",
186193
`#include <stdexcept>\nint main() {\n throw std::runtime_error("${errorMsg}");\n return 0;\n}\n`,
187194
],
188-
javascript: [null, null],
195+
javascript: ["test_error.js", `throw new Error("${errorMsg}");\n`],
189196
} satisfies Record<RuntimeLang, [string, string] | [null, null]>
190197
)[lang];
191198
if (!filename || !code) {
@@ -230,7 +237,10 @@ export function defineTests(
230237
["test_multi_main.cpp", "test_multi_sub.cpp"],
231238
],
232239
javascript: [null, null],
233-
} satisfies Record<RuntimeLang, [Record<string, string>, string[]] | [null, null]>
240+
} satisfies Record<
241+
RuntimeLang,
242+
[Record<string, string>, string[]] | [null, null]
243+
>
234244
)[lang];
235245
if (!codes || !execFiles) {
236246
this.skip();

public/javascript.worker.js

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ async function runCode(id, payload) {
4141
}
4242
} catch (e) {
4343
originalConsole.log(e);
44+
// TODO: stack trace?
4445
if (e instanceof Error) {
4546
jsOutput.push({
4647
type: "error",
@@ -49,7 +50,7 @@ async function runCode(id, payload) {
4950
} else {
5051
jsOutput.push({
5152
type: "error",
52-
message: `予期せぬエラー: ${String(e)}`,
53+
message: `${String(e)}`,
5354
});
5455
}
5556
}
@@ -64,12 +65,31 @@ async function runCode(id, payload) {
6465
}
6566

6667
function runFile(id, payload) {
67-
const output = [
68-
{
69-
type: "error",
70-
message: "File execution is not supported in this runtime",
71-
},
72-
];
68+
const { name, files } = payload;
69+
// pyodide worker などと異なり、複数ファイルを読み込んでimportのようなことをするのには対応していません。
70+
try {
71+
// Execute code directly with eval in the worker global scope
72+
// This will preserve variables across calls
73+
globalThis.eval(files[name]);
74+
} catch (e) {
75+
originalConsole.log(e);
76+
// TODO: stack trace?
77+
if (e instanceof Error) {
78+
jsOutput.push({
79+
type: "error",
80+
message: `${e.name}: ${e.message}`,
81+
});
82+
} else {
83+
jsOutput.push({
84+
type: "error",
85+
message: `${String(e)}`,
86+
});
87+
}
88+
}
89+
90+
const output = [...jsOutput];
91+
jsOutput = []; // Clear output
92+
7393
self.postMessage({
7494
id,
7595
payload: { output, updatedFiles: [] },

0 commit comments

Comments
 (0)