@dodona/papyros 4.1.1 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Library.d.ts +11 -0
- package/dist/Library.js +11 -0
- package/dist/Library.js.map +1 -0
- package/dist/ProgrammingLanguage.d.ts +7 -0
- package/dist/ProgrammingLanguage.js +9 -0
- package/dist/ProgrammingLanguage.js.map +1 -0
- package/dist/backend/Backend.d.ts +92 -0
- package/dist/backend/Backend.js +79 -0
- package/dist/backend/Backend.js.map +1 -0
- package/dist/backend/workers/javascript/JavaScriptWorker.d.ts +39 -0
- package/dist/backend/workers/javascript/JavaScriptWorker.js +158 -0
- package/dist/backend/workers/javascript/JavaScriptWorker.js.map +1 -0
- package/dist/backend/workers/javascript/worker.d.ts +1 -0
- package/dist/backend/workers/javascript/worker.js +5 -0
- package/dist/backend/workers/javascript/worker.js.map +1 -0
- package/dist/backend/workers/python/PythonWorker.d.ts +32 -0
- package/dist/backend/workers/python/PythonWorker.js +117 -0
- package/dist/backend/workers/python/PythonWorker.js.map +1 -0
- package/dist/backend/workers/python/python_package.tar.gz.load_by_url +0 -0
- package/dist/backend/workers/python/worker.d.ts +1 -0
- package/dist/backend/workers/python/worker.js +5 -0
- package/dist/backend/workers/python/worker.js.map +1 -0
- package/dist/communication/BackendEvent.d.ts +33 -0
- package/dist/communication/BackendEvent.js +18 -0
- package/dist/communication/BackendEvent.js.map +1 -0
- package/dist/communication/BackendEventQueue.d.ts +59 -0
- package/dist/communication/BackendEventQueue.js +96 -0
- package/dist/communication/BackendEventQueue.js.map +1 -0
- package/dist/communication/BackendManager.d.ts +68 -0
- package/dist/communication/BackendManager.js +99 -0
- package/dist/communication/BackendManager.js.map +1 -0
- package/dist/communication/InputServiceWorker.d.ts +1 -0
- package/dist/communication/InputServiceWorker.js +37 -0
- package/dist/communication/InputServiceWorker.js.map +1 -0
- package/dist/communication/InputWorker.d.ts +22 -0
- package/dist/communication/InputWorker.js +63 -0
- package/dist/communication/InputWorker.js.map +1 -0
- package/dist/frontend/components/CodeRunner.d.ts +9 -0
- package/dist/frontend/components/CodeRunner.js +60 -0
- package/dist/frontend/components/CodeRunner.js.map +1 -0
- package/dist/frontend/components/Debugger.d.ts +7 -0
- package/dist/frontend/components/Debugger.js +75 -0
- package/dist/frontend/components/Debugger.js.map +1 -0
- package/dist/frontend/components/Input.d.ts +13 -0
- package/dist/frontend/components/Input.js +60 -0
- package/dist/frontend/components/Input.js.map +1 -0
- package/dist/frontend/components/Output.d.ts +14 -0
- package/dist/frontend/components/Output.js +157 -0
- package/dist/frontend/components/Output.js.map +1 -0
- package/dist/frontend/components/PapyrosElement.d.ts +8 -0
- package/dist/frontend/components/PapyrosElement.js +24 -0
- package/dist/frontend/components/PapyrosElement.js.map +1 -0
- package/dist/frontend/components/app/App.d.ts +24 -0
- package/dist/frontend/components/app/App.js +207 -0
- package/dist/frontend/components/app/App.js.map +1 -0
- package/dist/frontend/components/app/ExamplePicker.d.ts +7 -0
- package/dist/frontend/components/app/ExamplePicker.js +36 -0
- package/dist/frontend/components/app/ExamplePicker.js.map +1 -0
- package/dist/frontend/components/app/LanguagePicker.d.ts +7 -0
- package/dist/frontend/components/app/LanguagePicker.js +33 -0
- package/dist/frontend/components/app/LanguagePicker.js.map +1 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.d.ts +7 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js +38 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js.map +1 -0
- package/dist/frontend/components/app/examples/JavaScriptExamples.d.ts +5 -0
- package/dist/frontend/components/app/examples/JavaScriptExamples.js +16 -0
- package/dist/frontend/components/app/examples/JavaScriptExamples.js.map +1 -0
- package/dist/frontend/components/app/examples/PythonExamples.d.ts +14 -0
- package/dist/frontend/components/app/examples/PythonExamples.js +163 -0
- package/dist/frontend/components/app/examples/PythonExamples.js.map +1 -0
- package/dist/frontend/components/app/themes/ThemePicker.d.ts +11 -0
- package/dist/frontend/components/app/themes/ThemePicker.js +48 -0
- package/dist/frontend/components/app/themes/ThemePicker.js.map +1 -0
- package/dist/frontend/components/app/themes/ThemedButton.d.ts +9 -0
- package/dist/frontend/components/app/themes/ThemedButton.js +53 -0
- package/dist/frontend/components/app/themes/ThemedButton.js.map +1 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.d.ts +8 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.js +51 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/CodeEditor.d.ts +24 -0
- package/dist/frontend/components/code_mirror/CodeEditor.js +204 -0
- package/dist/frontend/components/code_mirror/CodeEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.d.ts +22 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js +111 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/Extensions.d.ts +15 -0
- package/dist/frontend/components/code_mirror/Extensions.js +164 -0
- package/dist/frontend/components/code_mirror/Extensions.js.map +1 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.d.ts +5 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.js +115 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.js.map +1 -0
- package/dist/frontend/components/code_runner/ButtonLint.d.ts +9 -0
- package/dist/frontend/components/code_runner/ButtonLint.js +72 -0
- package/dist/frontend/components/code_runner/ButtonLint.js.map +1 -0
- package/dist/frontend/components/code_runner/Code.d.ts +7 -0
- package/dist/frontend/components/code_runner/Code.js +48 -0
- package/dist/frontend/components/code_runner/Code.js.map +1 -0
- package/dist/frontend/components/code_runner/RunState.d.ts +7 -0
- package/dist/frontend/components/code_runner/RunState.js +41 -0
- package/dist/frontend/components/code_runner/RunState.js.map +1 -0
- package/dist/frontend/components/input/BatchInput.d.ts +9 -0
- package/dist/frontend/components/input/BatchInput.js +53 -0
- package/dist/frontend/components/input/BatchInput.js.map +1 -0
- package/dist/frontend/components/input/InteractiveInput.d.ts +13 -0
- package/dist/frontend/components/input/InteractiveInput.js +71 -0
- package/dist/frontend/components/input/InteractiveInput.js.map +1 -0
- package/dist/frontend/state/Constants.d.ts +38 -0
- package/dist/frontend/state/Constants.js +111 -0
- package/dist/frontend/state/Constants.js.map +1 -0
- package/dist/frontend/state/Debugger.d.ts +23 -0
- package/dist/frontend/state/Debugger.js +86 -0
- package/dist/frontend/state/Debugger.js.map +1 -0
- package/dist/frontend/state/Examples.d.ts +11 -0
- package/dist/frontend/state/Examples.js +36 -0
- package/dist/frontend/state/Examples.js.map +1 -0
- package/dist/frontend/state/I18n.d.ts +16 -0
- package/dist/frontend/state/I18n.js +75 -0
- package/dist/frontend/state/I18n.js.map +1 -0
- package/dist/frontend/state/InputOutput.d.ts +64 -0
- package/dist/frontend/state/InputOutput.js +146 -0
- package/dist/frontend/state/InputOutput.js.map +1 -0
- package/dist/frontend/state/Papyros.d.ts +40 -0
- package/dist/frontend/state/Papyros.js +115 -0
- package/dist/frontend/state/Papyros.js.map +1 -0
- package/dist/frontend/state/Runner.d.ts +123 -0
- package/dist/frontend/state/Runner.js +372 -0
- package/dist/frontend/state/Runner.js.map +1 -0
- package/dist/frontend/state/Test.d.ts +10 -0
- package/dist/frontend/state/Test.js +43 -0
- package/dist/frontend/state/Test.js.map +1 -0
- package/dist/frontend/state/Translations.d.ts +178 -0
- package/dist/frontend/state/Translations.js +187 -0
- package/dist/frontend/state/Translations.js.map +1 -0
- package/dist/frontend/state/themes/blue-dark.d.ts +2 -0
- package/dist/frontend/state/themes/blue-dark.js +56 -0
- package/dist/frontend/state/themes/blue-dark.js.map +1 -0
- package/dist/frontend/state/themes/blue-light.d.ts +2 -0
- package/dist/frontend/state/themes/blue-light.js +56 -0
- package/dist/frontend/state/themes/blue-light.js.map +1 -0
- package/dist/frontend/state/themes/green-dark.d.ts +2 -0
- package/dist/frontend/state/themes/green-dark.js +56 -0
- package/dist/frontend/state/themes/green-dark.js.map +1 -0
- package/dist/frontend/state/themes/green-light.d.ts +2 -0
- package/dist/frontend/state/themes/green-light.js +56 -0
- package/dist/frontend/state/themes/green-light.js.map +1 -0
- package/dist/frontend/state/themes/red-dark.d.ts +2 -0
- package/dist/frontend/state/themes/red-dark.js +56 -0
- package/dist/frontend/state/themes/red-dark.js.map +1 -0
- package/dist/frontend/state/themes/red-light.d.ts +2 -0
- package/dist/frontend/state/themes/red-light.js +56 -0
- package/dist/frontend/state/themes/red-light.js.map +1 -0
- package/dist/util/Logging.d.ts +15 -0
- package/dist/util/Logging.js +30 -0
- package/dist/util/Logging.js.map +1 -0
- package/dist/util/Util.d.ts +8 -0
- package/dist/util/Util.js +48 -0
- package/dist/util/Util.js.map +1 -0
- package/package.json +1 -1
- package/dist/assets/__vite-browser-external-9wXp6ZBx.js +0 -1
- package/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
- package/dist/assets/index-C1AWjGcU.js +0 -2202
- package/dist/assets/manifest-BaVmi6rC.json +0 -15
- package/dist/assets/python_package.tar.gz-B8aMWvGt.load_by_url +0 -0
- package/dist/assets/worker-BhABRh01.js +0 -5
- package/dist/assets/worker-C2Ju1j5g.js +0 -110
- package/dist/index.html +0 -26
- package/dist/manifest.json +0 -15
- package/dist/robots.txt +0 -3
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { SyncClient } from "comsync";
|
|
2
|
+
import { Backend, RunMode, WorkerDiagnostic } from "../../backend/Backend";
|
|
3
|
+
import { State } from "@dodona/lit-state";
|
|
4
|
+
import { Papyros } from "./Papyros";
|
|
5
|
+
import { ProgrammingLanguage } from "../../ProgrammingLanguage";
|
|
6
|
+
/**
|
|
7
|
+
* Enum representing the possible states while processing code
|
|
8
|
+
*/
|
|
9
|
+
export declare enum RunState {
|
|
10
|
+
Loading = "loading",
|
|
11
|
+
Running = "running",
|
|
12
|
+
AwaitingInput = "awaiting_input",
|
|
13
|
+
Stopping = "stopping",
|
|
14
|
+
Ready = "ready"
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Interface to represent information required when handling loading events
|
|
18
|
+
*/
|
|
19
|
+
export interface LoadingData {
|
|
20
|
+
/**
|
|
21
|
+
* List of module names that are being loaded
|
|
22
|
+
*/
|
|
23
|
+
modules: Array<string>;
|
|
24
|
+
/**
|
|
25
|
+
* The status of the import
|
|
26
|
+
*/
|
|
27
|
+
status: "loading" | "loaded" | "failed";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Helper component to manage and visualize the current RunState
|
|
31
|
+
*/
|
|
32
|
+
export declare class Runner extends State {
|
|
33
|
+
/**
|
|
34
|
+
* The currently used programming language
|
|
35
|
+
*/
|
|
36
|
+
private _programmingLanguage;
|
|
37
|
+
get programmingLanguage(): ProgrammingLanguage;
|
|
38
|
+
set programmingLanguage(value: ProgrammingLanguage);
|
|
39
|
+
/**
|
|
40
|
+
* The backend that executes the code asynchronously
|
|
41
|
+
*/
|
|
42
|
+
backend: Promise<SyncClient<Backend>>;
|
|
43
|
+
/**
|
|
44
|
+
* Current state of the program
|
|
45
|
+
*/
|
|
46
|
+
state: RunState;
|
|
47
|
+
/**
|
|
48
|
+
* An explanatory message about the current state
|
|
49
|
+
*/
|
|
50
|
+
stateMessage: string;
|
|
51
|
+
/**
|
|
52
|
+
* Previous state to restore when loading is done
|
|
53
|
+
*/
|
|
54
|
+
private previousState;
|
|
55
|
+
/**
|
|
56
|
+
* Array of packages that are being installed
|
|
57
|
+
*/
|
|
58
|
+
loadingPackages: Array<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Time at which the setState call occurred
|
|
61
|
+
*/
|
|
62
|
+
runStartTime: number;
|
|
63
|
+
/**
|
|
64
|
+
* The code we are working with
|
|
65
|
+
*/
|
|
66
|
+
_code: string;
|
|
67
|
+
get code(): string;
|
|
68
|
+
set code(value: string);
|
|
69
|
+
static CODE_SEPARATOR: string;
|
|
70
|
+
get effectiveCode(): string;
|
|
71
|
+
set effectiveCode(value: string);
|
|
72
|
+
/**
|
|
73
|
+
* Async getter for the linting diagnostics of the current code
|
|
74
|
+
*/
|
|
75
|
+
lintSource(): Promise<WorkerDiagnostic[]>;
|
|
76
|
+
/**
|
|
77
|
+
* available run modes for the current code
|
|
78
|
+
*/
|
|
79
|
+
runModes: Array<RunMode>;
|
|
80
|
+
/**
|
|
81
|
+
* The global state where we are part of
|
|
82
|
+
*/
|
|
83
|
+
private papyros;
|
|
84
|
+
constructor(papyros: Papyros);
|
|
85
|
+
/**
|
|
86
|
+
* Stops the current run and resets the state of the program
|
|
87
|
+
* Regular and debug output is cleared
|
|
88
|
+
* @return {Promise<void>} Returns when the program has been reset
|
|
89
|
+
*/
|
|
90
|
+
reset(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Start the backend to enable running code
|
|
93
|
+
*/
|
|
94
|
+
launch(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Execute the code in the editor
|
|
97
|
+
* @param {RunMode} mode The mode to run with
|
|
98
|
+
* @return {Promise<void>} Promise of running the code
|
|
99
|
+
*/
|
|
100
|
+
start(mode?: RunMode): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Interrupt the currently running code
|
|
103
|
+
* @return {Promise<void>} Returns when the code has been interrupted
|
|
104
|
+
*/
|
|
105
|
+
stop(): Promise<void>;
|
|
106
|
+
provideInput(input: string): Promise<void>;
|
|
107
|
+
provideFiles(inlinedFiles: Record<string, string>, hrefFiles: Record<string, string>): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Show the current state of the program to the user
|
|
110
|
+
* @param {RunState} state The current state of the run
|
|
111
|
+
* @param {string} message Optional message to indicate the state
|
|
112
|
+
*/
|
|
113
|
+
setState(state: RunState, message?: string): void;
|
|
114
|
+
/**
|
|
115
|
+
* Callback to handle loading events
|
|
116
|
+
* @param {BackendEvent} e The loading event
|
|
117
|
+
*/
|
|
118
|
+
private onLoad;
|
|
119
|
+
private onStart;
|
|
120
|
+
private onEnd;
|
|
121
|
+
private onError;
|
|
122
|
+
private updateRunModes;
|
|
123
|
+
}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
8
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
9
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
10
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
11
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
12
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
13
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
import { proxy } from "comlink";
|
|
17
|
+
import { RunMode } from "../../backend/Backend";
|
|
18
|
+
import { BackendEventType } from "../../communication/BackendEvent";
|
|
19
|
+
import { BackendManager } from "../../communication/BackendManager";
|
|
20
|
+
import { parseData } from "../../util/Util";
|
|
21
|
+
import { State, stateProperty } from "@dodona/lit-state";
|
|
22
|
+
import { ProgrammingLanguage } from "../../ProgrammingLanguage";
|
|
23
|
+
/**
|
|
24
|
+
* Enum representing the possible states while processing code
|
|
25
|
+
*/
|
|
26
|
+
export var RunState;
|
|
27
|
+
(function (RunState) {
|
|
28
|
+
RunState["Loading"] = "loading";
|
|
29
|
+
RunState["Running"] = "running";
|
|
30
|
+
RunState["AwaitingInput"] = "awaiting_input";
|
|
31
|
+
RunState["Stopping"] = "stopping";
|
|
32
|
+
RunState["Ready"] = "ready";
|
|
33
|
+
})(RunState || (RunState = {}));
|
|
34
|
+
/**
|
|
35
|
+
* Helper component to manage and visualize the current RunState
|
|
36
|
+
*/
|
|
37
|
+
export class Runner extends State {
|
|
38
|
+
get programmingLanguage() {
|
|
39
|
+
return this._programmingLanguage;
|
|
40
|
+
}
|
|
41
|
+
set programmingLanguage(value) {
|
|
42
|
+
if (this._programmingLanguage !== value) {
|
|
43
|
+
this._programmingLanguage = value;
|
|
44
|
+
this.launch();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
get code() {
|
|
48
|
+
return this._code;
|
|
49
|
+
}
|
|
50
|
+
set code(value) {
|
|
51
|
+
if (this._code !== value) {
|
|
52
|
+
this._code = value;
|
|
53
|
+
this.updateRunModes();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
get effectiveCode() {
|
|
57
|
+
let result = this.code;
|
|
58
|
+
if (this.papyros.test.testCode !== undefined) {
|
|
59
|
+
result += `${Runner.CODE_SEPARATOR}${this.papyros.test.testCode}`;
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
set effectiveCode(value) {
|
|
64
|
+
let codeWithoutTest = value;
|
|
65
|
+
if (this.papyros.test.testCode !== undefined) {
|
|
66
|
+
codeWithoutTest = codeWithoutTest.slice(0, -(Runner.CODE_SEPARATOR.length + this.papyros.test.testCode.length));
|
|
67
|
+
}
|
|
68
|
+
this.code = codeWithoutTest;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Async getter for the linting diagnostics of the current code
|
|
72
|
+
*/
|
|
73
|
+
lintSource() {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
const backend = yield this.backend;
|
|
76
|
+
const proxy = backend.workerProxy;
|
|
77
|
+
if (!proxy) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
return yield proxy.lintCode(this.code);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
constructor(papyros) {
|
|
84
|
+
super();
|
|
85
|
+
/**
|
|
86
|
+
* The currently used programming language
|
|
87
|
+
*/
|
|
88
|
+
this._programmingLanguage = ProgrammingLanguage.Python;
|
|
89
|
+
/**
|
|
90
|
+
* Current state of the program
|
|
91
|
+
*/
|
|
92
|
+
this.state = RunState.Ready;
|
|
93
|
+
/**
|
|
94
|
+
* An explanatory message about the current state
|
|
95
|
+
*/
|
|
96
|
+
this.stateMessage = "";
|
|
97
|
+
/**
|
|
98
|
+
* Previous state to restore when loading is done
|
|
99
|
+
*/
|
|
100
|
+
this.previousState = RunState.Ready;
|
|
101
|
+
/**
|
|
102
|
+
* Array of packages that are being installed
|
|
103
|
+
*/
|
|
104
|
+
this.loadingPackages = [];
|
|
105
|
+
/**
|
|
106
|
+
* Time at which the setState call occurred
|
|
107
|
+
*/
|
|
108
|
+
this.runStartTime = new Date().getTime();
|
|
109
|
+
/**
|
|
110
|
+
* The code we are working with
|
|
111
|
+
*/
|
|
112
|
+
this._code = "";
|
|
113
|
+
/**
|
|
114
|
+
* available run modes for the current code
|
|
115
|
+
*/
|
|
116
|
+
this.runModes = [RunMode.Debug];
|
|
117
|
+
this.papyros = papyros;
|
|
118
|
+
this.backend = Promise.resolve({});
|
|
119
|
+
BackendManager.subscribe(BackendEventType.Input, () => this.setState(RunState.AwaitingInput));
|
|
120
|
+
BackendManager.subscribe(BackendEventType.Loading, (e) => this.onLoad(e));
|
|
121
|
+
BackendManager.subscribe(BackendEventType.Start, (e) => this.onStart(e));
|
|
122
|
+
BackendManager.subscribe(BackendEventType.End, (e) => this.onEnd(e));
|
|
123
|
+
BackendManager.subscribe(BackendEventType.Error, () => this.onError());
|
|
124
|
+
BackendManager.subscribe(BackendEventType.Stop, () => this.stop());
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Stops the current run and resets the state of the program
|
|
128
|
+
* Regular and debug output is cleared
|
|
129
|
+
* @return {Promise<void>} Returns when the program has been reset
|
|
130
|
+
*/
|
|
131
|
+
reset() {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
if (![RunState.Ready, RunState.Loading].includes(this.state)) {
|
|
134
|
+
yield this.stop();
|
|
135
|
+
}
|
|
136
|
+
this.papyros.debugger.active = false;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Start the backend to enable running code
|
|
141
|
+
*/
|
|
142
|
+
launch() {
|
|
143
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
this.setState(RunState.Loading);
|
|
145
|
+
const backend = BackendManager.getBackend(this.programmingLanguage);
|
|
146
|
+
// Use a Promise to immediately enable running while downloading
|
|
147
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
148
|
+
this.backend = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
const workerProxy = backend.workerProxy;
|
|
150
|
+
// Allow passing messages between worker and main thread
|
|
151
|
+
yield workerProxy.launch(proxy((e) => BackendManager.publish(e)));
|
|
152
|
+
this.updateRunModes();
|
|
153
|
+
return resolve(backend);
|
|
154
|
+
}));
|
|
155
|
+
this.setState(RunState.Ready);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Execute the code in the editor
|
|
160
|
+
* @param {RunMode} mode The mode to run with
|
|
161
|
+
* @return {Promise<void>} Promise of running the code
|
|
162
|
+
*/
|
|
163
|
+
start(mode) {
|
|
164
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
165
|
+
this.papyros.debugger.active = mode === RunMode.Debug;
|
|
166
|
+
// Setup pre-run
|
|
167
|
+
this.setState(RunState.Loading);
|
|
168
|
+
// Ensure we go back to Loading after finishing any remaining installs
|
|
169
|
+
this.previousState = RunState.Loading;
|
|
170
|
+
BackendManager.publish({
|
|
171
|
+
type: BackendEventType.Start,
|
|
172
|
+
data: "StartClicked",
|
|
173
|
+
contentType: "text/plain",
|
|
174
|
+
});
|
|
175
|
+
let interrupted = false;
|
|
176
|
+
let terminated = false;
|
|
177
|
+
const backend = yield this.backend;
|
|
178
|
+
this.runStartTime = new Date().getTime();
|
|
179
|
+
try {
|
|
180
|
+
yield backend.call(backend.workerProxy.runCode, this.effectiveCode, mode);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (error.type === "InterruptError") {
|
|
184
|
+
// Error signaling forceful interrupt
|
|
185
|
+
interrupted = true;
|
|
186
|
+
terminated = true;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this.papyros.io.logError(error);
|
|
190
|
+
BackendManager.publish({
|
|
191
|
+
type: BackendEventType.End,
|
|
192
|
+
data: "RunError",
|
|
193
|
+
contentType: "text/plain",
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
if (this.state === RunState.Stopping) {
|
|
199
|
+
// Was interrupted, End message already published
|
|
200
|
+
interrupted = true;
|
|
201
|
+
}
|
|
202
|
+
if (terminated) {
|
|
203
|
+
yield this.launch();
|
|
204
|
+
}
|
|
205
|
+
if (interrupted || terminated) {
|
|
206
|
+
this.setState(RunState.Ready, this.papyros.i18n.t("Papyros.interrupted", {
|
|
207
|
+
time: (new Date().getTime() - this.runStartTime) / 1000,
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Interrupt the currently running code
|
|
215
|
+
* @return {Promise<void>} Returns when the code has been interrupted
|
|
216
|
+
*/
|
|
217
|
+
stop() {
|
|
218
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
219
|
+
this.setState(RunState.Stopping);
|
|
220
|
+
BackendManager.publish({
|
|
221
|
+
type: BackendEventType.End,
|
|
222
|
+
data: "User cancelled run",
|
|
223
|
+
contentType: "text/plain",
|
|
224
|
+
});
|
|
225
|
+
const backend = yield this.backend;
|
|
226
|
+
yield backend.interrupt();
|
|
227
|
+
const startTime = new Date().getTime();
|
|
228
|
+
while (this.state === RunState.Stopping && new Date().getTime() - startTime < 5000) {
|
|
229
|
+
yield new Promise((resolve) => setTimeout(resolve, 100));
|
|
230
|
+
}
|
|
231
|
+
if (this.state === RunState.Stopping) {
|
|
232
|
+
console.warn("Deadlock while stopping, restarting backend");
|
|
233
|
+
yield this.launch();
|
|
234
|
+
this.setState(RunState.Ready, this.papyros.i18n.t("Papyros.interrupted", { time: (new Date().getTime() - this.runStartTime) / 1000 }));
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
provideInput(input) {
|
|
239
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
240
|
+
const backend = yield this.backend;
|
|
241
|
+
this.setState(RunState.Running);
|
|
242
|
+
yield backend.writeMessage(input);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
provideFiles(inlinedFiles, hrefFiles) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
const fileNames = [...Object.keys(inlinedFiles), ...Object.keys(hrefFiles)];
|
|
248
|
+
if (fileNames.length === 0) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
BackendManager.publish({
|
|
252
|
+
type: BackendEventType.Loading,
|
|
253
|
+
data: JSON.stringify({
|
|
254
|
+
modules: fileNames,
|
|
255
|
+
status: "loading",
|
|
256
|
+
}),
|
|
257
|
+
});
|
|
258
|
+
const backend = yield this.backend;
|
|
259
|
+
yield backend.workerProxy.provideFiles(inlinedFiles, hrefFiles);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Show the current state of the program to the user
|
|
264
|
+
* @param {RunState} state The current state of the run
|
|
265
|
+
* @param {string} message Optional message to indicate the state
|
|
266
|
+
*/
|
|
267
|
+
setState(state, message) {
|
|
268
|
+
this.stateMessage = message || this.papyros.i18n.t(`Papyros.states.${state}`);
|
|
269
|
+
if (state !== this.state) {
|
|
270
|
+
this.previousState = this.state;
|
|
271
|
+
this.state = state;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Callback to handle loading events
|
|
276
|
+
* @param {BackendEvent} e The loading event
|
|
277
|
+
*/
|
|
278
|
+
onLoad(e) {
|
|
279
|
+
const loadingData = parseData(e.data, e.contentType);
|
|
280
|
+
if (loadingData.status === "loading") {
|
|
281
|
+
loadingData.modules.forEach((m) => {
|
|
282
|
+
if (!this.loadingPackages.includes(m)) {
|
|
283
|
+
this.loadingPackages.push(m);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
else if (loadingData.status === "loaded") {
|
|
288
|
+
loadingData.modules.forEach((m) => {
|
|
289
|
+
const index = this.loadingPackages.indexOf(m);
|
|
290
|
+
if (index !== -1) {
|
|
291
|
+
this.loadingPackages.splice(index, 1);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// failed
|
|
297
|
+
// If it is a true module, an Exception will be raised when running
|
|
298
|
+
// So this does not need to be handled here, as it is often an incomplete package-name
|
|
299
|
+
// that causes micropip to not find the correct wheel
|
|
300
|
+
this.loadingPackages = [];
|
|
301
|
+
}
|
|
302
|
+
if (this.loadingPackages.length > 0) {
|
|
303
|
+
const packageMessage = this.papyros.i18n.t("Papyros.loading", {
|
|
304
|
+
// limit amount of package names shown
|
|
305
|
+
packages: this.loadingPackages.slice(0, 3).join(", "),
|
|
306
|
+
});
|
|
307
|
+
this.setState(RunState.Loading, packageMessage);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
this.setState(this.previousState);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
onStart(e) {
|
|
314
|
+
const startData = parseData(e.data, e.contentType);
|
|
315
|
+
if (startData.includes("RunCode")) {
|
|
316
|
+
this.runStartTime = new Date().getTime();
|
|
317
|
+
this.setState(RunState.Running);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
onEnd(e) {
|
|
321
|
+
const endData = parseData(e.data, e.contentType);
|
|
322
|
+
if (endData.includes("CodeFinished")) {
|
|
323
|
+
this.setState(RunState.Ready, this.papyros.i18n.t("Papyros.finished", { time: (new Date().getTime() - this.runStartTime) / 1000 }));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
onError() {
|
|
327
|
+
this.setState(RunState.Ready, this.papyros.i18n.t("Papyros.finished", { time: (new Date().getTime() - this.runStartTime) / 1000 }));
|
|
328
|
+
}
|
|
329
|
+
updateRunModes() {
|
|
330
|
+
this.backend.then((backend) => __awaiter(this, void 0, void 0, function* () {
|
|
331
|
+
const proxy = backend.workerProxy;
|
|
332
|
+
if (proxy) {
|
|
333
|
+
this.runModes = yield proxy.runModes(this.effectiveCode);
|
|
334
|
+
}
|
|
335
|
+
}));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
Runner.CODE_SEPARATOR = "\n\n";
|
|
339
|
+
__decorate([
|
|
340
|
+
stateProperty
|
|
341
|
+
], Runner.prototype, "_programmingLanguage", void 0);
|
|
342
|
+
__decorate([
|
|
343
|
+
stateProperty
|
|
344
|
+
], Runner.prototype, "programmingLanguage", null);
|
|
345
|
+
__decorate([
|
|
346
|
+
stateProperty
|
|
347
|
+
], Runner.prototype, "backend", void 0);
|
|
348
|
+
__decorate([
|
|
349
|
+
stateProperty
|
|
350
|
+
], Runner.prototype, "state", void 0);
|
|
351
|
+
__decorate([
|
|
352
|
+
stateProperty
|
|
353
|
+
], Runner.prototype, "stateMessage", void 0);
|
|
354
|
+
__decorate([
|
|
355
|
+
stateProperty
|
|
356
|
+
], Runner.prototype, "loadingPackages", void 0);
|
|
357
|
+
__decorate([
|
|
358
|
+
stateProperty
|
|
359
|
+
], Runner.prototype, "runStartTime", void 0);
|
|
360
|
+
__decorate([
|
|
361
|
+
stateProperty
|
|
362
|
+
], Runner.prototype, "_code", void 0);
|
|
363
|
+
__decorate([
|
|
364
|
+
stateProperty
|
|
365
|
+
], Runner.prototype, "code", null);
|
|
366
|
+
__decorate([
|
|
367
|
+
stateProperty
|
|
368
|
+
], Runner.prototype, "effectiveCode", null);
|
|
369
|
+
__decorate([
|
|
370
|
+
stateProperty
|
|
371
|
+
], Runner.prototype, "runModes", void 0);
|
|
372
|
+
//# sourceMappingURL=Runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Runner.js","sourceRoot":"","sources":["../../../src/frontend/state/Runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { State } from "@dodona/lit-state";
|
|
2
|
+
import { Papyros } from "./Papyros";
|
|
3
|
+
export declare class Test extends State {
|
|
4
|
+
papyros: Papyros;
|
|
5
|
+
testCode: string | undefined;
|
|
6
|
+
editTestCode(): void;
|
|
7
|
+
get testLines(): number[] | undefined;
|
|
8
|
+
get testLineCount(): number | undefined;
|
|
9
|
+
constructor(papyros: Papyros);
|
|
10
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { State, stateProperty } from "@dodona/lit-state";
|
|
8
|
+
import { Runner } from "./Runner";
|
|
9
|
+
export class Test extends State {
|
|
10
|
+
editTestCode() {
|
|
11
|
+
this.papyros.runner.code = this.papyros.runner.effectiveCode;
|
|
12
|
+
this.testCode = undefined;
|
|
13
|
+
}
|
|
14
|
+
get testLines() {
|
|
15
|
+
if (this.testCode === undefined) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const codeLines = this.papyros.runner.code.split("\n").length;
|
|
19
|
+
const testLines = this.testCode.split("\n").length;
|
|
20
|
+
return Array.from({ length: testLines }, (_, i) => i + codeLines + Runner.CODE_SEPARATOR.length);
|
|
21
|
+
}
|
|
22
|
+
get testLineCount() {
|
|
23
|
+
if (this.testCode === undefined) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return this.testCode.split("\n").length;
|
|
27
|
+
}
|
|
28
|
+
constructor(papyros) {
|
|
29
|
+
super();
|
|
30
|
+
this.testCode = undefined;
|
|
31
|
+
this.papyros = papyros;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
__decorate([
|
|
35
|
+
stateProperty
|
|
36
|
+
], Test.prototype, "testCode", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
stateProperty
|
|
39
|
+
], Test.prototype, "testLines", null);
|
|
40
|
+
__decorate([
|
|
41
|
+
stateProperty
|
|
42
|
+
], Test.prototype, "testLineCount", null);
|
|
43
|
+
//# sourceMappingURL=Test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Test.js","sourceRoot":"","sources":["../../../src/frontend/state/Test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,OAAO,IAAK,SAAQ,KAAK;IAMpB,YAAY;QACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;QAC7D,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAW,SAAS;QAChB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrG,CAAC;IAGD,IAAW,aAAa;QACpB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,YAAY,OAAgB;QACxB,KAAK,EAAE,CAAC;QAzBL,aAAQ,GAAuB,SAAS,CAAC;QA0B5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;CACJ;AA5BU;IADN,aAAa;sCACkC;AAOhD;IADC,aAAa;qCAQb;AAGD;IADC,aAAa;yCAMb"}
|