@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.
Files changed (168) hide show
  1. package/dist/Library.d.ts +11 -0
  2. package/dist/Library.js +11 -0
  3. package/dist/Library.js.map +1 -0
  4. package/dist/ProgrammingLanguage.d.ts +7 -0
  5. package/dist/ProgrammingLanguage.js +9 -0
  6. package/dist/ProgrammingLanguage.js.map +1 -0
  7. package/dist/backend/Backend.d.ts +92 -0
  8. package/dist/backend/Backend.js +79 -0
  9. package/dist/backend/Backend.js.map +1 -0
  10. package/dist/backend/workers/javascript/JavaScriptWorker.d.ts +39 -0
  11. package/dist/backend/workers/javascript/JavaScriptWorker.js +158 -0
  12. package/dist/backend/workers/javascript/JavaScriptWorker.js.map +1 -0
  13. package/dist/backend/workers/javascript/worker.d.ts +1 -0
  14. package/dist/backend/workers/javascript/worker.js +5 -0
  15. package/dist/backend/workers/javascript/worker.js.map +1 -0
  16. package/dist/backend/workers/python/PythonWorker.d.ts +32 -0
  17. package/dist/backend/workers/python/PythonWorker.js +117 -0
  18. package/dist/backend/workers/python/PythonWorker.js.map +1 -0
  19. package/dist/backend/workers/python/python_package.tar.gz.load_by_url +0 -0
  20. package/dist/backend/workers/python/worker.d.ts +1 -0
  21. package/dist/backend/workers/python/worker.js +5 -0
  22. package/dist/backend/workers/python/worker.js.map +1 -0
  23. package/dist/communication/BackendEvent.d.ts +33 -0
  24. package/dist/communication/BackendEvent.js +18 -0
  25. package/dist/communication/BackendEvent.js.map +1 -0
  26. package/dist/communication/BackendEventQueue.d.ts +59 -0
  27. package/dist/communication/BackendEventQueue.js +96 -0
  28. package/dist/communication/BackendEventQueue.js.map +1 -0
  29. package/dist/communication/BackendManager.d.ts +68 -0
  30. package/dist/communication/BackendManager.js +99 -0
  31. package/dist/communication/BackendManager.js.map +1 -0
  32. package/dist/communication/InputServiceWorker.d.ts +1 -0
  33. package/dist/communication/InputServiceWorker.js +37 -0
  34. package/dist/communication/InputServiceWorker.js.map +1 -0
  35. package/dist/communication/InputWorker.d.ts +22 -0
  36. package/dist/communication/InputWorker.js +63 -0
  37. package/dist/communication/InputWorker.js.map +1 -0
  38. package/dist/frontend/components/CodeRunner.d.ts +9 -0
  39. package/dist/frontend/components/CodeRunner.js +60 -0
  40. package/dist/frontend/components/CodeRunner.js.map +1 -0
  41. package/dist/frontend/components/Debugger.d.ts +7 -0
  42. package/dist/frontend/components/Debugger.js +75 -0
  43. package/dist/frontend/components/Debugger.js.map +1 -0
  44. package/dist/frontend/components/Input.d.ts +13 -0
  45. package/dist/frontend/components/Input.js +60 -0
  46. package/dist/frontend/components/Input.js.map +1 -0
  47. package/dist/frontend/components/Output.d.ts +14 -0
  48. package/dist/frontend/components/Output.js +157 -0
  49. package/dist/frontend/components/Output.js.map +1 -0
  50. package/dist/frontend/components/PapyrosElement.d.ts +8 -0
  51. package/dist/frontend/components/PapyrosElement.js +24 -0
  52. package/dist/frontend/components/PapyrosElement.js.map +1 -0
  53. package/dist/frontend/components/app/App.d.ts +24 -0
  54. package/dist/frontend/components/app/App.js +207 -0
  55. package/dist/frontend/components/app/App.js.map +1 -0
  56. package/dist/frontend/components/app/ExamplePicker.d.ts +7 -0
  57. package/dist/frontend/components/app/ExamplePicker.js +36 -0
  58. package/dist/frontend/components/app/ExamplePicker.js.map +1 -0
  59. package/dist/frontend/components/app/LanguagePicker.d.ts +7 -0
  60. package/dist/frontend/components/app/LanguagePicker.js +33 -0
  61. package/dist/frontend/components/app/LanguagePicker.js.map +1 -0
  62. package/dist/frontend/components/app/ProgrammingLanguagePicker.d.ts +7 -0
  63. package/dist/frontend/components/app/ProgrammingLanguagePicker.js +38 -0
  64. package/dist/frontend/components/app/ProgrammingLanguagePicker.js.map +1 -0
  65. package/dist/frontend/components/app/examples/JavaScriptExamples.d.ts +5 -0
  66. package/dist/frontend/components/app/examples/JavaScriptExamples.js +16 -0
  67. package/dist/frontend/components/app/examples/JavaScriptExamples.js.map +1 -0
  68. package/dist/frontend/components/app/examples/PythonExamples.d.ts +14 -0
  69. package/dist/frontend/components/app/examples/PythonExamples.js +163 -0
  70. package/dist/frontend/components/app/examples/PythonExamples.js.map +1 -0
  71. package/dist/frontend/components/app/themes/ThemePicker.d.ts +11 -0
  72. package/dist/frontend/components/app/themes/ThemePicker.js +48 -0
  73. package/dist/frontend/components/app/themes/ThemePicker.js.map +1 -0
  74. package/dist/frontend/components/app/themes/ThemedButton.d.ts +9 -0
  75. package/dist/frontend/components/app/themes/ThemedButton.js +53 -0
  76. package/dist/frontend/components/app/themes/ThemedButton.js.map +1 -0
  77. package/dist/frontend/components/code_mirror/BatchInputEditor.d.ts +8 -0
  78. package/dist/frontend/components/code_mirror/BatchInputEditor.js +51 -0
  79. package/dist/frontend/components/code_mirror/BatchInputEditor.js.map +1 -0
  80. package/dist/frontend/components/code_mirror/CodeEditor.d.ts +24 -0
  81. package/dist/frontend/components/code_mirror/CodeEditor.js +204 -0
  82. package/dist/frontend/components/code_mirror/CodeEditor.js.map +1 -0
  83. package/dist/frontend/components/code_mirror/CodeMirrorEditor.d.ts +22 -0
  84. package/dist/frontend/components/code_mirror/CodeMirrorEditor.js +111 -0
  85. package/dist/frontend/components/code_mirror/CodeMirrorEditor.js.map +1 -0
  86. package/dist/frontend/components/code_mirror/Extensions.d.ts +15 -0
  87. package/dist/frontend/components/code_mirror/Extensions.js +164 -0
  88. package/dist/frontend/components/code_mirror/Extensions.js.map +1 -0
  89. package/dist/frontend/components/code_mirror/MaterialTheme.d.ts +5 -0
  90. package/dist/frontend/components/code_mirror/MaterialTheme.js +115 -0
  91. package/dist/frontend/components/code_mirror/MaterialTheme.js.map +1 -0
  92. package/dist/frontend/components/code_runner/ButtonLint.d.ts +9 -0
  93. package/dist/frontend/components/code_runner/ButtonLint.js +72 -0
  94. package/dist/frontend/components/code_runner/ButtonLint.js.map +1 -0
  95. package/dist/frontend/components/code_runner/Code.d.ts +7 -0
  96. package/dist/frontend/components/code_runner/Code.js +48 -0
  97. package/dist/frontend/components/code_runner/Code.js.map +1 -0
  98. package/dist/frontend/components/code_runner/RunState.d.ts +7 -0
  99. package/dist/frontend/components/code_runner/RunState.js +41 -0
  100. package/dist/frontend/components/code_runner/RunState.js.map +1 -0
  101. package/dist/frontend/components/input/BatchInput.d.ts +9 -0
  102. package/dist/frontend/components/input/BatchInput.js +53 -0
  103. package/dist/frontend/components/input/BatchInput.js.map +1 -0
  104. package/dist/frontend/components/input/InteractiveInput.d.ts +13 -0
  105. package/dist/frontend/components/input/InteractiveInput.js +71 -0
  106. package/dist/frontend/components/input/InteractiveInput.js.map +1 -0
  107. package/dist/frontend/state/Constants.d.ts +38 -0
  108. package/dist/frontend/state/Constants.js +111 -0
  109. package/dist/frontend/state/Constants.js.map +1 -0
  110. package/dist/frontend/state/Debugger.d.ts +23 -0
  111. package/dist/frontend/state/Debugger.js +86 -0
  112. package/dist/frontend/state/Debugger.js.map +1 -0
  113. package/dist/frontend/state/Examples.d.ts +11 -0
  114. package/dist/frontend/state/Examples.js +36 -0
  115. package/dist/frontend/state/Examples.js.map +1 -0
  116. package/dist/frontend/state/I18n.d.ts +16 -0
  117. package/dist/frontend/state/I18n.js +75 -0
  118. package/dist/frontend/state/I18n.js.map +1 -0
  119. package/dist/frontend/state/InputOutput.d.ts +64 -0
  120. package/dist/frontend/state/InputOutput.js +146 -0
  121. package/dist/frontend/state/InputOutput.js.map +1 -0
  122. package/dist/frontend/state/Papyros.d.ts +40 -0
  123. package/dist/frontend/state/Papyros.js +115 -0
  124. package/dist/frontend/state/Papyros.js.map +1 -0
  125. package/dist/frontend/state/Runner.d.ts +123 -0
  126. package/dist/frontend/state/Runner.js +372 -0
  127. package/dist/frontend/state/Runner.js.map +1 -0
  128. package/dist/frontend/state/Test.d.ts +10 -0
  129. package/dist/frontend/state/Test.js +43 -0
  130. package/dist/frontend/state/Test.js.map +1 -0
  131. package/dist/frontend/state/Translations.d.ts +178 -0
  132. package/dist/frontend/state/Translations.js +187 -0
  133. package/dist/frontend/state/Translations.js.map +1 -0
  134. package/dist/frontend/state/themes/blue-dark.d.ts +2 -0
  135. package/dist/frontend/state/themes/blue-dark.js +56 -0
  136. package/dist/frontend/state/themes/blue-dark.js.map +1 -0
  137. package/dist/frontend/state/themes/blue-light.d.ts +2 -0
  138. package/dist/frontend/state/themes/blue-light.js +56 -0
  139. package/dist/frontend/state/themes/blue-light.js.map +1 -0
  140. package/dist/frontend/state/themes/green-dark.d.ts +2 -0
  141. package/dist/frontend/state/themes/green-dark.js +56 -0
  142. package/dist/frontend/state/themes/green-dark.js.map +1 -0
  143. package/dist/frontend/state/themes/green-light.d.ts +2 -0
  144. package/dist/frontend/state/themes/green-light.js +56 -0
  145. package/dist/frontend/state/themes/green-light.js.map +1 -0
  146. package/dist/frontend/state/themes/red-dark.d.ts +2 -0
  147. package/dist/frontend/state/themes/red-dark.js +56 -0
  148. package/dist/frontend/state/themes/red-dark.js.map +1 -0
  149. package/dist/frontend/state/themes/red-light.d.ts +2 -0
  150. package/dist/frontend/state/themes/red-light.js +56 -0
  151. package/dist/frontend/state/themes/red-light.js.map +1 -0
  152. package/dist/util/Logging.d.ts +15 -0
  153. package/dist/util/Logging.js +30 -0
  154. package/dist/util/Logging.js.map +1 -0
  155. package/dist/util/Util.d.ts +8 -0
  156. package/dist/util/Util.js +48 -0
  157. package/dist/util/Util.js.map +1 -0
  158. package/package.json +1 -1
  159. package/dist/assets/__vite-browser-external-9wXp6ZBx.js +0 -1
  160. package/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  161. package/dist/assets/index-C1AWjGcU.js +0 -2202
  162. package/dist/assets/manifest-BaVmi6rC.json +0 -15
  163. package/dist/assets/python_package.tar.gz-B8aMWvGt.load_by_url +0 -0
  164. package/dist/assets/worker-BhABRh01.js +0 -5
  165. package/dist/assets/worker-C2Ju1j5g.js +0 -110
  166. package/dist/index.html +0 -26
  167. package/dist/manifest.json +0 -15
  168. package/dist/robots.txt +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../../src/frontend/state/Constants.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAa,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAEnE,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAQxC,MAAM,OAAO,SAAU,SAAQ,KAAK;IAApC;;QACI;;;;;WAKG;QAEH,oBAAe,GAAW,IAAI,CAAC;QAC/B;;;;WAIG;QAEH,mBAAc,GAAW,KAAK,CAAC;QAG/B,UAAK,GAAG;YACJ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAA;;;;eAId;YACP,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAA;;eAEZ;YACP,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;;eAEhB;YACP,IAAI,EAAE,IAAI,CAAA;;eAEH;YACP,SAAS,EAAE,IAAI,CAAA;;;;eAIR;YACP,IAAI,EAAE,IAAI,CAAA;;;;;;SAMT;YACD,IAAI,EAAE,IAAI,CAAA;;;;;;SAMT;SACJ,CAAC;QAGF,oBAAe,GAAW,CAAC,CAAC;QAG5B,oBAAe,GAAc,QAAQ,CAAC;QAGtC,WAAM,GAAgC;YAClC,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;YACnE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;YAC/D,aAAa,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE;YACtE,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE;YAClE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;YAChE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE;SAC/D,CAAC;QAGM,qBAAgB,GAAW,YAAY,CAAC;IAUpD,CAAC;IAPG,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,WAAW,CAAC,KAAkB;QAC9B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC;IACvC,CAAC;CACJ;AAzEG;IADC,aAAa;kDACiB;AAO/B;IADC,aAAa;iDACiB;AAG/B;IADC,aAAa;wCAmCZ;AAGF;IADC,aAAa;kDACc;AAG5B;IADC,aAAa;kDACwB;AAGtC;IADC,aAAa;yCAQZ;AAGM;IADP,aAAa;mDACkC;AAGhD;IADC,aAAa;4CAGb"}
@@ -0,0 +1,23 @@
1
+ import { Frame } from "@dodona/trace-component/dist/trace_types";
2
+ import { State } from "@dodona/lit-state";
3
+ import { Papyros } from "./Papyros";
4
+ export type FrameState = {
5
+ line: number;
6
+ outputs: number;
7
+ inputs: number;
8
+ };
9
+ export declare class Debugger extends State {
10
+ private papyros;
11
+ private frameStates;
12
+ activeFrame: number | undefined;
13
+ trace: Frame[];
14
+ private _active;
15
+ set active(active: boolean);
16
+ get active(): boolean;
17
+ constructor(papyros: Papyros);
18
+ reset(): void;
19
+ get activeFrameState(): FrameState | undefined;
20
+ get debugLine(): number | undefined;
21
+ get debugOutputs(): number | undefined;
22
+ get debugUsedInputs(): number | undefined;
23
+ }
@@ -0,0 +1,86 @@
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 { BackendManager } from "../../communication/BackendManager";
8
+ import { BackendEventType } from "../../communication/BackendEvent";
9
+ import { State, stateProperty } from "@dodona/lit-state";
10
+ export class Debugger extends State {
11
+ set active(active) {
12
+ this._active = active;
13
+ this.reset();
14
+ }
15
+ get active() {
16
+ return this._active;
17
+ }
18
+ constructor(papyros) {
19
+ super();
20
+ this.frameStates = [];
21
+ this.activeFrame = undefined;
22
+ this.trace = [];
23
+ this._active = false;
24
+ this.papyros = papyros;
25
+ this.reset();
26
+ BackendManager.subscribe(BackendEventType.Start, () => {
27
+ this.reset();
28
+ });
29
+ BackendManager.subscribe(BackendEventType.Frame, (e) => {
30
+ var _a;
31
+ (_a = this.activeFrame) !== null && _a !== void 0 ? _a : (this.activeFrame = 0);
32
+ const frame = JSON.parse(e.data);
33
+ const frameState = {
34
+ line: frame.line,
35
+ outputs: this.papyros.io.output.length,
36
+ inputs: this.papyros.io.inputs.length,
37
+ };
38
+ this.frameStates = [...this.frameStates, frameState];
39
+ this.trace = [...this.trace, frame];
40
+ if (this.frameStates.length >= this.papyros.constants.maxDebugFrames) {
41
+ this.papyros.runner.stop();
42
+ }
43
+ });
44
+ }
45
+ reset() {
46
+ this.frameStates = [];
47
+ this.currentOutputs = 0;
48
+ this.currentInputs = 0;
49
+ this.activeFrame = undefined;
50
+ this.trace = [];
51
+ }
52
+ get activeFrameState() {
53
+ if (this.activeFrame === undefined) {
54
+ return undefined;
55
+ }
56
+ return this.frameStates[this.activeFrame];
57
+ }
58
+ get debugLine() {
59
+ var _a;
60
+ return (_a = this.activeFrameState) === null || _a === void 0 ? void 0 : _a.line;
61
+ }
62
+ get debugOutputs() {
63
+ var _a;
64
+ return (_a = this.activeFrameState) === null || _a === void 0 ? void 0 : _a.outputs;
65
+ }
66
+ get debugUsedInputs() {
67
+ var _a;
68
+ return (_a = this.activeFrameState) === null || _a === void 0 ? void 0 : _a.inputs;
69
+ }
70
+ }
71
+ __decorate([
72
+ stateProperty
73
+ ], Debugger.prototype, "frameStates", void 0);
74
+ __decorate([
75
+ stateProperty
76
+ ], Debugger.prototype, "activeFrame", void 0);
77
+ __decorate([
78
+ stateProperty
79
+ ], Debugger.prototype, "trace", void 0);
80
+ __decorate([
81
+ stateProperty
82
+ ], Debugger.prototype, "_active", void 0);
83
+ __decorate([
84
+ stateProperty
85
+ ], Debugger.prototype, "active", null);
86
+ //# sourceMappingURL=Debugger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Debugger.js","sourceRoot":"","sources":["../../../src/frontend/state/Debugger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { State } from "@dodona/lit-state";
2
+ import { ProgrammingLanguage } from "../../ProgrammingLanguage";
3
+ import { Papyros } from "./Papyros";
4
+ export declare class Examples extends State {
5
+ papyros: Papyros;
6
+ private examples;
7
+ constructor(papyros: Papyros);
8
+ setExamples(language: ProgrammingLanguage, examples: Record<string, string>): void;
9
+ get names(): Array<string>;
10
+ getExampleCode(name: string): string;
11
+ }
@@ -0,0 +1,36 @@
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, StateMap, stateProperty } from "@dodona/lit-state";
8
+ import { ProgrammingLanguage } from "../../ProgrammingLanguage";
9
+ import { JAVASCRIPT_EXAMPLES } from "../components/app/examples/JavaScriptExamples";
10
+ import { PYTHON_EXAMPLES } from "../components/app/examples/PythonExamples";
11
+ export class Examples extends State {
12
+ constructor(papyros) {
13
+ super();
14
+ this.examples = new StateMap();
15
+ this.papyros = papyros;
16
+ this.setExamples(ProgrammingLanguage.JavaScript, JAVASCRIPT_EXAMPLES);
17
+ this.setExamples(ProgrammingLanguage.Python, PYTHON_EXAMPLES);
18
+ }
19
+ setExamples(language, examples) {
20
+ this.examples.set(language, examples);
21
+ }
22
+ get names() {
23
+ var _a;
24
+ const language = this.papyros.runner.programmingLanguage;
25
+ return Object.keys((_a = this.examples.get(language)) !== null && _a !== void 0 ? _a : {});
26
+ }
27
+ getExampleCode(name) {
28
+ var _a, _b;
29
+ const language = this.papyros.runner.programmingLanguage;
30
+ return (_b = (_a = this.examples.get(language)) === null || _a === void 0 ? void 0 : _a[name]) !== null && _b !== void 0 ? _b : "";
31
+ }
32
+ }
33
+ __decorate([
34
+ stateProperty
35
+ ], Examples.prototype, "examples", void 0);
36
+ //# sourceMappingURL=Examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Examples.js","sourceRoot":"","sources":["../../../src/frontend/state/Examples.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAE5E,MAAM,OAAO,QAAS,SAAQ,KAAK;IAK/B,YAAY,OAAgB;QACxB,KAAK,EAAE,CAAC;QAHJ,aAAQ,GAAG,IAAI,QAAQ,EAA+C,CAAC;QAI3E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;IAEM,WAAW,CAAC,QAA6B,EAAE,QAAgC;QAC9E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,IAAW,KAAK;;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,mCAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAEM,cAAc,CAAC,IAAY;;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACzD,OAAO,MAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,0CAAG,IAAI,CAAC,mCAAI,EAAE,CAAC;IACrD,CAAC;CACJ;AAtBW;IADP,aAAa;0CACiE"}
@@ -0,0 +1,16 @@
1
+ import { State } from "@dodona/lit-state";
2
+ export type Translations = {
3
+ [key: string]: string | Translations;
4
+ };
5
+ export declare class I18n extends State {
6
+ private readonly polyglot;
7
+ private readonly translations;
8
+ private _locale;
9
+ get availableLocales(): string[];
10
+ setTranslations(locale: string, translations: Translations): void;
11
+ set locale(locale: string);
12
+ get locale(): string;
13
+ t(phrase: string, options?: Record<string, any>): string;
14
+ getTranslations(key?: string): Translations | undefined;
15
+ constructor();
16
+ }
@@ -0,0 +1,75 @@
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, StateMap, stateProperty } from "@dodona/lit-state";
8
+ import Polyglot from "node-polyglot";
9
+ import { DUTCH_TRANSLATION, ENGLISH_TRANSLATION } from "./Translations";
10
+ export class I18n extends State {
11
+ get availableLocales() {
12
+ return [...this.translations.keys()];
13
+ }
14
+ setTranslations(locale, translations) {
15
+ this.translations.set(locale, translations);
16
+ if (this.locale === locale) {
17
+ this.dispatchStateEvent("t");
18
+ this.polyglot.replace(this.translations.get(locale));
19
+ }
20
+ }
21
+ set locale(locale) {
22
+ if (this.translations.has(locale)) {
23
+ this.dispatchStateEvent("t");
24
+ this._locale = locale;
25
+ this.polyglot.locale(locale);
26
+ this.polyglot.replace(this.translations.get(locale));
27
+ }
28
+ else {
29
+ throw new Error(`Locale ${locale} not loaded`);
30
+ }
31
+ }
32
+ get locale() {
33
+ return this._locale;
34
+ }
35
+ t(phrase, options) {
36
+ this.recordRead("t");
37
+ return this.polyglot.t(phrase, options);
38
+ }
39
+ getTranslations(key) {
40
+ if (!this.translations.has(this.locale)) {
41
+ return undefined;
42
+ }
43
+ if (!key) {
44
+ return this.translations.get(this.locale);
45
+ }
46
+ const keys = key.split(".");
47
+ let record = this.translations.get(this.locale);
48
+ for (const k of keys) {
49
+ if (typeof record === "string" || !(k in record)) {
50
+ return undefined;
51
+ }
52
+ record = record[k];
53
+ }
54
+ if (typeof record === "string") {
55
+ return undefined;
56
+ }
57
+ return record;
58
+ }
59
+ constructor() {
60
+ super();
61
+ this.polyglot = new Polyglot();
62
+ this.translations = new StateMap();
63
+ this._locale = "en";
64
+ this.polyglot.locale(this.locale);
65
+ this.setTranslations("en", ENGLISH_TRANSLATION);
66
+ this.setTranslations("nl", DUTCH_TRANSLATION);
67
+ }
68
+ }
69
+ __decorate([
70
+ stateProperty
71
+ ], I18n.prototype, "_locale", void 0);
72
+ __decorate([
73
+ stateProperty
74
+ ], I18n.prototype, "locale", null);
75
+ //# sourceMappingURL=I18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"I18n.js","sourceRoot":"","sources":["../../../src/frontend/state/I18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { State } from "@dodona/lit-state";
2
+ import { Papyros } from "./Papyros";
3
+ /**
4
+ * Shape of Error objects that are easy to interpret
5
+ */
6
+ export interface FriendlyError {
7
+ /**
8
+ * The name of the Error
9
+ */
10
+ name: string;
11
+ /**
12
+ * Traceback for where in the code the Error occurred
13
+ */
14
+ traceback?: string;
15
+ /**
16
+ * General information about this type of Error
17
+ */
18
+ info?: string;
19
+ /**
20
+ * Information about what went wrong in this case
21
+ */
22
+ what?: string;
23
+ /**
24
+ * Information about why this is wrong and how to fix it
25
+ */
26
+ why?: string;
27
+ /**
28
+ * Where specifically in the source code the Error occurred
29
+ */
30
+ where?: string;
31
+ }
32
+ export declare enum OutputType {
33
+ stdout = "stdout",
34
+ stderr = "stderr",
35
+ img = "img"
36
+ }
37
+ export type OutputEntry = {
38
+ type: OutputType;
39
+ content: string | FriendlyError;
40
+ contentType?: string;
41
+ };
42
+ export declare enum InputMode {
43
+ batch = "batch",
44
+ interactive = "interactive"
45
+ }
46
+ export declare class InputOutput extends State {
47
+ private papyros;
48
+ inputs: string[];
49
+ output: OutputEntry[];
50
+ prompt: string;
51
+ awaitingInput: boolean;
52
+ inputMode: InputMode;
53
+ private _inputBuffer;
54
+ get inputBuffer(): string;
55
+ set inputBuffer(value: string);
56
+ private get nextBufferedLine();
57
+ constructor(papyros: Papyros);
58
+ logError(error: FriendlyError | string): void;
59
+ logImage(imageData: string, contentType?: string): void;
60
+ logOutput(output: string): void;
61
+ provideInput(input: string): void;
62
+ clearInputs(): void;
63
+ reset(): void;
64
+ }
@@ -0,0 +1,146 @@
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 { BackendManager } from "../../communication/BackendManager";
9
+ import { BackendEventType } from "../../communication/BackendEvent";
10
+ import { parseData } from "../../util/Util";
11
+ import { RunState } from "./Runner";
12
+ export var OutputType;
13
+ (function (OutputType) {
14
+ OutputType["stdout"] = "stdout";
15
+ OutputType["stderr"] = "stderr";
16
+ OutputType["img"] = "img";
17
+ })(OutputType || (OutputType = {}));
18
+ export var InputMode;
19
+ (function (InputMode) {
20
+ InputMode["batch"] = "batch";
21
+ InputMode["interactive"] = "interactive";
22
+ })(InputMode || (InputMode = {}));
23
+ export class InputOutput extends State {
24
+ get inputBuffer() {
25
+ return this._inputBuffer;
26
+ }
27
+ set inputBuffer(value) {
28
+ this._inputBuffer = value;
29
+ if (this.nextBufferedLine !== undefined && this.inputMode === InputMode.batch && this.awaitingInput) {
30
+ this.provideInput(this.nextBufferedLine);
31
+ }
32
+ if (!this.papyros.debugger.active && this.papyros.runner.state === RunState.Ready) {
33
+ this.clearInputs();
34
+ }
35
+ }
36
+ get nextBufferedLine() {
37
+ const bufferedLines = this.inputBuffer.split("\n").slice(0, -1);
38
+ if (bufferedLines.length > this.inputs.length) {
39
+ return bufferedLines[this.inputs.length];
40
+ }
41
+ return undefined;
42
+ }
43
+ constructor(papyros) {
44
+ super();
45
+ this.inputs = [];
46
+ this.output = [];
47
+ this.prompt = "";
48
+ this.awaitingInput = false;
49
+ this.inputMode = InputMode.interactive;
50
+ this._inputBuffer = "";
51
+ this.papyros = papyros;
52
+ this.reset();
53
+ BackendManager.subscribe(BackendEventType.Start, () => this.reset());
54
+ BackendManager.subscribe(BackendEventType.Output, (e) => {
55
+ const data = parseData(e.data, e.contentType);
56
+ if (e.contentType && e.contentType.startsWith("img")) {
57
+ this.logImage(data, e.contentType);
58
+ }
59
+ else {
60
+ this.logOutput(data);
61
+ }
62
+ });
63
+ BackendManager.subscribe(BackendEventType.Error, (e) => {
64
+ const data = parseData(e.data, e.contentType);
65
+ this.logError(data);
66
+ });
67
+ BackendManager.subscribe(BackendEventType.Input, (e) => {
68
+ if (this.nextBufferedLine !== undefined && this.inputMode === InputMode.batch) {
69
+ this.provideInput(this.nextBufferedLine);
70
+ return;
71
+ }
72
+ this.prompt = e.data || "";
73
+ this.awaitingInput = true;
74
+ });
75
+ BackendManager.subscribe(BackendEventType.End, () => {
76
+ this.awaitingInput = false;
77
+ });
78
+ }
79
+ logError(error) {
80
+ var _a;
81
+ if (typeof error === "string") {
82
+ if (error.includes("service worker for reading input")) {
83
+ this.papyros.errorHandler(new Error("Service worker for reading input was not available", { cause: error }));
84
+ }
85
+ }
86
+ else if ((_a = error.traceback) === null || _a === void 0 ? void 0 : _a.includes("service worker for reading input")) {
87
+ this.papyros.errorHandler(new Error("Service worker for reading input was not available", { cause: error }));
88
+ }
89
+ this.output = [...this.output, { type: OutputType.stderr, content: error }];
90
+ }
91
+ logImage(imageData, contentType = "img/png") {
92
+ this.output = [...this.output, { type: OutputType.img, content: imageData, contentType }];
93
+ }
94
+ logOutput(output) {
95
+ // lines have been merged to limit the number of events
96
+ // we split them again here, to simplify overflow detection
97
+ const lines = output.split("\n");
98
+ if (lines.length > 1) {
99
+ this.output = [
100
+ ...this.output,
101
+ ...lines.slice(0, -1).map((line) => ({ type: OutputType.stdout, content: line + "\n" })),
102
+ { type: OutputType.stdout, content: lines[lines.length - 1] },
103
+ ];
104
+ }
105
+ else {
106
+ this.output = [...this.output, { type: OutputType.stdout, content: output }];
107
+ }
108
+ }
109
+ provideInput(input) {
110
+ this.inputs = [...this.inputs, input];
111
+ this.papyros.runner.provideInput(input);
112
+ this.prompt = "";
113
+ this.awaitingInput = false;
114
+ }
115
+ clearInputs() {
116
+ this.inputs = [];
117
+ }
118
+ reset() {
119
+ this.inputs = [];
120
+ this.output = [];
121
+ this.prompt = "";
122
+ this.awaitingInput = false;
123
+ }
124
+ }
125
+ __decorate([
126
+ stateProperty
127
+ ], InputOutput.prototype, "inputs", void 0);
128
+ __decorate([
129
+ stateProperty
130
+ ], InputOutput.prototype, "output", void 0);
131
+ __decorate([
132
+ stateProperty
133
+ ], InputOutput.prototype, "prompt", void 0);
134
+ __decorate([
135
+ stateProperty
136
+ ], InputOutput.prototype, "awaitingInput", void 0);
137
+ __decorate([
138
+ stateProperty
139
+ ], InputOutput.prototype, "inputMode", void 0);
140
+ __decorate([
141
+ stateProperty
142
+ ], InputOutput.prototype, "_inputBuffer", void 0);
143
+ __decorate([
144
+ stateProperty
145
+ ], InputOutput.prototype, "inputBuffer", null);
146
+ //# sourceMappingURL=InputOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputOutput.js","sourceRoot":"","sources":["../../../src/frontend/state/InputOutput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { State } from "@dodona/lit-state";
2
+ import { Debugger } from "./Debugger";
3
+ import { Runner } from "./Runner";
4
+ import { InputOutput } from "./InputOutput";
5
+ import { Constants } from "./Constants";
6
+ import { Examples } from "./Examples";
7
+ import { I18n } from "./I18n";
8
+ import { Test } from "./Test";
9
+ export declare class Papyros extends State {
10
+ readonly debugger: Debugger;
11
+ readonly runner: Runner;
12
+ readonly io: InputOutput;
13
+ readonly constants: Constants;
14
+ readonly examples: Examples;
15
+ readonly i18n: I18n;
16
+ readonly test: Test;
17
+ errorHandler: (error: Error) => void;
18
+ serviceWorkerName: string;
19
+ /**
20
+ * Launch this instance of Papyros, making it ready to run code
21
+ * @return {Promise<Papyros>} Promise of launching, chainable
22
+ */
23
+ launch(): Promise<Papyros>;
24
+ /**
25
+ * Set an error handler in papyros. Papyros will pass any errors to this handler that should be investigated but don't bubble up naturally.
26
+ *
27
+ * @param handler An error handler (e.g. something that passes the error on to sentry)
28
+ */
29
+ setErrorHandler(handler: (error: Error) => void): void;
30
+ /**
31
+ * Configure how user input is handled within Papyros
32
+ * By default, we will try to use SharedArrayBuffers
33
+ * If this option is not available, the optional arguments in the channelOptions config are used
34
+ * They are needed to register a service worker to handle communication between threads
35
+ * @return {Promise<boolean>} Promise of configuring input
36
+ */
37
+ private configureInput;
38
+ private waitForActiveRegistration;
39
+ }
40
+ export declare const papyros: Papyros;
@@ -0,0 +1,115 @@
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 { State, stateProperty } from "@dodona/lit-state";
17
+ import { Debugger } from "./Debugger";
18
+ import { Runner } from "./Runner";
19
+ import { InputOutput } from "./InputOutput";
20
+ import { Constants } from "./Constants";
21
+ import { Examples } from "./Examples";
22
+ import { BackendManager } from "../../communication/BackendManager";
23
+ import { makeChannel } from "sync-message";
24
+ import { I18n } from "./I18n";
25
+ import { Test } from "./Test";
26
+ export class Papyros extends State {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.debugger = new Debugger(this);
30
+ this.runner = new Runner(this);
31
+ this.io = new InputOutput(this);
32
+ this.constants = new Constants();
33
+ this.examples = new Examples(this);
34
+ this.i18n = new I18n();
35
+ this.test = new Test(this);
36
+ this.errorHandler = () => { };
37
+ this.serviceWorkerName = "InputServiceWorker.js";
38
+ }
39
+ /**
40
+ * Launch this instance of Papyros, making it ready to run code
41
+ * @return {Promise<Papyros>} Promise of launching, chainable
42
+ */
43
+ launch() {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ if (!(yield this.configureInput())) {
46
+ alert(this.i18n.t("Papyros.service_worker_error"));
47
+ }
48
+ else {
49
+ try {
50
+ yield this.runner.launch();
51
+ }
52
+ catch (e) {
53
+ this.errorHandler(new Error("Error launching papyros after registering service worker", { cause: e }));
54
+ if (confirm(this.i18n.t("Papyros.launch_error"))) {
55
+ return this.launch();
56
+ }
57
+ }
58
+ }
59
+ return this;
60
+ });
61
+ }
62
+ /**
63
+ * Set an error handler in papyros. Papyros will pass any errors to this handler that should be investigated but don't bubble up naturally.
64
+ *
65
+ * @param handler An error handler (e.g. something that passes the error on to sentry)
66
+ */
67
+ setErrorHandler(handler) {
68
+ this.errorHandler = handler;
69
+ }
70
+ /**
71
+ * Configure how user input is handled within Papyros
72
+ * By default, we will try to use SharedArrayBuffers
73
+ * If this option is not available, the optional arguments in the channelOptions config are used
74
+ * They are needed to register a service worker to handle communication between threads
75
+ * @return {Promise<boolean>} Promise of configuring input
76
+ */
77
+ configureInput() {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ if (typeof SharedArrayBuffer === "undefined") {
80
+ if (!this.serviceWorkerName || !("serviceWorker" in navigator)) {
81
+ return false;
82
+ }
83
+ try {
84
+ yield navigator.serviceWorker.register(this.serviceWorkerName, { scope: "/" });
85
+ BackendManager.channel = makeChannel({ serviceWorker: { scope: "/" } });
86
+ yield this.waitForActiveRegistration();
87
+ }
88
+ catch (e) {
89
+ this.errorHandler(new Error("Error registering service worker", { cause: e }));
90
+ return false;
91
+ }
92
+ }
93
+ else {
94
+ BackendManager.channel = makeChannel({ atomics: {} });
95
+ }
96
+ return true;
97
+ });
98
+ }
99
+ waitForActiveRegistration() {
100
+ return __awaiter(this, arguments, void 0, function* (timeout = 5000) {
101
+ return new Promise((resolve, reject) => {
102
+ const timeoutHandle = setTimeout(() => reject(new Error("Timed out waiting for activated service worker")), timeout);
103
+ navigator.serviceWorker.ready.then(() => {
104
+ clearTimeout(timeoutHandle);
105
+ resolve();
106
+ });
107
+ });
108
+ });
109
+ }
110
+ }
111
+ __decorate([
112
+ stateProperty
113
+ ], Papyros.prototype, "serviceWorkerName", void 0);
114
+ export const papyros = new Papyros();
115
+ //# sourceMappingURL=Papyros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Papyros.js","sourceRoot":"","sources":["../../../src/frontend/state/Papyros.ts"],"names":[],"mappings":"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"}