@pyscript/core 0.4.20 → 0.4.22
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/codemirror-Dr2Hgejs.js +2 -0
- package/dist/{codemirror-Da0uB6D0.js.map → codemirror-Dr2Hgejs.js.map} +1 -1
- package/dist/{codemirror_commands-Cda0Zxd7.js → codemirror_commands-MgxtVkrD.js} +2 -2
- package/dist/codemirror_commands-MgxtVkrD.js.map +1 -0
- package/dist/{codemirror_lang-python-DIyWB5tk.js → codemirror_lang-python-luVWQrEE.js} +2 -2
- package/dist/{codemirror_lang-python-DIyWB5tk.js.map → codemirror_lang-python-luVWQrEE.js.map} +1 -1
- package/dist/{codemirror_language-DCl5sMoK.js → codemirror_language-_XiX6II0.js} +2 -2
- package/dist/{codemirror_language-DCl5sMoK.js.map → codemirror_language-_XiX6II0.js.map} +1 -1
- package/dist/{codemirror_view-Bz8y6BoV.js → codemirror_view-C0PMO2z_.js} +2 -2
- package/dist/codemirror_view-C0PMO2z_.js.map +1 -0
- package/dist/core-BYYQYOhK.js +3 -0
- package/dist/core-BYYQYOhK.js.map +1 -0
- package/dist/core.js +1 -1
- package/dist/{deprecations-manager-Dj-XJTYm.js → deprecations-manager-CKkQd0VB.js} +2 -2
- package/dist/{deprecations-manager-Dj-XJTYm.js.map → deprecations-manager-CKkQd0VB.js.map} +1 -1
- package/dist/{error-CYOIlKpM.js → error-2Z4e847Z.js} +2 -2
- package/dist/{error-CYOIlKpM.js.map → error-2Z4e847Z.js.map} +1 -1
- package/dist/{index-2LL_kWLg.js → index-CTWZX_TW.js} +2 -2
- package/dist/{index-2LL_kWLg.js.map → index-CTWZX_TW.js.map} +1 -1
- package/dist/{py-editor-s2k8SC31.js → py-editor-CaZp_wYL.js} +2 -2
- package/dist/{py-editor-s2k8SC31.js.map → py-editor-CaZp_wYL.js.map} +1 -1
- package/dist/py-terminal-CvVsSZex.js +2 -0
- package/dist/py-terminal-CvVsSZex.js.map +1 -0
- package/dist/xterm_addon-web-links-Cnej-nJ6.js +2 -0
- package/dist/xterm_addon-web-links-Cnej-nJ6.js.map +1 -0
- package/dist/zip-BVYJ4_a2.js.map +1 -1
- package/dist.zip +0 -0
- package/package.json +9 -8
- package/src/3rd-party/xterm_addon-web-links.js +7 -0
- package/src/core.js +4 -4
- package/src/hooks.js +5 -4
- package/src/plugins/py-terminal.js +10 -5
- package/src/stdlib/pyscript/display.py +11 -11
- package/src/stdlib/pyscript.js +1 -1
- package/src/stdlib.js +30 -5
- package/types/3rd-party/xterm_addon-web-links.d.ts +4 -0
- package/types/core.d.ts +3 -2
- package/types/hooks.d.ts +1 -1
- package/types/stdlib.d.ts +2 -2
- package/dist/codemirror-Da0uB6D0.js +0 -2
- package/dist/codemirror_commands-Cda0Zxd7.js.map +0 -1
- package/dist/codemirror_view-Bz8y6BoV.js.map +0 -1
- package/dist/core-2NwtOg82.js +0 -3
- package/dist/core-2NwtOg82.js.map +0 -1
- package/dist/py-terminal-4lUBhmlJ.js +0 -2
- package/dist/py-terminal-4lUBhmlJ.js.map +0 -1
@@ -1,2 +0,0 @@
|
|
1
|
-
import{T as e,c as t,e as r,a as n}from"./core-2NwtOg82.js";import{notify as i}from"./error-CYOIlKpM.js";const o=[],s=e=>{throw i(e),new Error(e)},a=({attributes:{worker:e}})=>!e,l=new WeakSet;let d=!0;const c=({interpreter:e,io:t,run:r,type:n},{sync:i})=>{if(!i.is_pyterminal())return;r("from polyscript import currentScript as _; __terminal__ = _.terminal; del _");let o="";const{pyterminal_read:s,pyterminal_write:a}=i,l=new TextDecoder,d={isatty:!1,write:e=>(o=l.decode(e),a(o),e.length)};if(t.stderr=e=>{a(String(e.message||e))},"mpy"===n){e.registerJsModule("_pyscript_input",{input:s}),r("from _pyscript_input import input");const n=e=>{const t=[];let r=0;return n=>{let i=0;for(const o of n)t.push(o),r?r--:194<=o&&o<=223?r=1:224<=o&&o<=239?r=2:240<=o&&o<=244&&(r=3),r||(i+=t.length,e(new Uint8Array(t.splice(0))));return i}};t.stdout=n(d.write),e.registerJsModule("code",{interact(){let r="",i=1;const o=new TextEncoder,d=[],c=n((e=>{d.push(...e),a(l.decode(e))}));t.stdout=e=>i++>r.length?c(e):0,e.replInit(),function t(){const n=l.decode(new Uint8Array(d.splice(0))),a=`${s(n.split("\n").at(-1))}\r`;i=0,r=o.encode(a);for(const t of r)e.replProcessChar(t);t()}()}})}else e.setStdout(d),e.setStderr(d),e.setStdin({isatty:!1,stdin:()=>s(o)})},m=async e=>{const[{Terminal:t},{Readline:i},{FitAddon:o}]=await Promise.all([import("./xterm-DqawCVsv.js"),import("./xterm-readline-D247p8vq.js"),import("./xterm_addon-fit--gyF3PcZ.js")]),s=new i,a=r=>{let i=e;const a=e.getAttribute("target");if(a){if(i=document.getElementById(a)||document.querySelector(a),!i)throw new Error(`Unknown target ${a}`)}else i=document.createElement("py-terminal"),i.style.display="block",e.after(i);const l=new t({theme:{background:"#191A19",foreground:"#F5F2E7"},...r}),d=new o;return l.loadAddon(d),l.loadAddon(s),l.open(i),d.fit(),l.focus(),n(e,{terminal:{value:l},process:{value:async e=>{for(const t of e.split(/(?:\r|\n|\r\n)/)){l.paste(`${t}\n`);do{await new Promise((e=>setTimeout(e,0)))}while(!s.activeRead?.resolve);s.activeRead.resolve(t)}}}}),l};e.hasAttribute("worker")?(r.main.onWorker.add((function e(t,n){l.has(n)||(l.add(n),r.main.onWorker.delete(e),a({disableStdin:!1,cursorBlink:!0,cursorStyle:"block"}),n.sync.is_pyterminal=()=>!0,n.sync.pyterminal_read=s.read.bind(s),n.sync.pyterminal_write=s.write.bind(s))})),r.worker.onReady.add(c)):r.main.onReady.add((function e({interpreter:t,io:n,run:i,type:o}){console.warn("py-terminal is read only on main thread"),r.main.onReady.delete(e),globalThis.__py_terminal__=a({disableStdin:!0,cursorBlink:!1,cursorStyle:"underline"}),i("from js import __py_terminal__ as __terminal__"),delete globalThis.__py_terminal__,n.stderr=e=>{s.write(String(e.message||e))},"mpy"===o&&(t.setStdin=Object,t.setStderr=Object,t.setStdout=({write:e})=>{n.stdout=e});let l="";const d=new TextDecoder,c={isatty:!1,write:e=>(l=d.decode(e),s.write(l),e.length)};t.setStdout(c),t.setStderr(c),t.setStdin({isatty:!1,stdin:()=>s.read(l)})}))};for(const r of e.keys()){const e=`script[type="${r}"][terminal],${r}-script[terminal]`;o.push(e),t.set(e,(async e=>{const t=document.querySelectorAll(o.join(","));[].filter.call(t,a).length>1&&s("You can use at most 1 main terminal"),d&&(d=!1,document.head.append(Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL("./xterm.css",import.meta.url)}))),await m(e)}))}
|
2
|
-
//# sourceMappingURL=py-terminal-4lUBhmlJ.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"py-terminal-4lUBhmlJ.js","sources":["../src/plugins/py-terminal.js"],"sourcesContent":["// PyScript py-terminal plugin\nimport { TYPES, hooks } from \"../core.js\";\nimport { notify } from \"./error.js\";\nimport { customObserver, defineProperties } from \"polyscript/exports\";\n\n// will contain all valid selectors\nconst SELECTORS = [];\n\n// show the error on main and\n// stops the module from keep executing\nconst notifyAndThrow = (message) => {\n notify(message);\n throw new Error(message);\n};\n\nconst onceOnMain = ({ attributes: { worker } }) => !worker;\n\nconst bootstrapped = new WeakSet();\n\nlet addStyle = true;\n\n// this callback will be serialized as string and it never needs\n// to be invoked multiple times. Each xworker here is bootstrapped\n// only once thanks to the `sync.is_pyterminal()` check.\nconst workerReady = ({ interpreter, io, run, type }, { sync }) => {\n if (!sync.is_pyterminal()) return;\n\n // in workers it's always safe to grab the polyscript currentScript\n // the ugly `_` dance is due MicroPython not able to import via:\n // `from polyscript.currentScript import terminal as __terminal__`\n run(\n \"from polyscript import currentScript as _; __terminal__ = _.terminal; del _\",\n );\n\n let data = \"\";\n const { pyterminal_read, pyterminal_write } = sync;\n const decoder = new TextDecoder();\n const generic = {\n isatty: false,\n write(buffer) {\n data = decoder.decode(buffer);\n pyterminal_write(data);\n return buffer.length;\n },\n };\n\n // This part works already in both Pyodide and MicroPython\n io.stderr = (error) => {\n pyterminal_write(String(error.message || error));\n };\n\n // MicroPython has no code or code.interact()\n // This part patches it in a way that simulates\n // the code.interact() module in Pyodide.\n if (type === \"mpy\") {\n // monkey patch global input otherwise broken in MicroPython\n interpreter.registerJsModule(\"_pyscript_input\", {\n input: pyterminal_read,\n });\n run(\"from _pyscript_input import input\");\n\n // this is needed to avoid truncated unicode in MicroPython\n // the reason is that `linebuffer` false just send one byte\n // per time and readline here doesn't like it much.\n // MicroPython also has issues with code-points and\n // replProcessChar(byte) but that function accepts only\n // one byte per time so ... we have an issue!\n // @see https://github.com/pyscript/pyscript/pull/2018\n // @see https://github.com/WebReflection/buffer-points\n const bufferPoints = (stdio) => {\n const bytes = [];\n let needed = 0;\n return (buffer) => {\n let written = 0;\n for (const byte of buffer) {\n bytes.push(byte);\n // @see https://encoding.spec.whatwg.org/#utf-8-bytes-needed\n if (needed) needed--;\n else if (0xc2 <= byte && byte <= 0xdf) needed = 1;\n else if (0xe0 <= byte && byte <= 0xef) needed = 2;\n else if (0xf0 <= byte && byte <= 0xf4) needed = 3;\n if (!needed) {\n written += bytes.length;\n stdio(new Uint8Array(bytes.splice(0)));\n }\n }\n return written;\n };\n };\n\n io.stdout = bufferPoints(generic.write);\n\n // tiny shim of the code module with only interact\n // to bootstrap a REPL like environment\n interpreter.registerJsModule(\"code\", {\n interact() {\n let input = \"\";\n let length = 1;\n\n const encoder = new TextEncoder();\n const acc = [];\n const handlePoints = bufferPoints((buffer) => {\n acc.push(...buffer);\n pyterminal_write(decoder.decode(buffer));\n });\n\n // avoid duplicating the output produced by the input\n io.stdout = (buffer) =>\n length++ > input.length ? handlePoints(buffer) : 0;\n\n interpreter.replInit();\n\n // loop forever waiting for user inputs\n (function repl() {\n const out = decoder.decode(new Uint8Array(acc.splice(0)));\n // print in current line only the last line produced by the REPL\n const data = `${pyterminal_read(out.split(\"\\n\").at(-1))}\\r`;\n length = 0;\n input = encoder.encode(data);\n for (const c of input) interpreter.replProcessChar(c);\n repl();\n })();\n },\n });\n } else {\n interpreter.setStdout(generic);\n interpreter.setStderr(generic);\n interpreter.setStdin({\n isatty: false,\n stdin: () => pyterminal_read(data),\n });\n }\n};\n\nconst pyTerminal = async (element) => {\n // lazy load these only when a valid terminal is found\n const [{ Terminal }, { Readline }, { FitAddon }] = await Promise.all([\n import(/* webpackIgnore: true */ \"../3rd-party/xterm.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/xterm-readline.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/xterm_addon-fit.js\"),\n ]);\n\n const readline = new Readline();\n\n // common main thread initialization for both worker\n // or main case, bootstrapping the terminal on its target\n const init = (options) => {\n let target = element;\n const selector = element.getAttribute(\"target\");\n if (selector) {\n target =\n document.getElementById(selector) ||\n document.querySelector(selector);\n if (!target) throw new Error(`Unknown target ${selector}`);\n } else {\n target = document.createElement(\"py-terminal\");\n target.style.display = \"block\";\n element.after(target);\n }\n const terminal = new Terminal({\n theme: {\n background: \"#191A19\",\n foreground: \"#F5F2E7\",\n },\n ...options,\n });\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n terminal.loadAddon(readline);\n terminal.open(target);\n fitAddon.fit();\n terminal.focus();\n defineProperties(element, {\n terminal: { value: terminal },\n process: {\n value: async (code) => {\n // this loop is the only way I could find to actually simulate\n // the user input char after char in a way that works in both\n // MicroPython and Pyodide\n for (const line of code.split(/(?:\\r|\\n|\\r\\n)/)) {\n terminal.paste(`${line}\\n`);\n do {\n await new Promise((resolve) =>\n setTimeout(resolve, 0),\n );\n } while (!readline.activeRead?.resolve);\n readline.activeRead.resolve(line);\n }\n },\n },\n });\n return terminal;\n };\n\n // branch logic for the worker\n if (element.hasAttribute(\"worker\")) {\n // add a hook on the main thread to setup all sync helpers\n // also bootstrapping the XTerm target on main *BUT* ...\n hooks.main.onWorker.add(function worker(_, xworker) {\n // ... as multiple workers will add multiple callbacks\n // be sure no xworker is ever initialized twice!\n if (bootstrapped.has(xworker)) return;\n bootstrapped.add(xworker);\n\n // still cleanup this callback for future scripts/workers\n hooks.main.onWorker.delete(worker);\n\n init({\n disableStdin: false,\n cursorBlink: true,\n cursorStyle: \"block\",\n });\n\n xworker.sync.is_pyterminal = () => true;\n xworker.sync.pyterminal_read = readline.read.bind(readline);\n xworker.sync.pyterminal_write = readline.write.bind(readline);\n });\n\n // setup remote thread JS/Python code for whenever the\n // worker is ready to become a terminal\n hooks.worker.onReady.add(workerReady);\n } else {\n // in the main case, just bootstrap XTerm without\n // allowing any input as that's not possible / awkward\n hooks.main.onReady.add(function main({ interpreter, io, run, type }) {\n console.warn(\"py-terminal is read only on main thread\");\n hooks.main.onReady.delete(main);\n\n // on main, it's easy to trash and clean the current terminal\n globalThis.__py_terminal__ = init({\n disableStdin: true,\n cursorBlink: false,\n cursorStyle: \"underline\",\n });\n run(\"from js import __py_terminal__ as __terminal__\");\n delete globalThis.__py_terminal__;\n\n io.stderr = (error) => {\n readline.write(String(error.message || error));\n };\n\n if (type === \"mpy\") {\n interpreter.setStdin = Object; // as no-op\n interpreter.setStderr = Object; // as no-op\n interpreter.setStdout = ({ write }) => {\n io.stdout = write;\n };\n }\n\n let data = \"\";\n const decoder = new TextDecoder();\n const generic = {\n isatty: false,\n write(buffer) {\n data = decoder.decode(buffer);\n readline.write(data);\n return buffer.length;\n },\n };\n interpreter.setStdout(generic);\n interpreter.setStderr(generic);\n interpreter.setStdin({\n isatty: false,\n stdin: () => readline.read(data),\n });\n });\n }\n};\n\nfor (const key of TYPES.keys()) {\n const selector = `script[type=\"${key}\"][terminal],${key}-script[terminal]`;\n SELECTORS.push(selector);\n customObserver.set(selector, async (element) => {\n // we currently support only one terminal on main as in \"classic\"\n const terminals = document.querySelectorAll(SELECTORS.join(\",\"));\n if ([].filter.call(terminals, onceOnMain).length > 1)\n notifyAndThrow(\"You can use at most 1 main terminal\");\n\n // import styles lazily\n if (addStyle) {\n addStyle = false;\n document.head.append(\n Object.assign(document.createElement(\"link\"), {\n rel: \"stylesheet\",\n href: new URL(\"./xterm.css\", import.meta.url),\n }),\n );\n }\n\n await pyTerminal(element);\n });\n}\n"],"names":["SELECTORS","notifyAndThrow","message","notify","Error","onceOnMain","attributes","worker","bootstrapped","WeakSet","addStyle","workerReady","interpreter","io","run","type","sync","is_pyterminal","data","pyterminal_read","pyterminal_write","decoder","TextDecoder","generic","isatty","write","buffer","decode","length","stderr","error","String","registerJsModule","input","bufferPoints","stdio","bytes","needed","written","byte","push","Uint8Array","splice","stdout","interact","encoder","TextEncoder","acc","handlePoints","replInit","repl","out","split","at","encode","c","replProcessChar","setStdout","setStderr","setStdin","stdin","pyTerminal","async","element","Terminal","Readline","FitAddon","Promise","all","import","readline","init","options","target","selector","getAttribute","document","getElementById","querySelector","createElement","style","display","after","terminal","theme","background","foreground","fitAddon","loadAddon","open","fit","focus","defineProperties","value","process","code","line","paste","resolve","setTimeout","activeRead","hasAttribute","hooks","main","onWorker","add","_","xworker","has","delete","disableStdin","cursorBlink","cursorStyle","read","bind","onReady","console","warn","globalThis","__py_terminal__","Object","key","TYPES","keys","customObserver","set","terminals","querySelectorAll","join","filter","call","head","append","assign","rel","href","URL","url"],"mappings":"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"}
|