@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.
- package/dist/assets/__vite-browser-external-9wXp6ZBx.js +1 -0
- package/dist/assets/__vite-browser-external-BIHI7g3E.js +1 -0
- package/dist/assets/index-C1AWjGcU.js +2202 -0
- package/dist/assets/manifest-BaVmi6rC.json +15 -0
- package/dist/assets/python_package.tar.gz-B8aMWvGt.load_by_url +0 -0
- package/dist/assets/worker-BhABRh01.js +5 -0
- package/dist/assets/worker-C2Ju1j5g.js +110 -0
- package/dist/index.html +26 -0
- package/dist/manifest.json +15 -0
- package/dist/robots.txt +3 -0
- package/package.json +1 -1
- package/dist/Library.d.ts +0 -11
- package/dist/Library.js +0 -11
- package/dist/Library.js.map +0 -1
- package/dist/ProgrammingLanguage.d.ts +0 -7
- package/dist/ProgrammingLanguage.js +0 -9
- package/dist/ProgrammingLanguage.js.map +0 -1
- package/dist/backend/Backend.d.ts +0 -92
- package/dist/backend/Backend.js +0 -79
- package/dist/backend/Backend.js.map +0 -1
- package/dist/backend/workers/javascript/JavaScriptWorker.d.ts +0 -39
- package/dist/backend/workers/javascript/JavaScriptWorker.js +0 -158
- package/dist/backend/workers/javascript/JavaScriptWorker.js.map +0 -1
- package/dist/backend/workers/javascript/worker.d.ts +0 -1
- package/dist/backend/workers/javascript/worker.js +0 -5
- package/dist/backend/workers/javascript/worker.js.map +0 -1
- package/dist/backend/workers/python/PythonWorker.d.ts +0 -32
- package/dist/backend/workers/python/PythonWorker.js +0 -117
- package/dist/backend/workers/python/PythonWorker.js.map +0 -1
- package/dist/backend/workers/python/python_package.tar.gz.load_by_url +0 -0
- package/dist/backend/workers/python/worker.d.ts +0 -1
- package/dist/backend/workers/python/worker.js +0 -5
- package/dist/backend/workers/python/worker.js.map +0 -1
- package/dist/communication/BackendEvent.d.ts +0 -33
- package/dist/communication/BackendEvent.js +0 -18
- package/dist/communication/BackendEvent.js.map +0 -1
- package/dist/communication/BackendEventQueue.d.ts +0 -59
- package/dist/communication/BackendEventQueue.js +0 -96
- package/dist/communication/BackendEventQueue.js.map +0 -1
- package/dist/communication/BackendManager.d.ts +0 -68
- package/dist/communication/BackendManager.js +0 -99
- package/dist/communication/BackendManager.js.map +0 -1
- package/dist/communication/InputServiceWorker.d.ts +0 -1
- package/dist/communication/InputServiceWorker.js +0 -37
- package/dist/communication/InputServiceWorker.js.map +0 -1
- package/dist/communication/InputWorker.d.ts +0 -22
- package/dist/communication/InputWorker.js +0 -63
- package/dist/communication/InputWorker.js.map +0 -1
- package/dist/frontend/components/CodeRunner.d.ts +0 -9
- package/dist/frontend/components/CodeRunner.js +0 -60
- package/dist/frontend/components/CodeRunner.js.map +0 -1
- package/dist/frontend/components/Debugger.d.ts +0 -7
- package/dist/frontend/components/Debugger.js +0 -75
- package/dist/frontend/components/Debugger.js.map +0 -1
- package/dist/frontend/components/Input.d.ts +0 -13
- package/dist/frontend/components/Input.js +0 -60
- package/dist/frontend/components/Input.js.map +0 -1
- package/dist/frontend/components/Output.d.ts +0 -14
- package/dist/frontend/components/Output.js +0 -157
- package/dist/frontend/components/Output.js.map +0 -1
- package/dist/frontend/components/PapyrosElement.d.ts +0 -8
- package/dist/frontend/components/PapyrosElement.js +0 -24
- package/dist/frontend/components/PapyrosElement.js.map +0 -1
- package/dist/frontend/components/app/App.d.ts +0 -24
- package/dist/frontend/components/app/App.js +0 -207
- package/dist/frontend/components/app/App.js.map +0 -1
- package/dist/frontend/components/app/ExamplePicker.d.ts +0 -7
- package/dist/frontend/components/app/ExamplePicker.js +0 -36
- package/dist/frontend/components/app/ExamplePicker.js.map +0 -1
- package/dist/frontend/components/app/LanguagePicker.d.ts +0 -7
- package/dist/frontend/components/app/LanguagePicker.js +0 -33
- package/dist/frontend/components/app/LanguagePicker.js.map +0 -1
- package/dist/frontend/components/app/ProgrammingLanguagePicker.d.ts +0 -7
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js +0 -38
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js.map +0 -1
- package/dist/frontend/components/app/examples/JavaScriptExamples.d.ts +0 -5
- package/dist/frontend/components/app/examples/JavaScriptExamples.js +0 -16
- package/dist/frontend/components/app/examples/JavaScriptExamples.js.map +0 -1
- package/dist/frontend/components/app/examples/PythonExamples.d.ts +0 -14
- package/dist/frontend/components/app/examples/PythonExamples.js +0 -163
- package/dist/frontend/components/app/examples/PythonExamples.js.map +0 -1
- package/dist/frontend/components/app/themes/ThemePicker.d.ts +0 -11
- package/dist/frontend/components/app/themes/ThemePicker.js +0 -48
- package/dist/frontend/components/app/themes/ThemePicker.js.map +0 -1
- package/dist/frontend/components/app/themes/ThemedButton.d.ts +0 -9
- package/dist/frontend/components/app/themes/ThemedButton.js +0 -53
- package/dist/frontend/components/app/themes/ThemedButton.js.map +0 -1
- package/dist/frontend/components/code_mirror/BatchInputEditor.d.ts +0 -8
- package/dist/frontend/components/code_mirror/BatchInputEditor.js +0 -51
- package/dist/frontend/components/code_mirror/BatchInputEditor.js.map +0 -1
- package/dist/frontend/components/code_mirror/CodeEditor.d.ts +0 -24
- package/dist/frontend/components/code_mirror/CodeEditor.js +0 -200
- package/dist/frontend/components/code_mirror/CodeEditor.js.map +0 -1
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.d.ts +0 -22
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js +0 -111
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js.map +0 -1
- package/dist/frontend/components/code_mirror/Extensions.d.ts +0 -15
- package/dist/frontend/components/code_mirror/Extensions.js +0 -164
- package/dist/frontend/components/code_mirror/Extensions.js.map +0 -1
- package/dist/frontend/components/code_mirror/MaterialTheme.d.ts +0 -5
- package/dist/frontend/components/code_mirror/MaterialTheme.js +0 -115
- package/dist/frontend/components/code_mirror/MaterialTheme.js.map +0 -1
- package/dist/frontend/components/code_runner/ButtonLint.d.ts +0 -9
- package/dist/frontend/components/code_runner/ButtonLint.js +0 -72
- package/dist/frontend/components/code_runner/ButtonLint.js.map +0 -1
- package/dist/frontend/components/code_runner/Code.d.ts +0 -7
- package/dist/frontend/components/code_runner/Code.js +0 -48
- package/dist/frontend/components/code_runner/Code.js.map +0 -1
- package/dist/frontend/components/code_runner/RunState.d.ts +0 -7
- package/dist/frontend/components/code_runner/RunState.js +0 -41
- package/dist/frontend/components/code_runner/RunState.js.map +0 -1
- package/dist/frontend/components/input/BatchInput.d.ts +0 -9
- package/dist/frontend/components/input/BatchInput.js +0 -53
- package/dist/frontend/components/input/BatchInput.js.map +0 -1
- package/dist/frontend/components/input/InteractiveInput.d.ts +0 -13
- package/dist/frontend/components/input/InteractiveInput.js +0 -71
- package/dist/frontend/components/input/InteractiveInput.js.map +0 -1
- package/dist/frontend/state/Constants.d.ts +0 -38
- package/dist/frontend/state/Constants.js +0 -111
- package/dist/frontend/state/Constants.js.map +0 -1
- package/dist/frontend/state/Debugger.d.ts +0 -23
- package/dist/frontend/state/Debugger.js +0 -86
- package/dist/frontend/state/Debugger.js.map +0 -1
- package/dist/frontend/state/Examples.d.ts +0 -11
- package/dist/frontend/state/Examples.js +0 -36
- package/dist/frontend/state/Examples.js.map +0 -1
- package/dist/frontend/state/I18n.d.ts +0 -16
- package/dist/frontend/state/I18n.js +0 -75
- package/dist/frontend/state/I18n.js.map +0 -1
- package/dist/frontend/state/InputOutput.d.ts +0 -64
- package/dist/frontend/state/InputOutput.js +0 -146
- package/dist/frontend/state/InputOutput.js.map +0 -1
- package/dist/frontend/state/Papyros.d.ts +0 -40
- package/dist/frontend/state/Papyros.js +0 -115
- package/dist/frontend/state/Papyros.js.map +0 -1
- package/dist/frontend/state/Runner.d.ts +0 -123
- package/dist/frontend/state/Runner.js +0 -372
- package/dist/frontend/state/Runner.js.map +0 -1
- package/dist/frontend/state/Test.d.ts +0 -10
- package/dist/frontend/state/Test.js +0 -43
- package/dist/frontend/state/Test.js.map +0 -1
- package/dist/frontend/state/Translations.d.ts +0 -178
- package/dist/frontend/state/Translations.js +0 -187
- package/dist/frontend/state/Translations.js.map +0 -1
- package/dist/frontend/state/themes/blue-dark.d.ts +0 -2
- package/dist/frontend/state/themes/blue-dark.js +0 -56
- package/dist/frontend/state/themes/blue-dark.js.map +0 -1
- package/dist/frontend/state/themes/blue-light.d.ts +0 -2
- package/dist/frontend/state/themes/blue-light.js +0 -56
- package/dist/frontend/state/themes/blue-light.js.map +0 -1
- package/dist/frontend/state/themes/green-dark.d.ts +0 -2
- package/dist/frontend/state/themes/green-dark.js +0 -56
- package/dist/frontend/state/themes/green-dark.js.map +0 -1
- package/dist/frontend/state/themes/green-light.d.ts +0 -2
- package/dist/frontend/state/themes/green-light.js +0 -56
- package/dist/frontend/state/themes/green-light.js.map +0 -1
- package/dist/frontend/state/themes/red-dark.d.ts +0 -2
- package/dist/frontend/state/themes/red-dark.js +0 -56
- package/dist/frontend/state/themes/red-dark.js.map +0 -1
- package/dist/frontend/state/themes/red-light.d.ts +0 -2
- package/dist/frontend/state/themes/red-light.js +0 -56
- package/dist/frontend/state/themes/red-light.js.map +0 -1
- package/dist/util/Logging.d.ts +0 -15
- package/dist/util/Logging.js +0 -30
- package/dist/util/Logging.js.map +0 -1
- package/dist/util/Util.d.ts +0 -8
- package/dist/util/Util.js +0 -48
- 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
|
+
}
|
|
Binary file
|
|
@@ -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);
|
package/dist/index.html
ADDED
|
@@ -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
|
+
}
|
package/dist/robots.txt
ADDED
package/package.json
CHANGED
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
|
package/dist/Library.js.map
DELETED
|
@@ -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,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
|
-
}
|
package/dist/backend/Backend.js
DELETED
|
@@ -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
|
-
}
|