@dodona/papyros 4.1.0 → 4.1.1

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/assets/__vite-browser-external-9wXp6ZBx.js +1 -0
  2. package/dist/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  3. package/dist/assets/index-C1AWjGcU.js +2202 -0
  4. package/dist/assets/manifest-BaVmi6rC.json +15 -0
  5. package/dist/assets/python_package.tar.gz-B8aMWvGt.load_by_url +0 -0
  6. package/dist/assets/worker-BhABRh01.js +5 -0
  7. package/dist/assets/worker-C2Ju1j5g.js +110 -0
  8. package/dist/index.html +26 -0
  9. package/dist/manifest.json +15 -0
  10. package/dist/robots.txt +3 -0
  11. package/package.json +1 -1
  12. package/dist/Library.d.ts +0 -11
  13. package/dist/Library.js +0 -11
  14. package/dist/Library.js.map +0 -1
  15. package/dist/ProgrammingLanguage.d.ts +0 -7
  16. package/dist/ProgrammingLanguage.js +0 -9
  17. package/dist/ProgrammingLanguage.js.map +0 -1
  18. package/dist/backend/Backend.d.ts +0 -92
  19. package/dist/backend/Backend.js +0 -79
  20. package/dist/backend/Backend.js.map +0 -1
  21. package/dist/backend/workers/javascript/JavaScriptWorker.d.ts +0 -39
  22. package/dist/backend/workers/javascript/JavaScriptWorker.js +0 -158
  23. package/dist/backend/workers/javascript/JavaScriptWorker.js.map +0 -1
  24. package/dist/backend/workers/javascript/worker.d.ts +0 -1
  25. package/dist/backend/workers/javascript/worker.js +0 -5
  26. package/dist/backend/workers/javascript/worker.js.map +0 -1
  27. package/dist/backend/workers/python/PythonWorker.d.ts +0 -32
  28. package/dist/backend/workers/python/PythonWorker.js +0 -117
  29. package/dist/backend/workers/python/PythonWorker.js.map +0 -1
  30. package/dist/backend/workers/python/python_package.tar.gz.load_by_url +0 -0
  31. package/dist/backend/workers/python/worker.d.ts +0 -1
  32. package/dist/backend/workers/python/worker.js +0 -5
  33. package/dist/backend/workers/python/worker.js.map +0 -1
  34. package/dist/communication/BackendEvent.d.ts +0 -33
  35. package/dist/communication/BackendEvent.js +0 -18
  36. package/dist/communication/BackendEvent.js.map +0 -1
  37. package/dist/communication/BackendEventQueue.d.ts +0 -59
  38. package/dist/communication/BackendEventQueue.js +0 -96
  39. package/dist/communication/BackendEventQueue.js.map +0 -1
  40. package/dist/communication/BackendManager.d.ts +0 -68
  41. package/dist/communication/BackendManager.js +0 -99
  42. package/dist/communication/BackendManager.js.map +0 -1
  43. package/dist/communication/InputServiceWorker.d.ts +0 -1
  44. package/dist/communication/InputServiceWorker.js +0 -37
  45. package/dist/communication/InputServiceWorker.js.map +0 -1
  46. package/dist/communication/InputWorker.d.ts +0 -22
  47. package/dist/communication/InputWorker.js +0 -63
  48. package/dist/communication/InputWorker.js.map +0 -1
  49. package/dist/frontend/components/CodeRunner.d.ts +0 -9
  50. package/dist/frontend/components/CodeRunner.js +0 -60
  51. package/dist/frontend/components/CodeRunner.js.map +0 -1
  52. package/dist/frontend/components/Debugger.d.ts +0 -7
  53. package/dist/frontend/components/Debugger.js +0 -75
  54. package/dist/frontend/components/Debugger.js.map +0 -1
  55. package/dist/frontend/components/Input.d.ts +0 -13
  56. package/dist/frontend/components/Input.js +0 -60
  57. package/dist/frontend/components/Input.js.map +0 -1
  58. package/dist/frontend/components/Output.d.ts +0 -14
  59. package/dist/frontend/components/Output.js +0 -157
  60. package/dist/frontend/components/Output.js.map +0 -1
  61. package/dist/frontend/components/PapyrosElement.d.ts +0 -8
  62. package/dist/frontend/components/PapyrosElement.js +0 -24
  63. package/dist/frontend/components/PapyrosElement.js.map +0 -1
  64. package/dist/frontend/components/app/App.d.ts +0 -24
  65. package/dist/frontend/components/app/App.js +0 -207
  66. package/dist/frontend/components/app/App.js.map +0 -1
  67. package/dist/frontend/components/app/ExamplePicker.d.ts +0 -7
  68. package/dist/frontend/components/app/ExamplePicker.js +0 -36
  69. package/dist/frontend/components/app/ExamplePicker.js.map +0 -1
  70. package/dist/frontend/components/app/LanguagePicker.d.ts +0 -7
  71. package/dist/frontend/components/app/LanguagePicker.js +0 -33
  72. package/dist/frontend/components/app/LanguagePicker.js.map +0 -1
  73. package/dist/frontend/components/app/ProgrammingLanguagePicker.d.ts +0 -7
  74. package/dist/frontend/components/app/ProgrammingLanguagePicker.js +0 -38
  75. package/dist/frontend/components/app/ProgrammingLanguagePicker.js.map +0 -1
  76. package/dist/frontend/components/app/examples/JavaScriptExamples.d.ts +0 -5
  77. package/dist/frontend/components/app/examples/JavaScriptExamples.js +0 -16
  78. package/dist/frontend/components/app/examples/JavaScriptExamples.js.map +0 -1
  79. package/dist/frontend/components/app/examples/PythonExamples.d.ts +0 -14
  80. package/dist/frontend/components/app/examples/PythonExamples.js +0 -163
  81. package/dist/frontend/components/app/examples/PythonExamples.js.map +0 -1
  82. package/dist/frontend/components/app/themes/ThemePicker.d.ts +0 -11
  83. package/dist/frontend/components/app/themes/ThemePicker.js +0 -48
  84. package/dist/frontend/components/app/themes/ThemePicker.js.map +0 -1
  85. package/dist/frontend/components/app/themes/ThemedButton.d.ts +0 -9
  86. package/dist/frontend/components/app/themes/ThemedButton.js +0 -53
  87. package/dist/frontend/components/app/themes/ThemedButton.js.map +0 -1
  88. package/dist/frontend/components/code_mirror/BatchInputEditor.d.ts +0 -8
  89. package/dist/frontend/components/code_mirror/BatchInputEditor.js +0 -51
  90. package/dist/frontend/components/code_mirror/BatchInputEditor.js.map +0 -1
  91. package/dist/frontend/components/code_mirror/CodeEditor.d.ts +0 -24
  92. package/dist/frontend/components/code_mirror/CodeEditor.js +0 -200
  93. package/dist/frontend/components/code_mirror/CodeEditor.js.map +0 -1
  94. package/dist/frontend/components/code_mirror/CodeMirrorEditor.d.ts +0 -22
  95. package/dist/frontend/components/code_mirror/CodeMirrorEditor.js +0 -111
  96. package/dist/frontend/components/code_mirror/CodeMirrorEditor.js.map +0 -1
  97. package/dist/frontend/components/code_mirror/Extensions.d.ts +0 -15
  98. package/dist/frontend/components/code_mirror/Extensions.js +0 -164
  99. package/dist/frontend/components/code_mirror/Extensions.js.map +0 -1
  100. package/dist/frontend/components/code_mirror/MaterialTheme.d.ts +0 -5
  101. package/dist/frontend/components/code_mirror/MaterialTheme.js +0 -115
  102. package/dist/frontend/components/code_mirror/MaterialTheme.js.map +0 -1
  103. package/dist/frontend/components/code_runner/ButtonLint.d.ts +0 -9
  104. package/dist/frontend/components/code_runner/ButtonLint.js +0 -72
  105. package/dist/frontend/components/code_runner/ButtonLint.js.map +0 -1
  106. package/dist/frontend/components/code_runner/Code.d.ts +0 -7
  107. package/dist/frontend/components/code_runner/Code.js +0 -48
  108. package/dist/frontend/components/code_runner/Code.js.map +0 -1
  109. package/dist/frontend/components/code_runner/RunState.d.ts +0 -7
  110. package/dist/frontend/components/code_runner/RunState.js +0 -41
  111. package/dist/frontend/components/code_runner/RunState.js.map +0 -1
  112. package/dist/frontend/components/input/BatchInput.d.ts +0 -9
  113. package/dist/frontend/components/input/BatchInput.js +0 -53
  114. package/dist/frontend/components/input/BatchInput.js.map +0 -1
  115. package/dist/frontend/components/input/InteractiveInput.d.ts +0 -13
  116. package/dist/frontend/components/input/InteractiveInput.js +0 -71
  117. package/dist/frontend/components/input/InteractiveInput.js.map +0 -1
  118. package/dist/frontend/state/Constants.d.ts +0 -38
  119. package/dist/frontend/state/Constants.js +0 -111
  120. package/dist/frontend/state/Constants.js.map +0 -1
  121. package/dist/frontend/state/Debugger.d.ts +0 -23
  122. package/dist/frontend/state/Debugger.js +0 -86
  123. package/dist/frontend/state/Debugger.js.map +0 -1
  124. package/dist/frontend/state/Examples.d.ts +0 -11
  125. package/dist/frontend/state/Examples.js +0 -36
  126. package/dist/frontend/state/Examples.js.map +0 -1
  127. package/dist/frontend/state/I18n.d.ts +0 -16
  128. package/dist/frontend/state/I18n.js +0 -75
  129. package/dist/frontend/state/I18n.js.map +0 -1
  130. package/dist/frontend/state/InputOutput.d.ts +0 -64
  131. package/dist/frontend/state/InputOutput.js +0 -146
  132. package/dist/frontend/state/InputOutput.js.map +0 -1
  133. package/dist/frontend/state/Papyros.d.ts +0 -40
  134. package/dist/frontend/state/Papyros.js +0 -115
  135. package/dist/frontend/state/Papyros.js.map +0 -1
  136. package/dist/frontend/state/Runner.d.ts +0 -123
  137. package/dist/frontend/state/Runner.js +0 -372
  138. package/dist/frontend/state/Runner.js.map +0 -1
  139. package/dist/frontend/state/Test.d.ts +0 -10
  140. package/dist/frontend/state/Test.js +0 -43
  141. package/dist/frontend/state/Test.js.map +0 -1
  142. package/dist/frontend/state/Translations.d.ts +0 -178
  143. package/dist/frontend/state/Translations.js +0 -187
  144. package/dist/frontend/state/Translations.js.map +0 -1
  145. package/dist/frontend/state/themes/blue-dark.d.ts +0 -2
  146. package/dist/frontend/state/themes/blue-dark.js +0 -56
  147. package/dist/frontend/state/themes/blue-dark.js.map +0 -1
  148. package/dist/frontend/state/themes/blue-light.d.ts +0 -2
  149. package/dist/frontend/state/themes/blue-light.js +0 -56
  150. package/dist/frontend/state/themes/blue-light.js.map +0 -1
  151. package/dist/frontend/state/themes/green-dark.d.ts +0 -2
  152. package/dist/frontend/state/themes/green-dark.js +0 -56
  153. package/dist/frontend/state/themes/green-dark.js.map +0 -1
  154. package/dist/frontend/state/themes/green-light.d.ts +0 -2
  155. package/dist/frontend/state/themes/green-light.js +0 -56
  156. package/dist/frontend/state/themes/green-light.js.map +0 -1
  157. package/dist/frontend/state/themes/red-dark.d.ts +0 -2
  158. package/dist/frontend/state/themes/red-dark.js +0 -56
  159. package/dist/frontend/state/themes/red-dark.js.map +0 -1
  160. package/dist/frontend/state/themes/red-light.d.ts +0 -2
  161. package/dist/frontend/state/themes/red-light.js +0 -56
  162. package/dist/frontend/state/themes/red-light.js.map +0 -1
  163. package/dist/util/Logging.d.ts +0 -15
  164. package/dist/util/Logging.js +0 -30
  165. package/dist/util/Logging.js.map +0 -1
  166. package/dist/util/Util.d.ts +0 -8
  167. package/dist/util/Util.js +0 -48
  168. package/dist/util/Util.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ {
2
+ "short_name": "Papyros",
3
+ "name": "Papyros: coding in the browser",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ }
10
+ ],
11
+ "start_url": ".",
12
+ "display": "standalone",
13
+ "theme_color": "#000000",
14
+ "background_color": "#ffffff"
15
+ }
@@ -0,0 +1,5 @@
1
+ const proxyMarker=Symbol("Comlink.proxy"),createEndpoint=Symbol("Comlink.endpoint"),releaseProxy=Symbol("Comlink.releaseProxy"),finalizer=Symbol("Comlink.finalizer"),throwMarker=Symbol("Comlink.thrown"),isObject=e=>typeof e=="object"&&e!==null||typeof e=="function",proxyTransferHandler={canHandle:e=>isObject(e)&&e[proxyMarker],serialize(e){const{port1:r,port2:t}=new MessageChannel;return expose(e,r),[t,[t]]},deserialize(e){return e.start(),wrap(e)}},throwTransferHandler={canHandle:e=>isObject(e)&&throwMarker in e,serialize({value:e}){let r;return e instanceof Error?r={isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:r={isError:!1,value:e},[r,[]]},deserialize(e){throw e.isError?Object.assign(new Error(e.value.message),e.value):e.value}},transferHandlers=new Map([["proxy",proxyTransferHandler],["throw",throwTransferHandler]]);function isAllowedOrigin(e,r){for(const t of e)if(r===t||t==="*"||t instanceof RegExp&&t.test(r))return!0;return!1}function expose(e,r=globalThis,t=["*"]){r.addEventListener("message",function i(a){if(!a||!a.data)return;if(!isAllowedOrigin(t,a.origin)){console.warn(`Invalid origin '${a.origin}' for comlink proxy`);return}const{id:p,type:f,path:w}=Object.assign({path:[]},a.data),u=(a.data.argumentList||[]).map(fromWireValue);let c;try{const l=w.slice(0,-1).reduce((m,O)=>m[O],e),E=w.reduce((m,O)=>m[O],e);switch(f){case"GET":c=E;break;case"SET":l[w.slice(-1)[0]]=fromWireValue(a.data.value),c=!0;break;case"APPLY":c=E.apply(l,u);break;case"CONSTRUCT":{const m=new E(...u);c=proxy(m)}break;case"ENDPOINT":{const{port1:m,port2:O}=new MessageChannel;expose(e,O),c=transfer(m,[m])}break;case"RELEASE":c=void 0;break;default:return}}catch(l){c={value:l,[throwMarker]:0}}Promise.resolve(c).catch(l=>({value:l,[throwMarker]:0})).then(l=>{const[E,m]=toWireValue(l);r.postMessage(Object.assign(Object.assign({},E),{id:p}),m),f==="RELEASE"&&(r.removeEventListener("message",i),closeEndPoint(r),finalizer in e&&typeof e[finalizer]=="function"&&e[finalizer]())}).catch(l=>{const[E,m]=toWireValue({value:new TypeError("Unserializable return value"),[throwMarker]:0});r.postMessage(Object.assign(Object.assign({},E),{id:p}),m)})}),r.start&&r.start()}function isMessagePort(e){return e.constructor.name==="MessagePort"}function closeEndPoint(e){isMessagePort(e)&&e.close()}function wrap(e,r){const t=new Map;return e.addEventListener("message",function(a){const{data:p}=a;if(!p||!p.id)return;const f=t.get(p.id);if(f)try{f(p)}finally{t.delete(p.id)}}),createProxy(e,t,[],r)}function throwIfProxyReleased(e){if(e)throw new Error("Proxy has been released and is not useable")}function releaseEndpoint(e){return requestResponseMessage(e,new Map,{type:"RELEASE"}).then(()=>{closeEndPoint(e)})}const proxyCounter=new WeakMap,proxyFinalizers="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{const r=(proxyCounter.get(e)||0)-1;proxyCounter.set(e,r),r===0&&releaseEndpoint(e)});function registerProxy(e,r){const t=(proxyCounter.get(r)||0)+1;proxyCounter.set(r,t),proxyFinalizers&&proxyFinalizers.register(e,r,e)}function unregisterProxy(e){proxyFinalizers&&proxyFinalizers.unregister(e)}function createProxy(e,r,t=[],i=function(){}){let a=!1;const p=new Proxy(i,{get(f,w){if(throwIfProxyReleased(a),w===releaseProxy)return()=>{unregisterProxy(p),releaseEndpoint(e),r.clear(),a=!0};if(w==="then"){if(t.length===0)return{then:()=>p};const u=requestResponseMessage(e,r,{type:"GET",path:t.map(c=>c.toString())}).then(fromWireValue);return u.then.bind(u)}return createProxy(e,r,[...t,w])},set(f,w,u){throwIfProxyReleased(a);const[c,l]=toWireValue(u);return requestResponseMessage(e,r,{type:"SET",path:[...t,w].map(E=>E.toString()),value:c},l).then(fromWireValue)},apply(f,w,u){throwIfProxyReleased(a);const c=t[t.length-1];if(c===createEndpoint)return requestResponseMessage(e,r,{type:"ENDPOINT"}).then(fromWireValue);if(c==="bind")return createProxy(e,r,t.slice(0,-1));const[l,E]=processArguments(u);return requestResponseMessage(e,r,{type:"APPLY",path:t.map(m=>m.toString()),argumentList:l},E).then(fromWireValue)},construct(f,w){throwIfProxyReleased(a);const[u,c]=processArguments(w);return requestResponseMessage(e,r,{type:"CONSTRUCT",path:t.map(l=>l.toString()),argumentList:u},c).then(fromWireValue)}});return registerProxy(p,e),p}function myFlat(e){return Array.prototype.concat.apply([],e)}function processArguments(e){const r=e.map(toWireValue);return[r.map(t=>t[0]),myFlat(r.map(t=>t[1]))]}const transferCache=new WeakMap;function transfer(e,r){return transferCache.set(e,r),e}function proxy(e){return Object.assign(e,{[proxyMarker]:!0})}function windowEndpoint(e,r=globalThis,t="*"){return{postMessage:(i,a)=>e.postMessage(i,t,a),addEventListener:r.addEventListener.bind(r),removeEventListener:r.removeEventListener.bind(r)}}function toWireValue(e){for(const[r,t]of transferHandlers)if(t.canHandle(e)){const[i,a]=t.serialize(e);return[{type:"HANDLER",name:r,value:i},a]}return[{type:"RAW",value:e},transferCache.get(e)||[]]}function fromWireValue(e){switch(e.type){case"HANDLER":return transferHandlers.get(e.name).deserialize(e.value);case"RAW":return e.value}}function requestResponseMessage(e,r,t,i){return new Promise(a=>{const p=generateUUID();r.set(p,a),e.start&&e.start(),e.postMessage(Object.assign({id:p},t),i)})}function generateUUID(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}var comlink=Object.freeze({__proto__:null,createEndpoint,expose,finalizer,proxy,proxyMarker,releaseProxy,transfer,transferHandlers,windowEndpoint,wrap}),BackendEventType=(e=>(e.Start="start",e.End="end",e.Input="input",e.Output="output",e.Sleep="sleep",e.Error="error",e.Interrupt="interrupt",e.Loading="loading",e.Frame="frame",e.FrameChange="frame-change",e.Stop="stop",e))(BackendEventType||{});function getAugmentedNamespace(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var r=e.default;if(typeof r=="function"){var t=function i(){var a=!1;try{a=this instanceof i}catch{}return a?Reflect.construct(r,arguments,this.constructor):r.apply(this,arguments)};t.prototype=r.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(i){var a=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,a.get?a:{enumerable:!0,get:function(){return e[i]}})}),t}var dist$1={exports:{}},dist={exports:{}},hasRequiredDist$1;function requireDist$1(){return hasRequiredDist$1||(hasRequiredDist$1=1,(function(e,r){(function(t,i){e.exports=i()})(self,(function(){return(()=>{var t={d:(n,s)=>{for(var o in s)t.o(s,o)&&!t.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:s[o]})},o:(n,s)=>Object.prototype.hasOwnProperty.call(n,s),r:n=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})}},i={};t.r(i),t.d(i,{isServiceWorkerRequest:()=>w,serviceWorkerFetchListener:()=>u,asyncSleep:()=>c,ServiceWorkerError:()=>l,writeMessageAtomics:()=>E,writeMessageServiceWorker:()=>m,writeMessage:()=>O,makeChannel:()=>A,makeAtomicsChannel:()=>q,makeServiceWorkerChannel:()=>M,readMessage:()=>v,syncSleep:()=>_,uuidv4:()=>T});var a=function(n,s,o,h){return new(o||(o=Promise))((function(y,d){function x(b){try{k(h.next(b))}catch(P){d(P)}}function S(b){try{k(h.throw(b))}catch(P){d(P)}}function k(b){var P;b.done?y(b.value):(P=b.value,P instanceof o?P:new o((function(R){R(P)}))).then(x,S)}k((h=h.apply(n,[])).next())}))};const p="__SyncMessageServiceWorkerInput__",f="__sync-message-v2__";function w(n){return typeof n!="string"&&(n=n.request.url),n.includes(p)}function u(){const n={},s={};return o=>{const{url:h}=o.request;return!!w(h)&&(o.respondWith((function(){return a(this,void 0,void 0,(function*(){function y(d){const x={message:d,version:f};return new Response(JSON.stringify(x),{status:200})}if(h.endsWith("/read")){const{messageId:d,timeout:x}=yield o.request.json();if(d in n){const S=n[d];return delete n[d],y(S)}return yield new Promise((S=>{s[d]=S,setTimeout((function(){delete s[d],S(new Response("",{status:408}))}),x)}))}if(h.endsWith("/write")){const{message:d,messageId:x}=yield o.request.json(),S=s[x];return S?(S(y(d)),delete s[x]):n[x]=d,y({early:!S})}if(h.endsWith("/version"))return new Response(f,{status:200})}))})()),!0)}}function c(n){return new Promise((s=>setTimeout(s,n)))}class l extends Error{constructor(s,o){super(`Received status ${o} from ${s}. Ensure the service worker is registered and active.`),this.url=s,this.status=o,this.type="ServiceWorkerError",Object.setPrototypeOf(this,l.prototype)}}function E(n,s){const o=new TextEncoder().encode(JSON.stringify(s)),{data:h,meta:y}=n;if(o.length>h.length)throw new Error("Message is too big, increase bufferSize when making channel.");h.set(o,0),Atomics.store(y,0,o.length),Atomics.store(y,1,1),Atomics.notify(y,1)}function m(n,s,o){return a(this,void 0,void 0,(function*(){yield navigator.serviceWorker.ready;const h=n.baseUrl+"/write",y=Date.now();for(;;){const d={message:s,messageId:o},x=yield fetch(h,{method:"POST",body:JSON.stringify(d)});if(x.status===200&&(yield x.json()).version===f)return;if(!(Date.now()-y<n.timeout))throw new l(h,x.status);yield c(100)}}))}function O(n,s,o){return a(this,void 0,void 0,(function*(){n.type==="atomics"?E(n,s):yield m(n,s,o)}))}function A(n={}){return typeof SharedArrayBuffer<"u"?q(n.atomics):"serviceWorker"in navigator?M(n.serviceWorker):null}function q({bufferSize:n}={}){return{type:"atomics",data:new Uint8Array(new SharedArrayBuffer(n||131072)),meta:new Int32Array(new SharedArrayBuffer(2*Int32Array.BYTES_PER_ELEMENT))}}function M(n={}){return{type:"serviceWorker",baseUrl:(n.scope||"/")+p,timeout:n.timeout||5e3}}function g(n,s){return n>0?+n:s}function v(n,s,{checkInterrupt:o,checkTimeout:h,timeout:y}={}){const d=performance.now();h=g(h,o?100:5e3);const x=g(y,Number.POSITIVE_INFINITY);let S;if(n.type==="atomics"){const{data:k,meta:b}=n;S=()=>{if(Atomics.wait(b,1,0,h)==="timed-out")return null;{const P=Atomics.exchange(b,0,0),R=k.slice(0,P);Atomics.store(b,1,0);const I=new TextDecoder().decode(R);return JSON.parse(I)}}}else S=()=>{const k=new XMLHttpRequest,b=n.baseUrl+"/read";k.open("POST",b,!1);const P={messageId:s,timeout:h};k.send(JSON.stringify(P));const{status:R}=k;if(R===408)return null;if(R===200){const I=JSON.parse(k.responseText);return I.version!==f?null:I.message}if(performance.now()-d<n.timeout)return null;throw new l(b,R)};for(;;){const k=x-(performance.now()-d);if(k<=0)return null;h=Math.min(h,k);const b=S();if(b!==null)return b;if(o?.())return null}}function _(n,s){if(n=g(n,0))if(typeof SharedArrayBuffer<"u"){const o=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));o[0]=0,Atomics.wait(o,0,0,n)}else v(s,`sleep ${n} ${T()}`,{timeout:n})}let T;return T="randomUUID"in crypto?function(){return crypto.randomUUID()}:function(){return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(n=>{const s=Number(n);return(s^crypto.getRandomValues(new Uint8Array(1))[0]&15>>s/4).toString(16)}))},i})()}))})(dist)),dist.exports}var require$$1=getAugmentedNamespace(comlink),hasRequiredDist;function requireDist(){return hasRequiredDist||(hasRequiredDist=1,(function(e,r){(function(t,i){e.exports=i(requireDist$1(),require$$1)})(self,(function(t,i){return(()=>{var a={272:u=>{u.exports=i},746:u=>{u.exports=t}},p={};function f(u){var c=p[u];if(c!==void 0)return c.exports;var l=p[u]={exports:{}};return a[u](l,l.exports,f),l.exports}f.n=u=>{var c=u&&u.__esModule?()=>u.default:()=>u;return f.d(c,{a:c}),c},f.d=(u,c)=>{for(var l in c)f.o(c,l)&&!f.o(u,l)&&Object.defineProperty(u,l,{enumerable:!0,get:c[l]})},f.o=(u,c)=>Object.prototype.hasOwnProperty.call(u,c),f.r=u=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(u,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(u,"__esModule",{value:!0})};var w={};return(()=>{f.r(w),f.d(w,{InterruptError:()=>E,NoChannelError:()=>m,SyncClient:()=>O,syncExpose:()=>A});var u=f(746),c=f(272),l=function(M,g,v,_){return new(v||(v=Promise))((function(T,n){function s(y){try{h(_.next(y))}catch(d){n(d)}}function o(y){try{h(_.throw(y))}catch(d){n(d)}}function h(y){var d;y.done?T(y.value):(d=y.value,d instanceof v?d:new v((function(x){x(d)}))).then(s,o)}h((_=_.apply(M,[])).next())}))};class E extends Error{constructor(){super(...arguments),this.type="InterruptError",this.name=this.type}}class m extends Error{constructor(){super(...arguments),this.type="NoChannelError",this.name=this.type}}class O{constructor(g,v){this.workerCreator=g,this.channel=v,this.state="idle",this._messageIdBase="",this._messageIdSeq=0,this._start()}interrupt(){return l(this,void 0,void 0,(function*(){this.state!=="idle"&&(this.state!=="awaitingMessage"&&this.state!=="sleeping"?this.interrupter?yield this.interrupter():(this.terminate(),this._start()):yield this._writeMessage({interrupted:!0}))}))}call(g,...v){return l(this,void 0,void 0,(function*(){if(this.state!=="idle")throw new Error(`State is ${this.state}, not idle`);let _=!0;this.state="running",this._messageIdBase=(0,u.uuidv4)(),this._messageIdSeq=0;const T=n=>{var s;_&&n!=="init"&&(n==="reading"?(this.state="awaitingMessage",this._messageIdSeq++,(s=this._awaitingMessageResolve)===null||s===void 0||s.call(this)):n==="sleeping"?(this.state="sleeping",this._messageIdSeq++):n==="slept"&&(this.state="running"))};this._interruptPromise=new Promise(((n,s)=>this._interruptRejector=s));try{return yield Promise.race([g(this.channel,c.proxy(T),this._messageIdBase,...v),this._interruptPromise])}finally{_=!1,this._reset()}}))}writeMessage(g){return l(this,void 0,void 0,(function*(){if(this.state==="idle"||!this._messageIdBase)throw new Error("No active call to send a message to.");if(this.state!=="awaitingMessage"){if(this._awaitingMessageResolve)throw new Error("Not waiting for message, and another write is already queued.");yield new Promise((v=>{this._awaitingMessageResolve=v})),delete this._awaitingMessageResolve}yield this._writeMessage({message:g})}))}terminate(){var g;(g=this._interruptRejector)===null||g===void 0||g.call(this,new E("Worker terminated")),this.workerProxy[c.releaseProxy](),this.worker.terminate(),delete this.workerProxy,delete this.worker}_writeMessage(g){return l(this,void 0,void 0,(function*(){this.state="running";const v=q(this._messageIdBase,this._messageIdSeq);yield(0,u.writeMessage)(this.channel,g,v)}))}_start(){this._reset(),this.worker=this.workerCreator(),this.workerProxy=c.wrap(this.worker)}_reset(){this.state="idle",delete this._interruptPromise,delete this._interruptRejector,delete this._awaitingMessageResolve,delete this._messageIdBase}}function A(M){return function(g,v,_,...T){return l(this,void 0,void 0,(function*(){yield v("init");let n=0;function s(o,h){if(!g)throw new m;v(o);const y=q(_,++n),d=(0,u.readMessage)(g,y,h);if(d){const{message:x,interrupted:S}=d;if(S)throw new E;return x}o==="sleeping"&&v("slept")}return M({channel:g,readMessage:()=>s("reading"),syncSleep(o){o>0&&s("sleeping",{timeout:o})}},...T)}))}}function q(M,g){return`${M}-${g}`}})(),w})()}))})(dist$1)),dist$1.exports}var distExports=requireDist();class BackendEventQueue{constructor(r,t=100){this.callback=r,this.flushTime=t,this.queue=[],this.lastFlushTime=new Date().getTime(),this.decoder=new TextDecoder}put(r,t,i){let a;typeof t=="number"?a=t.toString():typeof t!="string"?a=this.decoder.decode(t):a=t;let p={},f="text/plain";i&&(typeof i=="string"?f=i:(f=i.contentType,delete i.contentType,p=i)),this.queue.length===0||!f.startsWith("text")||this.queue[this.queue.length-1].type!==r||this.queue[this.queue.length-1].contentType!==f?this.queue.push({type:r,data:a,contentType:f,...p}):this.queue[this.queue.length-1].data+=a,this.shouldFlush()&&this.flush()}shouldFlush(){return this.queue.length>1||new Date().getTime()-this.lastFlushTime>this.flushTime}reset(){this.queue=[],this.lastFlushTime=new Date().getTime()}flush(){this.queue.forEach(r=>{this.callback(r)}),this.queue=[],this.lastFlushTime=new Date().getTime()}setCallback(r){this.callback=r}}class Backend{constructor(){this.extras={},this.onEvent=()=>{},this.runCode=this.syncExpose()(this.runCode.bind(this)),this.queue={}}syncExpose(){return distExports.syncExpose}async launch(r){return this.onEvent=t=>{if(r(t),t.type===BackendEventType.Sleep)return this.extras.syncSleep(t.data);if(t.type===BackendEventType.Input)return this.extras.readMessage()},this.queue=new BackendEventQueue(this.onEvent.bind(this)),Promise.resolve()}runModes(r){return[]}provideFiles(r,t){return Promise.resolve()}}class JavaScriptWorker extends Backend{static stringify(...e){return e.map(t=>{if(Array.isArray(t))return JSON.stringify(t);if(typeof t=="string")return t;if(typeof t=="number")return t+"";if(typeof t=="object"&&"toString"in t){let i=t.toString();return i==="[object Object]"&&(i=JSON.stringify(t)),i}else return JSON.stringify(e)}).join(" ")}prompt(e=""){return this.onEvent({type:BackendEventType.Input,data:e,contentType:"text/plain"})}consoleLog(...e){this.queue.put(BackendEventType.Output,JavaScriptWorker.stringify(...e)+`
2
+ `,"text/plain")}consoleError(...e){this.queue.put(BackendEventType.Error,JavaScriptWorker.stringify(...e)+`
3
+ `,"text/plain")}static completeProperties(e,r){const t=Object.keys(r).map(i=>({label:i,type:typeof r[i]=="function"?"function":"variable"}));return{from:e,options:t,validFor:/^[\w$]*$/}}async runCode(extras,code){this.extras=extras,this.queue.reset();const oldContent={"console.log":console.log,"console.error":console.error},newContext={prompt:this.prompt.bind(this),"console.log":this.consoleLog.bind(this),"console.error":this.consoleError.bind(this)};new Function("ctx",Object.keys(newContext).map(e=>`${e} = ctx['${e}'];`).join(`
4
+ `))(newContext);let result;try{this.onEvent({type:BackendEventType.Start,contentType:"text/plain",data:"RunCode"}),result=await eval(code)}catch(e){Error.captureStackTrace(e),result=await this.onEvent({type:BackendEventType.Error,contentType:"application/json",data:{name:e.constructor.name,what:e.message,traceback:e.stack}})}finally{new Function("ctx",Object.keys(oldContent).map(e=>`${e} = ctx['${e}'];`).join(`
5
+ `))(oldContent),this.queue.flush(),this.onEvent({type:BackendEventType.End,contentType:"text/plain",data:"CodeFinished"})}return result}async lintCode(){return Promise.resolve([])}}const worker=new JavaScriptWorker;expose(worker);
@@ -0,0 +1,110 @@
1
+ const xe=Symbol("Comlink.proxy"),lt=Symbol("Comlink.endpoint"),ut=Symbol("Comlink.releaseProxy"),pe=Symbol("Comlink.finalizer"),fe=Symbol("Comlink.thrown"),ct=r=>typeof r=="object"&&r!==null||typeof r=="function",kt={canHandle:r=>ct(r)&&r[xe],serialize(r){const{port1:o,port2:a}=new MessageChannel;return ge(r,o),[a,[a]]},deserialize(r){return r.start(),pt(r)}},Pt={canHandle:r=>ct(r)&&fe in r,serialize({value:r}){let o;return r instanceof Error?o={isError:!0,value:{message:r.message,name:r.name,stack:r.stack}}:o={isError:!1,value:r},[o,[]]},deserialize(r){throw r.isError?Object.assign(new Error(r.value.message),r.value):r.value}},Oe=new Map([["proxy",kt],["throw",Pt]]);function xt(r,o){for(const a of r)if(o===a||a==="*"||a instanceof RegExp&&a.test(o))return!0;return!1}function ge(r,o=globalThis,a=["*"]){o.addEventListener("message",function E(O){if(!O||!O.data)return;if(!xt(a,O.origin)){console.warn(`Invalid origin '${O.origin}' for comlink proxy`);return}const{id:j,type:A,path:i}=Object.assign({path:[]},O.data),P=(O.data.argumentList||[]).map(ee);let p;try{const d=i.slice(0,-1).reduce((S,w)=>S[w],r),y=i.reduce((S,w)=>S[w],r);switch(A){case"GET":p=y;break;case"SET":d[i.slice(-1)[0]]=ee(O.data.value),p=!0;break;case"APPLY":p=y.apply(d,P);break;case"CONSTRUCT":{const S=new y(...P);p=yt(S)}break;case"ENDPOINT":{const{port1:S,port2:w}=new MessageChannel;ge(r,w),p=ht(S,[S])}break;case"RELEASE":p=void 0;break;default:return}}catch(d){p={value:d,[fe]:0}}Promise.resolve(p).catch(d=>({value:d,[fe]:0})).then(d=>{const[y,S]=ye(d);o.postMessage(Object.assign(Object.assign({},y),{id:j}),S),A==="RELEASE"&&(o.removeEventListener("message",E),dt(o),pe in r&&typeof r[pe]=="function"&&r[pe]())}).catch(d=>{const[y,S]=ye({value:new TypeError("Unserializable return value"),[fe]:0});o.postMessage(Object.assign(Object.assign({},y),{id:j}),S)})}),o.start&&o.start()}function Ot(r){return r.constructor.name==="MessagePort"}function dt(r){Ot(r)&&r.close()}function pt(r,o){const a=new Map;return r.addEventListener("message",function(O){const{data:j}=O;if(!j||!j.id)return;const A=a.get(j.id);if(A)try{A(j)}finally{a.delete(j.id)}}),Se(r,a,[],o)}function ce(r){if(r)throw new Error("Proxy has been released and is not useable")}function ft(r){return ne(r,new Map,{type:"RELEASE"}).then(()=>{dt(r)})}const me=new WeakMap,he="FinalizationRegistry"in globalThis&&new FinalizationRegistry(r=>{const o=(me.get(r)||0)-1;me.set(r,o),o===0&&ft(r)});function Tt(r,o){const a=(me.get(o)||0)+1;me.set(o,a),he&&he.register(r,o,r)}function It(r){he&&he.unregister(r)}function Se(r,o,a=[],E=function(){}){let O=!1;const j=new Proxy(E,{get(A,i){if(ce(O),i===ut)return()=>{It(j),ft(r),o.clear(),O=!0};if(i==="then"){if(a.length===0)return{then:()=>j};const P=ne(r,o,{type:"GET",path:a.map(p=>p.toString())}).then(ee);return P.then.bind(P)}return Se(r,o,[...a,i])},set(A,i,P){ce(O);const[p,d]=ye(P);return ne(r,o,{type:"SET",path:[...a,i].map(y=>y.toString()),value:p},d).then(ee)},apply(A,i,P){ce(O);const p=a[a.length-1];if(p===lt)return ne(r,o,{type:"ENDPOINT"}).then(ee);if(p==="bind")return Se(r,o,a.slice(0,-1));const[d,y]=rt(P);return ne(r,o,{type:"APPLY",path:a.map(S=>S.toString()),argumentList:d},y).then(ee)},construct(A,i){ce(O);const[P,p]=rt(i);return ne(r,o,{type:"CONSTRUCT",path:a.map(d=>d.toString()),argumentList:P},p).then(ee)}});return Tt(j,r),j}function Nt(r){return Array.prototype.concat.apply([],r)}function rt(r){const o=r.map(ye);return[o.map(a=>a[0]),Nt(o.map(a=>a[1]))]}const mt=new WeakMap;function ht(r,o){return mt.set(r,o),r}function yt(r){return Object.assign(r,{[xe]:!0})}function At(r,o=globalThis,a="*"){return{postMessage:(E,O)=>r.postMessage(E,a,O),addEventListener:o.addEventListener.bind(o),removeEventListener:o.removeEventListener.bind(o)}}function ye(r){for(const[o,a]of Oe)if(a.canHandle(r)){const[E,O]=a.serialize(r);return[{type:"HANDLER",name:o,value:E},O]}return[{type:"RAW",value:r},mt.get(r)||[]]}function ee(r){switch(r.type){case"HANDLER":return Oe.get(r.name).deserialize(r.value);case"RAW":return r.value}}function ne(r,o,a,E){return new Promise(O=>{const j=Rt();o.set(j,O),r.start&&r.start(),r.postMessage(Object.assign({id:j},a),E)})}function Rt(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}var Mt=Object.freeze({__proto__:null,createEndpoint:lt,expose:ge,finalizer:pe,proxy:yt,proxyMarker:xe,releaseProxy:ut,transfer:ht,transferHandlers:Oe,windowEndpoint:At,wrap:pt}),ke=(r=>(r.Start="start",r.End="end",r.Input="input",r.Output="output",r.Sleep="sleep",r.Error="error",r.Interrupt="interrupt",r.Loading="loading",r.Frame="frame",r.FrameChange="frame-change",r.Stop="stop",r))(ke||{});function Dt(r){if(Object.prototype.hasOwnProperty.call(r,"__esModule"))return r;var o=r.default;if(typeof o=="function"){var a=function E(){var O=!1;try{O=this instanceof E}catch{}return O?Reflect.construct(o,arguments,this.constructor):o.apply(this,arguments)};a.prototype=o.prototype}else a={};return Object.defineProperty(a,"__esModule",{value:!0}),Object.keys(r).forEach(function(E){var O=Object.getOwnPropertyDescriptor(r,E);Object.defineProperty(a,E,O.get?O:{enumerable:!0,get:function(){return r[E]}})}),a}var ve={exports:{}},be={exports:{}},nt;function Ft(){return nt||(nt=1,(function(r,o){(function(a,E){r.exports=E()})(self,(function(){return(()=>{var a={d:(c,h)=>{for(var m in h)a.o(h,m)&&!a.o(c,m)&&Object.defineProperty(c,m,{enumerable:!0,get:h[m]})},o:(c,h)=>Object.prototype.hasOwnProperty.call(c,h),r:c=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})}},E={};a.r(E),a.d(E,{isServiceWorkerRequest:()=>i,serviceWorkerFetchListener:()=>P,asyncSleep:()=>p,ServiceWorkerError:()=>d,writeMessageAtomics:()=>y,writeMessageServiceWorker:()=>S,writeMessage:()=>w,makeChannel:()=>x,makeAtomicsChannel:()=>L,makeServiceWorkerChannel:()=>D,readMessage:()=>M,syncSleep:()=>$,uuidv4:()=>G});var O=function(c,h,m,T){return new(m||(m=Promise))((function(F,I){function W(_){try{g(T.next(_))}catch(b){I(b)}}function k(_){try{g(T.throw(_))}catch(b){I(b)}}function g(_){var b;_.done?F(_.value):(b=_.value,b instanceof m?b:new m((function(N){N(b)}))).then(W,k)}g((T=T.apply(c,[])).next())}))};const j="__SyncMessageServiceWorkerInput__",A="__sync-message-v2__";function i(c){return typeof c!="string"&&(c=c.request.url),c.includes(j)}function P(){const c={},h={};return m=>{const{url:T}=m.request;return!!i(T)&&(m.respondWith((function(){return O(this,void 0,void 0,(function*(){function F(I){const W={message:I,version:A};return new Response(JSON.stringify(W),{status:200})}if(T.endsWith("/read")){const{messageId:I,timeout:W}=yield m.request.json();if(I in c){const k=c[I];return delete c[I],F(k)}return yield new Promise((k=>{h[I]=k,setTimeout((function(){delete h[I],k(new Response("",{status:408}))}),W)}))}if(T.endsWith("/write")){const{message:I,messageId:W}=yield m.request.json(),k=h[W];return k?(k(F(I)),delete h[W]):c[W]=I,F({early:!k})}if(T.endsWith("/version"))return new Response(A,{status:200})}))})()),!0)}}function p(c){return new Promise((h=>setTimeout(h,c)))}class d extends Error{constructor(h,m){super(`Received status ${m} from ${h}. Ensure the service worker is registered and active.`),this.url=h,this.status=m,this.type="ServiceWorkerError",Object.setPrototypeOf(this,d.prototype)}}function y(c,h){const m=new TextEncoder().encode(JSON.stringify(h)),{data:T,meta:F}=c;if(m.length>T.length)throw new Error("Message is too big, increase bufferSize when making channel.");T.set(m,0),Atomics.store(F,0,m.length),Atomics.store(F,1,1),Atomics.notify(F,1)}function S(c,h,m){return O(this,void 0,void 0,(function*(){yield navigator.serviceWorker.ready;const T=c.baseUrl+"/write",F=Date.now();for(;;){const I={message:h,messageId:m},W=yield fetch(T,{method:"POST",body:JSON.stringify(I)});if(W.status===200&&(yield W.json()).version===A)return;if(!(Date.now()-F<c.timeout))throw new d(T,W.status);yield p(100)}}))}function w(c,h,m){return O(this,void 0,void 0,(function*(){c.type==="atomics"?y(c,h):yield S(c,h,m)}))}function x(c={}){return typeof SharedArrayBuffer<"u"?L(c.atomics):"serviceWorker"in navigator?D(c.serviceWorker):null}function L({bufferSize:c}={}){return{type:"atomics",data:new Uint8Array(new SharedArrayBuffer(c||131072)),meta:new Int32Array(new SharedArrayBuffer(2*Int32Array.BYTES_PER_ELEMENT))}}function D(c={}){return{type:"serviceWorker",baseUrl:(c.scope||"/")+j,timeout:c.timeout||5e3}}function v(c,h){return c>0?+c:h}function M(c,h,{checkInterrupt:m,checkTimeout:T,timeout:F}={}){const I=performance.now();T=v(T,m?100:5e3);const W=v(F,Number.POSITIVE_INFINITY);let k;if(c.type==="atomics"){const{data:g,meta:_}=c;k=()=>{if(Atomics.wait(_,1,0,T)==="timed-out")return null;{const b=Atomics.exchange(_,0,0),N=g.slice(0,b);Atomics.store(_,1,0);const q=new TextDecoder().decode(N);return JSON.parse(q)}}}else k=()=>{const g=new XMLHttpRequest,_=c.baseUrl+"/read";g.open("POST",_,!1);const b={messageId:h,timeout:T};g.send(JSON.stringify(b));const{status:N}=g;if(N===408)return null;if(N===200){const q=JSON.parse(g.responseText);return q.version!==A?null:q.message}if(performance.now()-I<c.timeout)return null;throw new d(_,N)};for(;;){const g=W-(performance.now()-I);if(g<=0)return null;T=Math.min(T,g);const _=k();if(_!==null)return _;if(m?.())return null}}function $(c,h){if(c=v(c,0))if(typeof SharedArrayBuffer<"u"){const m=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));m[0]=0,Atomics.wait(m,0,0,c)}else M(h,`sleep ${c} ${G()}`,{timeout:c})}let G;return G="randomUUID"in crypto?function(){return crypto.randomUUID()}:function(){return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(c=>{const h=Number(c);return(h^crypto.getRandomValues(new Uint8Array(1))[0]&15>>h/4).toString(16)}))},E})()}))})(be)),be.exports}var gt=Dt(Mt),it;function wt(){return it||(it=1,(function(r,o){(function(a,E){r.exports=E(Ft(),gt)})(self,(function(a,E){return(()=>{var O={272:P=>{P.exports=E},746:P=>{P.exports=a}},j={};function A(P){var p=j[P];if(p!==void 0)return p.exports;var d=j[P]={exports:{}};return O[P](d,d.exports,A),d.exports}A.n=P=>{var p=P&&P.__esModule?()=>P.default:()=>P;return A.d(p,{a:p}),p},A.d=(P,p)=>{for(var d in p)A.o(p,d)&&!A.o(P,d)&&Object.defineProperty(P,d,{enumerable:!0,get:p[d]})},A.o=(P,p)=>Object.prototype.hasOwnProperty.call(P,p),A.r=P=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(P,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(P,"__esModule",{value:!0})};var i={};return(()=>{A.r(i),A.d(i,{InterruptError:()=>y,NoChannelError:()=>S,SyncClient:()=>w,syncExpose:()=>x});var P=A(746),p=A(272),d=function(D,v,M,$){return new(M||(M=Promise))((function(G,c){function h(F){try{T($.next(F))}catch(I){c(I)}}function m(F){try{T($.throw(F))}catch(I){c(I)}}function T(F){var I;F.done?G(F.value):(I=F.value,I instanceof M?I:new M((function(W){W(I)}))).then(h,m)}T(($=$.apply(D,[])).next())}))};class y extends Error{constructor(){super(...arguments),this.type="InterruptError",this.name=this.type}}class S extends Error{constructor(){super(...arguments),this.type="NoChannelError",this.name=this.type}}class w{constructor(v,M){this.workerCreator=v,this.channel=M,this.state="idle",this._messageIdBase="",this._messageIdSeq=0,this._start()}interrupt(){return d(this,void 0,void 0,(function*(){this.state!=="idle"&&(this.state!=="awaitingMessage"&&this.state!=="sleeping"?this.interrupter?yield this.interrupter():(this.terminate(),this._start()):yield this._writeMessage({interrupted:!0}))}))}call(v,...M){return d(this,void 0,void 0,(function*(){if(this.state!=="idle")throw new Error(`State is ${this.state}, not idle`);let $=!0;this.state="running",this._messageIdBase=(0,P.uuidv4)(),this._messageIdSeq=0;const G=c=>{var h;$&&c!=="init"&&(c==="reading"?(this.state="awaitingMessage",this._messageIdSeq++,(h=this._awaitingMessageResolve)===null||h===void 0||h.call(this)):c==="sleeping"?(this.state="sleeping",this._messageIdSeq++):c==="slept"&&(this.state="running"))};this._interruptPromise=new Promise(((c,h)=>this._interruptRejector=h));try{return yield Promise.race([v(this.channel,p.proxy(G),this._messageIdBase,...M),this._interruptPromise])}finally{$=!1,this._reset()}}))}writeMessage(v){return d(this,void 0,void 0,(function*(){if(this.state==="idle"||!this._messageIdBase)throw new Error("No active call to send a message to.");if(this.state!=="awaitingMessage"){if(this._awaitingMessageResolve)throw new Error("Not waiting for message, and another write is already queued.");yield new Promise((M=>{this._awaitingMessageResolve=M})),delete this._awaitingMessageResolve}yield this._writeMessage({message:v})}))}terminate(){var v;(v=this._interruptRejector)===null||v===void 0||v.call(this,new y("Worker terminated")),this.workerProxy[p.releaseProxy](),this.worker.terminate(),delete this.workerProxy,delete this.worker}_writeMessage(v){return d(this,void 0,void 0,(function*(){this.state="running";const M=L(this._messageIdBase,this._messageIdSeq);yield(0,P.writeMessage)(this.channel,v,M)}))}_start(){this._reset(),this.worker=this.workerCreator(),this.workerProxy=p.wrap(this.worker)}_reset(){this.state="idle",delete this._interruptPromise,delete this._interruptRejector,delete this._awaitingMessageResolve,delete this._messageIdBase}}function x(D){return function(v,M,$,...G){return d(this,void 0,void 0,(function*(){yield M("init");let c=0;function h(m,T){if(!v)throw new S;M(m);const F=L($,++c),I=(0,P.readMessage)(v,F,T);if(I){const{message:W,interrupted:k}=I;if(k)throw new y;return W}m==="sleeping"&&M("slept")}return D({channel:v,readMessage:()=>h("reading"),syncSleep(m){m>0&&h("sleeping",{timeout:m})}},...G)}))}}function L(D,v){return`${D}-${v}`}})(),i})()}))})(ve)),ve.exports}var Lt=wt();class Ct{constructor(o,a=100){this.callback=o,this.flushTime=a,this.queue=[],this.lastFlushTime=new Date().getTime(),this.decoder=new TextDecoder}put(o,a,E){let O;typeof a=="number"?O=a.toString():typeof a!="string"?O=this.decoder.decode(a):O=a;let j={},A="text/plain";E&&(typeof E=="string"?A=E:(A=E.contentType,delete E.contentType,j=E)),this.queue.length===0||!A.startsWith("text")||this.queue[this.queue.length-1].type!==o||this.queue[this.queue.length-1].contentType!==A?this.queue.push({type:o,data:O,contentType:A,...j}):this.queue[this.queue.length-1].data+=O,this.shouldFlush()&&this.flush()}shouldFlush(){return this.queue.length>1||new Date().getTime()-this.lastFlushTime>this.flushTime}reset(){this.queue=[],this.lastFlushTime=new Date().getTime()}flush(){this.queue.forEach(o=>{this.callback(o)}),this.queue=[],this.lastFlushTime=new Date().getTime()}setCallback(o){this.callback=o}}var Pe=(r=>(r.Run="run",r.Debug="debug",r.Doctest="doctest",r))(Pe||{});class jt{constructor(){this.extras={},this.onEvent=()=>{},this.runCode=this.syncExpose()(this.runCode.bind(this)),this.queue={}}syncExpose(){return Lt.syncExpose}async launch(o){return this.onEvent=a=>{if(o(a),a.type===ke.Sleep)return this.extras.syncSleep(a.data);if(a.type===ke.Input)return this.extras.readMessage()},this.queue=new Ct(this.onEvent.bind(this)),Promise.resolve()}runModes(o){return[]}provideFiles(o,a){return Promise.resolve()}}var Ee={exports:{}};function re(r){throw new Error('Could not dynamically require "'+r+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var de={exports:{}},ot;function Ut(){return ot||(ot=1,(function(r,o){var a=(()=>{var E=Object.defineProperty,O=Object.getOwnPropertyDescriptor,j=Object.getOwnPropertyNames,A=Object.prototype.hasOwnProperty,i=(e,t)=>E(e,"name",{value:t,configurable:!0}),P=(e=>typeof re<"u"?re:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof re<"u"?re:t)[n]}):e)(function(e){if(typeof re<"u")return re.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),p=(e,t)=>{for(var n in t)E(e,n,{get:t[n],enumerable:!0})},d=(e,t,n,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of j(t))!A.call(e,s)&&s!==n&&E(e,s,{get:()=>t[s],enumerable:!(l=O(t,s))||l.enumerable});return e},y=e=>d(E({},"__esModule",{value:!0}),e),S=(()=>{for(var e=new Uint8Array(128),t=0;t<64;t++)e[t<26?t+65:t<52?t+71:t<62?t-4:t*4-205]=t;return n=>{for(var l=n.length,s=new Uint8Array((l-(n[l-1]=="=")-(n[l-2]=="="))*3/4|0),u=0,f=0;u<l;){var R=e[n.charCodeAt(u++)],C=e[n.charCodeAt(u++)],U=e[n.charCodeAt(u++)],B=e[n.charCodeAt(u++)];s[f++]=R<<2|C>>4,s[f++]=C<<4|U>>2,s[f++]=U<<6|B}return s}})(),w={};p(w,{loadPyodide:()=>_e,version:()=>ue});function x(e){return!isNaN(parseFloat(e))&&isFinite(e)}i(x,"_isNumber");function L(e){return e.charAt(0).toUpperCase()+e.substring(1)}i(L,"_capitalize");function D(e){return function(){return this[e]}}i(D,"_getter");var v=["isConstructor","isEval","isNative","isToplevel"],M=["columnNumber","lineNumber"],$=["fileName","functionName","source"],G=["args"],c=["evalOrigin"],h=v.concat(M,$,G,c);function m(e){if(e)for(var t=0;t<h.length;t++)e[h[t]]!==void 0&&this["set"+L(h[t])](e[h[t]])}for(i(m,"StackFrame"),m.prototype={getArgs:i(function(){return this.args},"getArgs"),setArgs:i(function(e){if(Object.prototype.toString.call(e)!=="[object Array]")throw new TypeError("Args must be an Array");this.args=e},"setArgs"),getEvalOrigin:i(function(){return this.evalOrigin},"getEvalOrigin"),setEvalOrigin:i(function(e){if(e instanceof m)this.evalOrigin=e;else if(e instanceof Object)this.evalOrigin=new m(e);else throw new TypeError("Eval Origin must be an Object or StackFrame")},"setEvalOrigin"),toString:i(function(){var e=this.getFileName()||"",t=this.getLineNumber()||"",n=this.getColumnNumber()||"",l=this.getFunctionName()||"";return this.getIsEval()?e?"[eval] ("+e+":"+t+":"+n+")":"[eval]:"+t+":"+n:l?l+" ("+e+":"+t+":"+n+")":e+":"+t+":"+n},"toString")},m.fromString=i(function(e){var t=e.indexOf("("),n=e.lastIndexOf(")"),l=e.substring(0,t),s=e.substring(t+1,n).split(","),u=e.substring(n+1);if(u.indexOf("@")===0)var f=/@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(u,""),R=f[1],C=f[2],U=f[3];return new m({functionName:l,args:s||void 0,fileName:R,lineNumber:C||void 0,columnNumber:U||void 0})},"StackFrame$$fromString"),T=0;T<v.length;T++)m.prototype["get"+L(v[T])]=D(v[T]),m.prototype["set"+L(v[T])]=(function(e){return function(t){this[e]=!!t}})(v[T]);var T;for(F=0;F<M.length;F++)m.prototype["get"+L(M[F])]=D(M[F]),m.prototype["set"+L(M[F])]=(function(e){return function(t){if(!x(t))throw new TypeError(e+" must be a Number");this[e]=Number(t)}})(M[F]);var F;for(I=0;I<$.length;I++)m.prototype["get"+L($[I])]=D($[I]),m.prototype["set"+L($[I])]=(function(e){return function(t){this[e]=String(t)}})($[I]);var I,W=m;function k(){var e=/^\s*at .*(\S+:\d+|\(native\))/m,t=/^(eval@)?(\[native code])?$/;return{parse:i(function(n){if(n.stack&&n.stack.match(e))return this.parseV8OrIE(n);if(n.stack)return this.parseFFOrSafari(n);throw new Error("Cannot parse given Error object")},"ErrorStackParser$$parse"),extractLocation:i(function(n){if(n.indexOf(":")===-1)return[n];var l=/(.+?)(?::(\d+))?(?::(\d+))?$/,s=l.exec(n.replace(/[()]/g,""));return[s[1],s[2]||void 0,s[3]||void 0]},"ErrorStackParser$$extractLocation"),parseV8OrIE:i(function(n){var l=n.stack.split(`
2
+ `).filter(function(s){return!!s.match(e)},this);return l.map(function(s){s.indexOf("(eval ")>-1&&(s=s.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var u=s.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),f=u.match(/ (\(.+\)$)/);u=f?u.replace(f[0],""):u;var R=this.extractLocation(f?f[1]:u),C=f&&u||void 0,U=["eval","<anonymous>"].indexOf(R[0])>-1?void 0:R[0];return new W({functionName:C,fileName:U,lineNumber:R[1],columnNumber:R[2],source:s})},this)},"ErrorStackParser$$parseV8OrIE"),parseFFOrSafari:i(function(n){var l=n.stack.split(`
3
+ `).filter(function(s){return!s.match(t)},this);return l.map(function(s){if(s.indexOf(" > eval")>-1&&(s=s.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),s.indexOf("@")===-1&&s.indexOf(":")===-1)return new W({functionName:s});var u=/((.*".+"[^@]*)?[^@]*)(?:@)/,f=s.match(u),R=f&&f[1]?f[1]:void 0,C=this.extractLocation(s.replace(u,""));return new W({functionName:R,fileName:C[0],lineNumber:C[1],columnNumber:C[2],source:s})},this)},"ErrorStackParser$$parseFFOrSafari")}}i(k,"ErrorStackParser");var g=new k,_=g;function b(){if(typeof API<"u"&&API!==globalThis.API)return API.runtimeEnv;let e=typeof Bun<"u",t=typeof Deno<"u",n=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&!process.browser,l=typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Chrome")===-1&&navigator.userAgent.indexOf("Safari")>-1;return q({IN_BUN:e,IN_DENO:t,IN_NODE:n,IN_SAFARI:l,IN_SHELL:typeof read=="function"&&typeof load=="function"})}i(b,"getGlobalRuntimeEnv");var N=b();function q(e){let t=e.IN_NODE&&!0&&r.exports&&typeof P=="function"&&typeof __dirname=="string",n=e.IN_NODE&&!t,l=!e.IN_NODE&&!e.IN_DENO&&!e.IN_BUN,s=l&&typeof window<"u"&&typeof window.document<"u"&&typeof document.createElement=="function"&&"sessionStorage"in window&&typeof globalThis.importScripts!="function",u=l&&typeof globalThis.WorkerGlobalScope<"u"&&typeof globalThis.self<"u"&&globalThis.self instanceof globalThis.WorkerGlobalScope;return{...e,IN_BROWSER:l,IN_BROWSER_MAIN_THREAD:s,IN_BROWSER_WEB_WORKER:u,IN_NODE_COMMONJS:t,IN_NODE_ESM:n}}i(q,"calculateDerivedFlags");var Z,z,V,H,J;async function X(){if(!N.IN_NODE||(Z=(await import("./__vite-browser-external-9wXp6ZBx.js")).default,H=await import("./__vite-browser-external-9wXp6ZBx.js"),J=await import("./__vite-browser-external-9wXp6ZBx.js"),V=(await import("./__vite-browser-external-9wXp6ZBx.js")).default,z=await import("./__vite-browser-external-9wXp6ZBx.js"),we=z.sep,typeof P<"u"))return;let e=H,t=await import("./__vite-browser-external-9wXp6ZBx.js"),n=await import("./__vite-browser-external-9wXp6ZBx.js"),l=await import("./__vite-browser-external-9wXp6ZBx.js"),s={fs:e,crypto:t,ws:n,child_process:l};globalThis.require=function(u){return s[u]}}i(X,"initNodeModules");function Te(e,t){return z.resolve(t||".",e)}i(Te,"node_resolvePath");function Ie(e,t){return t===void 0&&(t=location),new URL(e,t).toString()}i(Ie,"browser_resolvePath");var ie;N.IN_NODE?ie=Te:N.IN_SHELL?ie=i(e=>e,"resolvePath"):ie=Ie;var we;N.IN_NODE||(we="/");function Ne(e,t){return e.startsWith("file://")&&(e=e.slice(7)),e.includes("://")?{response:fetch(e)}:{binary:J.readFile(e).then(n=>new Uint8Array(n.buffer,n.byteOffset,n.byteLength))}}i(Ne,"node_getBinaryResponse");function Ae(e,t){if(e.startsWith("file://")&&(e=e.slice(7)),e.includes("://"))throw new Error("Shell cannot fetch urls");return{binary:Promise.resolve(new Uint8Array(readbuffer(e)))}}i(Ae,"shell_getBinaryResponse");function Re(e,t){let n=new URL(e,location);return{response:fetch(n,t?{integrity:t}:{})}}i(Re,"browser_getBinaryResponse");var oe;N.IN_NODE?oe=Ne:N.IN_SHELL?oe=Ae:oe=Re;async function Me(e,t){let{response:n,binary:l}=oe(e,t);if(l)return l;let s=await n;if(!s.ok)throw new Error(`Failed to load '${e}': request failed.`);return new Uint8Array(await s.arrayBuffer())}i(Me,"loadBinaryFile");var ae;if(N.IN_BROWSER_MAIN_THREAD)ae=i(async e=>await import(e),"loadScript");else if(N.IN_BROWSER_WEB_WORKER)ae=i(async e=>{try{globalThis.importScripts(e)}catch(t){if(t instanceof TypeError)await import(e);else throw t}},"loadScript");else if(N.IN_NODE)ae=De;else if(N.IN_SHELL)ae=load;else throw new Error("Cannot determine runtime environment");async function De(e){e.startsWith("file://")&&(e=e.slice(7)),e.includes("://")?V.runInThisContext(await(await fetch(e)).text()):await import(Z.pathToFileURL(e).href)}i(De,"nodeLoadScript");async function Fe(e){if(N.IN_NODE){await X();let t=await J.readFile(e,{encoding:"utf8"});return JSON.parse(t)}else if(N.IN_SHELL){let t=read(e);return JSON.parse(t)}else return await(await fetch(e)).json()}i(Fe,"loadLockFile");async function Le(){if(N.IN_NODE_COMMONJS)return __dirname;let e;try{throw new Error}catch(l){e=l}let t=_.parse(e)[0].fileName;if(N.IN_NODE&&!t.startsWith("file://")&&(t=`file://${t}`),N.IN_NODE_ESM){let l=await import("./__vite-browser-external-9wXp6ZBx.js");return(await import("./__vite-browser-external-9wXp6ZBx.js")).fileURLToPath(l.dirname(t))}let n=t.lastIndexOf(we);if(n===-1)throw new Error("Could not extract indexURL path from pyodide module location. Please pass the indexURL explicitly to loadPyodide.");return t.slice(0,n)}i(Le,"calculateDirname");function Ce(e){return e.substring(0,e.lastIndexOf("/")+1)||globalThis.location?.toString()||"."}i(Ce,"calculateInstallBaseUrl");function je(e){let t=e.FS,n=e.FS.filesystems.MEMFS,l=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:i(function(u){if(!u.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},"mount"),syncfs:i(async(u,f,R)=>{try{let C=s.getLocalSet(u),U=await s.getRemoteSet(u),B=f?U:C,K=f?C:U;await s.reconcile(u,B,K),R(null)}catch(C){R(C)}},"syncfs"),getLocalSet:i(u=>{let f=Object.create(null);function R(B){return B!=="."&&B!==".."}i(R,"isRealDir");function C(B){return K=>l.join2(B,K)}i(C,"toAbsolute");let U=t.readdir(u.mountpoint).filter(R).map(C(u.mountpoint));for(;U.length;){let B=U.pop(),K=t.stat(B);t.isDir(K.mode)&&U.push.apply(U,t.readdir(B).filter(R).map(C(B))),f[B]={timestamp:K.mtime,mode:K.mode}}return{type:"local",entries:f}},"getLocalSet"),getRemoteSet:i(async u=>{let f=Object.create(null),R=await _t(u.opts.fileSystemHandle);for(let[C,U]of R)C!=="."&&(f[l.join2(u.mountpoint,C)]={timestamp:U.kind==="file"?new Date((await U.getFile()).lastModified):new Date,mode:U.kind==="file"?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:f,handles:R}},"getRemoteSet"),loadLocalEntry:i(u=>{let f=t.lookupPath(u,{}).node,R=t.stat(u);if(t.isDir(R.mode))return{timestamp:R.mtime,mode:R.mode};if(t.isFile(R.mode))return f.contents=n.getFileDataAsTypedArray(f),{timestamp:R.mtime,mode:R.mode,contents:f.contents};throw new Error("node type not supported")},"loadLocalEntry"),storeLocalEntry:i((u,f)=>{if(t.isDir(f.mode))t.mkdirTree(u,f.mode);else if(t.isFile(f.mode))t.writeFile(u,f.contents,{canOwn:!0});else throw new Error("node type not supported");t.chmod(u,f.mode),t.utime(u,f.timestamp,f.timestamp)},"storeLocalEntry"),removeLocalEntry:i(u=>{var f=t.stat(u);t.isDir(f.mode)?t.rmdir(u):t.isFile(f.mode)&&t.unlink(u)},"removeLocalEntry"),loadRemoteEntry:i(async u=>{if(u.kind==="file"){let f=await u.getFile();return{contents:new Uint8Array(await f.arrayBuffer()),mode:s.FILE_MODE,timestamp:new Date(f.lastModified)}}else{if(u.kind==="directory")return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+u.kind)}},"loadRemoteEntry"),storeRemoteEntry:i(async(u,f,R)=>{let C=u.get(l.dirname(f)),U=t.isFile(R.mode)?await C.getFileHandle(l.basename(f),{create:!0}):await C.getDirectoryHandle(l.basename(f),{create:!0});if(U.kind==="file"){let B=await U.createWritable();await B.write(R.contents),await B.close()}u.set(f,U)},"storeRemoteEntry"),removeRemoteEntry:i(async(u,f)=>{await u.get(l.dirname(f)).removeEntry(l.basename(f)),u.delete(f)},"removeRemoteEntry"),reconcile:i(async(u,f,R)=>{let C=0,U=[];Object.keys(f.entries).forEach(function(Y){let Q=f.entries[Y],te=R.entries[Y];(!te||t.isFile(Q.mode)&&Q.timestamp.getTime()>te.timestamp.getTime())&&(U.push(Y),C++)}),U.sort();let B=[];if(Object.keys(R.entries).forEach(function(Y){f.entries[Y]||(B.push(Y),C++)}),B.sort().reverse(),!C)return;let K=f.type==="remote"?f.handles:R.handles;for(let Y of U){let Q=l.normalize(Y.replace(u.mountpoint,"/")).substring(1);if(R.type==="local"){let te=K.get(Q),St=await s.loadRemoteEntry(te);s.storeLocalEntry(Y,St)}else{let te=s.loadLocalEntry(Y);await s.storeRemoteEntry(K,Q,te)}}for(let Y of B)if(R.type==="local")s.removeLocalEntry(Y);else{let Q=l.normalize(Y.replace(u.mountpoint,"/")).substring(1);await s.removeRemoteEntry(K,Q)}},"reconcile")};e.FS.filesystems.NATIVEFS_ASYNC=s}i(je,"initializeNativeFS");var _t=i(async e=>{let t=[];async function n(s){for await(let u of s.values())t.push(u),u.kind==="directory"&&await n(u)}i(n,"collect"),await n(e);let l=new Map;l.set(".",e);for(let s of t){let u=(await e.resolve(s)).join("/");l.set(u,s)}return l},"getFsHandles"),vt=S("AGFzbQEAAAABDANfAGAAAW9gAW8BfwMDAgECByECD2NyZWF0ZV9zZW50aW5lbAAAC2lzX3NlbnRpbmVsAAEKEwIHAPsBAPsbCwkAIAD7GvsUAAs="),bt=(async function(){if(!(globalThis.navigator&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&typeof navigator.maxTouchPoints<"u"&&navigator.maxTouchPoints>1)))try{let e=await WebAssembly.compile(vt);return await WebAssembly.instantiate(e)}catch(e){if(e instanceof WebAssembly.CompileError)return;throw e}})();async function Ue(){let e=await bt;if(e)return e.exports;let t=Symbol("error marker");return{create_sentinel:i(()=>t,"create_sentinel"),is_sentinel:i(n=>n===t,"is_sentinel")}}i(Ue,"getSentinelImport");function $e(e){let t={config:e,runtimeEnv:N},n={noImageDecoding:!0,noAudioDecoding:!0,noWasmDecoding:!1,preRun:Ve(e),print:e.stdout,printErr:e.stderr,onExit(l){n.exitCode=l},thisProgram:e._sysExecutable,arguments:e.args,API:t,locateFile:i(l=>e.indexURL+l,"locateFile"),instantiateWasm:Je(e.indexURL)};return n}i($e,"createSettings");function We(e){return function(t){let n="/";try{t.FS.mkdirTree(e)}catch(l){console.error(`Error occurred while making a home directory '${e}':`),console.error(l),console.error(`Using '${n}' for a home directory instead`),e=n}t.FS.chdir(e)}}i(We,"createHomeDirectory");function qe(e){return function(t){Object.assign(t.ENV,e)}}i(qe,"setEnvironment");function Be(e){return e?[async t=>{t.addRunDependency("fsInitHook");try{await e(t.FS,{sitePackages:t.API.sitePackages})}finally{t.removeRunDependency("fsInitHook")}}]:[]}i(Be,"callFsInitHook");function ze(e){let t=e.HEAPU32[e._Py_Version>>>2],n=t>>>24&255,l=t>>>16&255,s=t>>>8&255;return[n,l,s]}i(ze,"computeVersionTuple");function He(e){let t=Me(e);return async n=>{n.API.pyVersionTuple=ze(n);let[l,s]=n.API.pyVersionTuple;n.FS.mkdirTree("/lib"),n.API.sitePackages=`/lib/python${l}.${s}/site-packages`,n.FS.mkdirTree(n.API.sitePackages),n.addRunDependency("install-stdlib");try{let u=await t;n.FS.writeFile(`/lib/python${l}${s}.zip`,u)}catch(u){console.error("Error occurred while installing the standard library:"),console.error(u)}finally{n.removeRunDependency("install-stdlib")}}}i(He,"installStdlib");function Ve(e){let t;return e.stdLibURL!=null?t=e.stdLibURL:t=e.indexURL+"python_stdlib.zip",[He(t),We(e.env.HOME),qe(e.env),je,...Be(e.fsInit)]}i(Ve,"getFileSystemInitializationFuncs");function Je(e){if(typeof WasmOffsetConverter<"u")return;let{binary:t,response:n}=oe(e+"pyodide.asm.wasm"),l=Ue();return function(s,u){return(async function(){s.sentinel=await l;try{let f;n?f=await WebAssembly.instantiateStreaming(n,s):f=await WebAssembly.instantiate(await t,s);let{instance:R,module:C}=f;u(R,C)}catch(f){console.warn("wasm instantiation failed!"),console.warn(f)}})(),{}}}i(Je,"getInstantiateWasmFunc");var Et="0.29.3";function se(e){return e===void 0||e.endsWith("/")?e:e+"/"}i(se,"withTrailingSlash");var ue=Et;async function Ge(e={}){if(await X(),e.lockFileContents&&e.lockFileURL)throw new Error("Can't pass both lockFileContents and lockFileURL");let t=e.indexURL||await Le();if(t=se(ie(t)),e.packageBaseUrl=se(e.packageBaseUrl),e.cdnUrl=se(e.packageBaseUrl??`https://cdn.jsdelivr.net/pyodide/v${ue}/full/`),!e.lockFileContents){let s=e.lockFileURL??t+"pyodide-lock.json";e.lockFileContents=Fe(s),e.packageBaseUrl??=Ce(s)}e.indexURL=t,e.packageCacheDir&&(e.packageCacheDir=se(ie(e.packageCacheDir)));let n={fullStdLib:!1,jsglobals:globalThis,stdin:globalThis.prompt?()=>globalThis.prompt():void 0,args:[],env:{},packages:[],packageCacheDir:e.packageBaseUrl,enableRunUntilComplete:!0,checkAPIVersion:!0,BUILD_ID:"b7b7b0f46eb68e65c029c0dc739270e8a5d35251e9aab6014ee1c2f630e5d1d0"},l=Object.assign(n,e);return l.env.HOME??="/home/pyodide",l.env.PYTHONINSPECT??="1",l}i(Ge,"initializeConfiguration");function Ye(e){let t=$e(e),n=t.API;return n.lockFilePromise=Promise.resolve(e.lockFileContents),t}i(Ye,"createEmscriptenSettings");async function Ke(e){if(typeof _createPyodideModule!="function"){let t=`${e.indexURL}pyodide.asm.js`;await ae(t)}}i(Ke,"loadWasmScript");async function Ze(e,t){if(!e._loadSnapshot)return;let n=await e._loadSnapshot,l=ArrayBuffer.isView(n)?n:new Uint8Array(n);return t.noInitialRun=!0,t.INITIAL_MEMORY=l.length,l}i(Ze,"prepareSnapshot");async function Xe(e){let t=await _createPyodideModule(e);if(e.exitCode!==void 0)throw new t.ExitStatus(e.exitCode);return t}i(Xe,"createPyodideModule");function Qe(e,t){let n=e.API;if(t.pyproxyToStringRepr&&n.setPyProxyToStringMethod(!0),t.convertNullToNone&&n.setCompatNullToNone(!0),t.toJsLiteralMap&&n.setCompatToJsLiteralMap(!0),n.version!==ue&&t.checkAPIVersion)throw new Error(`Pyodide version does not match: '${ue}' <==> '${n.version}'. If you updated the Pyodide version, make sure you also updated the 'indexURL' parameter passed to loadPyodide.`);e.locateFile=l=>{throw l.endsWith(".so")?new Error(`Failed to find dynamic library "${l}"`):new Error(`Unexpected call to locateFile("${l}")`)}}i(Qe,"configureAPI");function et(e,t,n){let l=e.API,s;return t&&(s=l.restoreSnapshot(t)),l.finalizeBootstrap(s,n._snapshotDeserializer)}i(et,"bootstrapPyodide");async function tt(e,t){let n=e._api;return n.sys.path.insert(0,""),n._pyodide.set_excepthook(),await n.packageIndexReady,n.initializeStreams(t.stdin,t.stdout,t.stderr),e}i(tt,"finalizeSetup");async function _e(e={}){let t=await Ge(e),n=Ye(t);await Ke(t);let l=await Ze(t,n),s=await Xe(n);Qe(s,t);let u=et(s,l,t);return await tt(u,t)}return i(_e,"loadPyodide"),globalThis.loadPyodide=_e,y(w)})();try{Object.assign(o,a)}catch{}globalThis.loadPyodide=a.loadPyodide})(de,de.exports)),de.exports}var at;function $t(){return at||(at=1,(function(r,o){(function(a,E){r.exports=E(wt(),gt,Ut())})(self,((a,E,O)=>(()=>{var j={237:(p,d,y)=>{y.d(d,{Z:()=>S});const S=`import importlib
4
+ import sys
5
+ from typing import Callable, Literal, Union, TypedDict
6
+
7
+ try:
8
+ from pyodide.code import find_imports # noqa
9
+ except ImportError:
10
+ from pyodide import find_imports # noqa
11
+
12
+ import pyodide_js # noqa
13
+
14
+ sys.setrecursionlimit(400)
15
+
16
+
17
+ class InstallEntry(TypedDict):
18
+ module: str
19
+ package: str
20
+
21
+
22
+ def find_imports_to_install(imports: list[str]) -> list[InstallEntry]:
23
+ """
24
+ Given a list of module names being imported, return a list of dicts
25
+ representing the packages that need to be installed to import those modules.
26
+ The returned list will only contain modules that aren't already installed.
27
+ Each returned dict has the following keys:
28
+ - module: the name of the module being imported
29
+ - package: the name of the package that needs to be installed
30
+ """
31
+ try:
32
+ to_package_name = pyodide_js._module._import_name_to_package_name.to_py()
33
+ except AttributeError:
34
+ to_package_name = pyodide_js._api._import_name_to_package_name.to_py()
35
+
36
+ to_install: list[InstallEntry] = []
37
+ for module in imports:
38
+ try:
39
+ importlib.import_module(module)
40
+ except ModuleNotFoundError:
41
+ to_install.append(
42
+ dict(
43
+ module=module,
44
+ package=to_package_name.get(module, module),
45
+ )
46
+ )
47
+ return to_install
48
+
49
+
50
+ async def install_imports(
51
+ source_code_or_imports: Union[str, list[str]],
52
+ message_callback: Callable[
53
+ [
54
+ Literal[
55
+ "loading_all",
56
+ "loaded_all",
57
+ "loading_one",
58
+ "loaded_one",
59
+ "loading_micropip",
60
+ "loaded_micropip",
61
+ ],
62
+ Union[InstallEntry, list[InstallEntry]],
63
+ ],
64
+ None,
65
+ ] = lambda event_type, data: None,
66
+ ):
67
+ """
68
+ Accepts a string of Python source code or a list of module names being imported.
69
+ Installs any packages that need to be installed to import those modules,
70
+ using micropip, which may also be installed if needed.
71
+ If the package is not specially built for Pyodide, it must be available on PyPI
72
+ as a pure Python wheel file.
73
+ If the \`message_callback\` argument is provided, it will be called with an
74
+ event type and data about the packages being installed.
75
+ The event types start with \`loading_\` before installation, and \`loaded_\` after.
76
+ The data is either a single dict representing the package being installed,
77
+ or a list of all the packages being installed.
78
+ The events are:
79
+ - loading/loaded_all, with a list of all the packages being installed.
80
+ - loading/loaded_one, with a dict for a single package.
81
+ - loading/loaded_micropip, with a dict for the special micropip package.
82
+ """
83
+ if isinstance(source_code_or_imports, str):
84
+ try:
85
+ imports: list[str] = find_imports(source_code_or_imports)
86
+ except SyntaxError:
87
+ return
88
+ else:
89
+ imports: list[str] = source_code_or_imports
90
+
91
+ to_install = find_imports_to_install(imports)
92
+ if to_install:
93
+ message_callback("loading_all", to_install)
94
+ try:
95
+ import micropip # noqa
96
+ except ModuleNotFoundError:
97
+ micropip_entry = dict(module="micropip", package="micropip")
98
+ message_callback("loading_micropip", micropip_entry)
99
+ await pyodide_js.loadPackage("micropip")
100
+ import micropip # noqa
101
+
102
+ message_callback("loaded_micropip", micropip_entry)
103
+
104
+ for entry in to_install:
105
+ message_callback("loading_one", entry)
106
+ await micropip.install(entry["package"])
107
+ message_callback("loaded_one", entry)
108
+ message_callback("loaded_all", to_install)
109
+ `},353:(p,d,y)=>{p.exports=y(846)},846:(p,d,y)=>{var S=y(960);d.operation=function(w){var x=d.timeouts(w);return new S(x,{forever:w&&(w.forever||w.retries===1/0),unref:w&&w.unref,maxRetryTime:w&&w.maxRetryTime})},d.timeouts=function(w){if(w instanceof Array)return[].concat(w);var x={retries:10,factor:2,minTimeout:1e3,maxTimeout:1/0,randomize:!1};for(var L in w)x[L]=w[L];if(x.minTimeout>x.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var D=[],v=0;v<x.retries;v++)D.push(this.createTimeout(v,x));return w&&w.forever&&!D.length&&D.push(this.createTimeout(v,x)),D.sort((function(M,$){return M-$})),D},d.createTimeout=function(w,x){var L=x.randomize?Math.random()+1:1,D=Math.round(L*Math.max(x.minTimeout,1)*Math.pow(x.factor,w));return Math.min(D,x.maxTimeout)},d.wrap=function(w,x,L){if(x instanceof Array&&(L=x,x=null),!L)for(var D in L=[],w)typeof w[D]=="function"&&L.push(D);for(var v=0;v<L.length;v++){var M=L[v],$=w[M];w[M]=(function(G){var c=d.operation(x),h=Array.prototype.slice.call(arguments,1),m=h.pop();h.push((function(T){c.retry(T)||(T&&(arguments[0]=c.mainError()),m.apply(this,arguments))})),c.attempt((function(){G.apply(w,h)}))}).bind(w,$),w[M].options=x}}},960:p=>{function d(y,S){typeof S=="boolean"&&(S={forever:S}),this._originalTimeouts=JSON.parse(JSON.stringify(y)),this._timeouts=y,this._options=S||{},this._maxRetryTime=S&&S.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._timer=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}p.exports=d,d.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts.slice(0)},d.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timer&&clearTimeout(this._timer),this._timeouts=[],this._cachedTimeouts=null},d.prototype.retry=function(y){if(this._timeout&&clearTimeout(this._timeout),!y)return!1;var S=new Date().getTime();if(y&&S-this._operationStart>=this._maxRetryTime)return this._errors.push(y),this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(y);var w=this._timeouts.shift();if(w===void 0){if(!this._cachedTimeouts)return!1;this._errors.splice(0,this._errors.length-1),w=this._cachedTimeouts.slice(-1)}var x=this;return this._timer=setTimeout((function(){x._attempts++,x._operationTimeoutCb&&(x._timeout=setTimeout((function(){x._operationTimeoutCb(x._attempts)}),x._operationTimeout),x._options.unref&&x._timeout.unref()),x._fn(x._attempts)}),w),this._options.unref&&this._timer.unref(),!0},d.prototype.attempt=function(y,S){this._fn=y,S&&(S.timeout&&(this._operationTimeout=S.timeout),S.cb&&(this._operationTimeoutCb=S.cb));var w=this;this._operationTimeoutCb&&(this._timeout=setTimeout((function(){w._operationTimeoutCb()}),w._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)},d.prototype.try=function(y){console.log("Using RetryOperation.try() is deprecated"),this.attempt(y)},d.prototype.start=function(y){console.log("Using RetryOperation.start() is deprecated"),this.attempt(y)},d.prototype.start=d.prototype.try,d.prototype.errors=function(){return this._errors},d.prototype.attempts=function(){return this._attempts},d.prototype.mainError=function(){if(this._errors.length===0)return null;for(var y={},S=null,w=0,x=0;x<this._errors.length;x++){var L=this._errors[x],D=L.message,v=(y[D]||0)+1;y[D]=v,v>=w&&(S=L,w=v)}return S}},272:p=>{p.exports=E},422:p=>{p.exports=a},28:p=>{p.exports=O}},A={};function i(p){var d=A[p];if(d!==void 0)return d.exports;var y=A[p]={exports:{}};return j[p](y,y.exports,i),y.exports}i.d=(p,d)=>{for(var y in d)i.o(d,y)&&!i.o(p,y)&&Object.defineProperty(p,y,{enumerable:!0,get:d[y]})},i.o=(p,d)=>Object.prototype.hasOwnProperty.call(p,d),i.r=p=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(p,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(p,"__esModule",{value:!0})};var P={};return(()=>{i.r(P),i.d(P,{PyodideClient:()=>I,PyodideFatalErrorReloader:()=>W,defaultPyodideLoader:()=>$,initPyodide:()=>h,loadPyodideAndPackage:()=>c,makeRunnerCallback:()=>T,pyodideExpose:()=>F,versionInfo:()=>G});var p=i(353);const d=new Set(["Failed to fetch","NetworkError when attempting to fetch resource.","The Internet connection appears to be offline.","Network request failed"]);class y extends Error{constructor(g){super(),g instanceof Error?(this.originalError=g,{message:g}=g):(this.originalError=new Error(g),this.originalError.stack=this.stack),this.name="AbortError",this.message=g}}const S=k=>globalThis.DOMException===void 0?new Error(k):new DOMException(k);async function w(k,g){return new Promise(((_,b)=>{g={onFailedAttempt(){},retries:10,...g};const N=p.operation(g);N.attempt((async q=>{try{_(await k(q))}catch(z){if(!(z instanceof Error))return void b(new TypeError(`Non-error was thrown: "${z}". You should only throw errors.`));if(z instanceof y)N.stop(),b(z.originalError);else if(z instanceof TypeError&&(Z=z.message,!d.has(Z)))N.stop(),b(z);else{((V,H,J)=>{const X=J.retries-(H-1);V.attemptNumber=H,V.retriesLeft=X})(z,q,g);try{await g.onFailedAttempt(z)}catch(V){return void b(V)}N.retry(z)||b(N.mainError())}}var Z})),g.signal&&!g.signal.aborted&&g.signal.addEventListener("abort",(()=>{N.stop();const q=g.signal.reason===void 0?S("The operation was aborted."):g.signal.reason;b(q instanceof Error?q:S(q))}),{once:!0})}))}var x=i(422),L=i(272),D=i(28),v=function(k,g,_,b){return new(_||(_=Promise))((function(N,q){function Z(H){try{V(b.next(H))}catch(J){q(J)}}function z(H){try{V(b.throw(H))}catch(J){q(J)}}function V(H){var J;H.done?N(H.value):(J=H.value,J instanceof _?J:new _((function(X){X(J)}))).then(Z,z)}V((b=b.apply(k,[])).next())}))};const M=i(237).Z;function $(k=D.version){return v(this,void 0,void 0,(function*(){const g=`https://cdn.jsdelivr.net/pyodide/v${k}/full/`,_=yield(0,D.loadPyodide)({indexURL:g});if(_.version!==k)throw new Error(`loadPyodide loaded version ${_.version} instead of ${k}`);return _}))}function G(k){return k.split(".").map(Number)}function c(k,g=$){return v(this,void 0,void 0,(function*(){let _,b,{format:N,extractDir:q,url:Z}=k;q=q||"/tmp/",[_,b]=yield Promise.all([w((()=>g()),{retries:3}),w((()=>(function(V){return v(this,void 0,void 0,(function*(){if(m.has(V))return console.log("Loaded package from cache"),m.get(V);console.log("Fetching package from "+V.slice(0,100)+"...");const H=yield fetch(V);if(!H.ok)throw new Error(`Request for package failed with status ${H.status}: ${H.statusText}`);const J=yield H.arrayBuffer();return console.log("Fetched package"),m.set(V,J),J}))})(Z)),{retries:3})]);const z=G(_.version);return _.unpackArchive(b,N,z[0]===0&&z[1]<=19?q:{extractDir:q}),_.pyimport("sys").path.append(q),h(_),_}))}function h(k){k.registerComlink(L);const g=k.pyimport("sys"),_=k.pyimport("pathlib"),b="/tmp/pyodide_worker_runner/";g.path.append(b),_.Path(b).mkdir(),_.Path(b+"pyodide_worker_runner.py").write_text(M),k.pyimport("pyodide_worker_runner")}const m=new Map;function T(k,g){return function(_,b){return b.toJs&&(b=b.toJs({dict_converter:Object.fromEntries})),_==="input"?(g.input&&g.input(b.prompt),k.readMessage()+`
110
+ `):_!=="sleep"?_==="output"?g.output(b.parts):g.other(_,b):void k.syncSleep(1e3*b.seconds)}}function F(k){return(0,x.syncExpose)((function(g,_,...b){return v(this,void 0,void 0,(function*(){return k(Object.assign(Object.assign({},g),{interruptBuffer:_}),...b)}))}))}class I extends x.SyncClient{call(g,..._){const b=Object.create(null,{call:{get:()=>super.call}});return v(this,void 0,void 0,(function*(){let N=null;return typeof SharedArrayBuffer<"u"&&(N=new Int32Array(new SharedArrayBuffer(1*Int32Array.BYTES_PER_ELEMENT)),this.interrupter=()=>{N[0]=2}),b.call.call(this,g,N,..._)}))}}class W{constructor(g){this.loader=g,this.pyodidePromise=g()}withPyodide(g){return v(this,void 0,void 0,(function*(){const _=yield this.pyodidePromise;try{return yield g(_)}catch(b){throw b.pyodide_fatal_error&&(this.pyodidePromise=this.loader()),b}}))}}})(),P})()))})(Ee)),Ee.exports}var st=$t();const Wt=new URL("/assets/python_package.tar.gz-B8aMWvGt.load_by_url",import.meta.url).href;class le extends jt{constructor(){super(),this.pyodide={},this.installPromise=null}static convert(o){return o.toJs?o.toJs({dict_converter:Object.fromEntries}):o}syncExpose(){return st.pyodideExpose}static async getPyodide(){return await st.loadPyodideAndPackage({url:Wt,format:".tgz"})}async launch(o){await super.launch(o),this.pyodide=await le.getPyodide(),this.papyros=this.pyodide.pyimport("papyros").Papyros.callKwargs({callback:a=>{const E=le.convert(a);return this.onEvent(E)},buffer_constructor:a=>(this.queue.setCallback(a),this.queue)}),await this.pyodide.loadPackage("micropip")}async installImports(o){this.installPromise==null&&(this.installPromise=this.papyros?.install_imports.callKwargs({source_code:o,ignore_missing:!0})),await this.installPromise,this.installPromise=null}runModes(o){let a=super.runModes(o);return this.papyros?.has_doctests(o)&&(a=[Pe.Doctest,...a]),a=[Pe.Debug,...a],a}async runCode(o,a,E="exec"){return this.extras=o,o.interruptBuffer&&this.pyodide.setInterruptBuffer(o.interruptBuffer),await this.installImports(a),await this.papyros?.run_async.callKwargs({source_code:a,mode:E})}async lintCode(o){return await this.installImports(o),le.convert(this.papyros?.lint(o)||[])}async provideFiles(o,a){await this.papyros?.provide_files.callKwargs({inline_files:JSON.stringify(o),href_files:JSON.stringify(a)})}}const qt=new le;ge(qt);
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" style="height: 100%">
3
+
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2020%2020'%3E%3Ctext%20x='0'%20y='14'%3E📜%3C/text%3E%3C/svg%3E" type="image/svg+xml" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
8
+ <meta name="theme-color" content="#000000" />
9
+ <meta name="description" content="Scratchpad for various programming languages in the browser" />
10
+ <link rel="apple-touch-icon" href="logo192.png" />
11
+ <!--
12
+ manifest.json provides metadata used when your web app is installed on a
13
+ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
14
+ -->
15
+ <link rel="manifest" href="/assets/manifest-BaVmi6rC.json" />
16
+
17
+ <title>Papyros</title>
18
+ <script type="module" crossorigin src="/assets/index-C1AWjGcU.js"></script>
19
+ </head>
20
+
21
+ <body style="margin: 0; height: 100%; width: 100%;">
22
+ <noscript>You need to enable JavaScript to run this app.</noscript>
23
+ <p-app></p-app>
24
+ </body>
25
+
26
+ </html>
@@ -0,0 +1,15 @@
1
+ {
2
+ "short_name": "Papyros",
3
+ "name": "Papyros: coding in the browser",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ }
10
+ ],
11
+ "start_url": ".",
12
+ "display": "standalone",
13
+ "theme_color": "#000000",
14
+ "background_color": "#ffffff"
15
+ }
@@ -0,0 +1,3 @@
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dodona/papyros",
3
- "version": "4.1.0",
3
+ "version": "4.1.1",
4
4
  "private": false,
5
5
  "homepage": ".",
6
6
  "dependencies": {
package/dist/Library.d.ts DELETED
@@ -1,11 +0,0 @@
1
- import "./frontend/components/Input";
2
- import "./frontend/components/Output";
3
- import "./frontend/components/CodeRunner";
4
- import "./frontend/components/Debugger";
5
- import { Papyros, papyros } from "./frontend/state/Papyros";
6
- import { InputMode } from "./frontend/state/InputOutput";
7
- import { RunMode } from "./backend/Backend";
8
- import { ProgrammingLanguage } from "./ProgrammingLanguage";
9
- import { OutputType, FriendlyError } from "./frontend/state/InputOutput";
10
- export { Papyros, InputMode, RunMode, ProgrammingLanguage, OutputType, papyros };
11
- export type { FriendlyError };
package/dist/Library.js DELETED
@@ -1,11 +0,0 @@
1
- import "./frontend/components/Input";
2
- import "./frontend/components/Output";
3
- import "./frontend/components/CodeRunner";
4
- import "./frontend/components/Debugger";
5
- import { Papyros, papyros } from "./frontend/state/Papyros";
6
- import { InputMode } from "./frontend/state/InputOutput";
7
- import { RunMode } from "./backend/Backend";
8
- import { ProgrammingLanguage } from "./ProgrammingLanguage";
9
- import { OutputType } from "./frontend/state/InputOutput";
10
- export { Papyros, InputMode, RunMode, ProgrammingLanguage, OutputType, papyros };
11
- //# sourceMappingURL=Library.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Library.js","sourceRoot":"","sources":["../src/Library.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAiB,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * String enum representing programming languages supported by Papyros
3
- */
4
- export declare enum ProgrammingLanguage {
5
- Python = "Python",
6
- JavaScript = "JavaScript"
7
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * String enum representing programming languages supported by Papyros
3
- */
4
- export var ProgrammingLanguage;
5
- (function (ProgrammingLanguage) {
6
- ProgrammingLanguage["Python"] = "Python";
7
- ProgrammingLanguage["JavaScript"] = "JavaScript";
8
- })(ProgrammingLanguage || (ProgrammingLanguage = {}));
9
- //# sourceMappingURL=ProgrammingLanguage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProgrammingLanguage.js","sourceRoot":"","sources":["../src/ProgrammingLanguage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC3B,wCAAiB,CAAA;IACjB,gDAAyB,CAAA;AAC7B,CAAC,EAHW,mBAAmB,KAAnB,mBAAmB,QAG9B"}
@@ -1,92 +0,0 @@
1
- import { BackendEvent } from "../communication/BackendEvent";
2
- import { SyncExtras } from "comsync";
3
- import { BackendEventQueue } from "../communication/BackendEventQueue";
4
- export interface WorkerDiagnostic {
5
- /**
6
- * 1-based index of the starting line containing the issue
7
- */
8
- lineNr: number;
9
- /**
10
- * 0-based index of the column in the starting line
11
- */
12
- columnNr: number;
13
- /**
14
- * 1-based index of the ending line containing the issue
15
- * Can be the same as lineNr
16
- */
17
- endLineNr: number;
18
- /**
19
- * 0-based index of the column in the ending line
20
- */
21
- endColumnNr: number;
22
- /**
23
- * Severity of the issue
24
- */
25
- severity: "info" | "warning" | "error";
26
- /**
27
- * Message describing the issue
28
- */
29
- message: string;
30
- }
31
- export declare enum RunMode {
32
- Run = "run",
33
- Debug = "debug",
34
- Doctest = "doctest"
35
- }
36
- export declare abstract class Backend<Extras extends SyncExtras = SyncExtras> {
37
- /**
38
- * SyncExtras object that grants access to helpful methods
39
- * for synchronous operations
40
- */
41
- protected extras: Extras;
42
- /**
43
- * Callback to handle events published by this Backend
44
- */
45
- protected onEvent: (e: BackendEvent) => any;
46
- /**
47
- * Queue to handle published events without overloading the thread
48
- */
49
- protected queue: BackendEventQueue;
50
- /**
51
- * Constructor is limited as it is meant to be used as a WebWorker
52
- * Proper initialization occurs in the launch method when the worker is started
53
- * Synchronously exposing methods should be done here
54
- */
55
- constructor();
56
- /**
57
- * @return {any} The function to expose methods for Comsync to allow interrupting
58
- */
59
- protected syncExpose(): any;
60
- /**
61
- * Initialize the backend by doing all setup-related work
62
- * @param {function(BackendEvent):void} onEvent Callback for when events occur
63
- * @return {Promise<void>} Promise of launching
64
- */
65
- launch(onEvent: (e: BackendEvent) => void): Promise<void>;
66
- /**
67
- * Determine whether the modes supported by this Backend are active
68
- * @param {string} code The current code in the editor
69
- * @return {Array<RunMode>} The run modes of this Backend
70
- */
71
- runModes(code: string): Array<RunMode>;
72
- /**
73
- * Executes the given code
74
- * @param {Extras} extras Helper properties to run code
75
- * @param {string} code The code to run
76
- * @param {string} mode The mode to run the code in
77
- * @return {Promise<void>} Promise of execution
78
- */
79
- abstract runCode(extras: Extras, code: string, mode?: string): Promise<void>;
80
- /**
81
- * Generate linting suggestions for the given code
82
- * @param {string} code The code to lint
83
- */
84
- abstract lintCode(code: string): Promise<Array<WorkerDiagnostic>>;
85
- /**
86
- * Provide files to be used by the backend
87
- * @param {Record<string, string>} inlineFiles Map of file names to their contents
88
- * @param {Record<string, string>} hrefFiles Map of file names to URLS with their contents
89
- * @return {Promise<void>} Resolves when the files are present in the backend
90
- */
91
- provideFiles(inlineFiles: Record<string, string>, hrefFiles: Record<string, string>): Promise<void>;
92
- }
@@ -1,79 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { BackendEventType } from "../communication/BackendEvent";
11
- import { syncExpose } from "comsync";
12
- import { BackendEventQueue } from "../communication/BackendEventQueue";
13
- export var RunMode;
14
- (function (RunMode) {
15
- RunMode["Run"] = "run";
16
- RunMode["Debug"] = "debug";
17
- RunMode["Doctest"] = "doctest";
18
- })(RunMode || (RunMode = {}));
19
- export class Backend {
20
- /**
21
- * Constructor is limited as it is meant to be used as a WebWorker
22
- * Proper initialization occurs in the launch method when the worker is started
23
- * Synchronously exposing methods should be done here
24
- */
25
- constructor() {
26
- this.extras = {};
27
- this.onEvent = () => {
28
- // Empty, initialized in launch
29
- };
30
- this.runCode = this.syncExpose()(this.runCode.bind(this));
31
- this.queue = {};
32
- }
33
- /**
34
- * @return {any} The function to expose methods for Comsync to allow interrupting
35
- */
36
- syncExpose() {
37
- return syncExpose;
38
- }
39
- /**
40
- * Initialize the backend by doing all setup-related work
41
- * @param {function(BackendEvent):void} onEvent Callback for when events occur
42
- * @return {Promise<void>} Promise of launching
43
- */
44
- launch(onEvent) {
45
- return __awaiter(this, void 0, void 0, function* () {
46
- this.onEvent = (e) => {
47
- onEvent(e);
48
- if (e.type === BackendEventType.Sleep) {
49
- return this.extras.syncSleep(e.data);
50
- }
51
- else if (e.type === BackendEventType.Input) {
52
- return this.extras.readMessage();
53
- }
54
- };
55
- this.queue = new BackendEventQueue(this.onEvent.bind(this));
56
- return Promise.resolve();
57
- });
58
- }
59
- /**
60
- * Determine whether the modes supported by this Backend are active
61
- * @param {string} code The current code in the editor
62
- * @return {Array<RunMode>} The run modes of this Backend
63
- */
64
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
65
- runModes(code) {
66
- return [];
67
- }
68
- /**
69
- * Provide files to be used by the backend
70
- * @param {Record<string, string>} inlineFiles Map of file names to their contents
71
- * @param {Record<string, string>} hrefFiles Map of file names to URLS with their contents
72
- * @return {Promise<void>} Resolves when the files are present in the backend
73
- */
74
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
75
- provideFiles(inlineFiles, hrefFiles) {
76
- return Promise.resolve();
77
- }
78
- }
79
- //# sourceMappingURL=Backend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Backend.js","sourceRoot":"","sources":["../../src/backend/Backend.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgB,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AA8BvE,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACf,sBAAW,CAAA;IACX,0BAAe,CAAA;IACf,8BAAmB,CAAA;AACvB,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,OAAgB,OAAO;IAczB;;;;OAIG;IACH;QACI,IAAI,CAAC,MAAM,GAAG,EAAY,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAChB,+BAA+B;QACnC,CAAC,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,EAAuB,CAAC;IACzC,CAAC;IAED;;OAEG;IACO,UAAU;QAChB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACU,MAAM,CAAC,OAAkC;;YAClD,IAAI,CAAC,OAAO,GAAG,CAAC,CAAe,EAAE,EAAE;gBAC/B,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrC,CAAC;YACL,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;KAAA;IAED;;;;OAIG;IACH,6DAA6D;IACtD,QAAQ,CAAC,IAAY;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAiBD;;;;;OAKG;IACH,6DAA6D;IACtD,YAAY,CAAC,WAAmC,EAAE,SAAiC;QACtF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ"}
@@ -1,39 +0,0 @@
1
- import { Backend, WorkerDiagnostic } from "../../Backend";
2
- import { SyncExtras } from "comsync";
3
- /**
4
- * Implementation of a JavaScript backend for Papyros
5
- * by using eval and overriding some builtins
6
- */
7
- export declare class JavaScriptWorker extends Backend<SyncExtras> {
8
- /**
9
- * Convert varargs to a string, similar to how the console does it
10
- * @param {any[]} args The values to join into a string
11
- * @return {string} The string representation
12
- */
13
- private static stringify;
14
- /**
15
- * Prompt the user for input with a message
16
- * @param {string} text The message to show when asking for input
17
- * @return {string} The value the user gave
18
- */
19
- private prompt;
20
- /**
21
- * Print values to the output screen
22
- * @param {any[]} args The values to log
23
- */
24
- private consoleLog;
25
- /**
26
- * Print values to the error screen
27
- * @param {any[]} args The error values to log
28
- */
29
- private consoleError;
30
- /**
31
- * Helper method to generate suggestions based on properties in an object
32
- * @param {number} from Where in the document the autocompletion starts
33
- * @param {any} object Object with properties that might be relevant
34
- * @return {CompletionResult} Autocompletion suggestions
35
- */
36
- private static completeProperties;
37
- runCode(extras: SyncExtras, code: string): Promise<any>;
38
- lintCode(): Promise<Array<WorkerDiagnostic>>;
39
- }