@pyscript/core 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +33 -0
  2. package/cjs/custom-types.js +212 -0
  3. package/cjs/fetch-utils.js +12 -0
  4. package/cjs/index.js +73 -0
  5. package/cjs/interpreter/_python.js +16 -0
  6. package/cjs/interpreter/_utils.js +141 -0
  7. package/cjs/interpreter/micropython.js +34 -0
  8. package/cjs/interpreter/pyodide.js +38 -0
  9. package/cjs/interpreter/ruby-wasm-wasi.js +43 -0
  10. package/cjs/interpreter/wasmoon.js +40 -0
  11. package/cjs/interpreters.js +64 -0
  12. package/cjs/listeners.js +71 -0
  13. package/cjs/loader.js +43 -0
  14. package/cjs/package.json +1 -0
  15. package/cjs/plugins/pyscript.js +105 -0
  16. package/cjs/script-handler.js +141 -0
  17. package/cjs/toml.js +10 -0
  18. package/cjs/utils.js +19 -0
  19. package/cjs/worker/class.js +46 -0
  20. package/cjs/worker/hooks.js +2 -0
  21. package/cjs/worker/xworker.js +3 -0
  22. package/esm/custom-types.js +207 -0
  23. package/esm/fetch-utils.js +8 -0
  24. package/esm/index.js +68 -0
  25. package/esm/interpreter/_python.js +12 -0
  26. package/esm/interpreter/_utils.js +133 -0
  27. package/esm/interpreter/micropython.js +33 -0
  28. package/esm/interpreter/pyodide.js +37 -0
  29. package/esm/interpreter/ruby-wasm-wasi.js +42 -0
  30. package/esm/interpreter/wasmoon.js +39 -0
  31. package/esm/interpreters.js +58 -0
  32. package/esm/listeners.js +68 -0
  33. package/esm/loader.js +40 -0
  34. package/esm/script-handler.js +136 -0
  35. package/esm/toml.js +8 -0
  36. package/esm/utils.js +20 -0
  37. package/esm/worker/class.js +45 -0
  38. package/esm/worker/hooks.js +1 -0
  39. package/esm/worker/xworker.js +2 -0
  40. package/min.js +2 -0
  41. package/package.json +55 -0
  42. package/types/coincident/structured.d.ts +5 -0
  43. package/types/fetch-utils.d.ts +3 -0
  44. package/types/index.d.ts +2 -0
  45. package/types/loader.d.ts +2 -0
  46. package/types/plugins.d.ts +61 -0
  47. package/types/pyscript/pyscript.core/esm/custom-types.d.ts +54 -0
  48. package/types/pyscript/pyscript.core/esm/fetch-utils.d.ts +3 -0
  49. package/types/pyscript/pyscript.core/esm/index.d.ts +2 -0
  50. package/types/pyscript/pyscript.core/esm/interpreter/_python.d.ts +5 -0
  51. package/types/pyscript/pyscript.core/esm/interpreter/_utils.d.ts +11 -0
  52. package/types/pyscript/pyscript.core/esm/interpreter/micropython.d.ts +17 -0
  53. package/types/pyscript/pyscript.core/esm/interpreter/pyodide.d.ts +17 -0
  54. package/types/pyscript/pyscript.core/esm/interpreter/ruby-wasm-wasi.d.ts +15 -0
  55. package/types/pyscript/pyscript.core/esm/interpreter/ruby.d.ts +16 -0
  56. package/types/pyscript/pyscript.core/esm/interpreter/wasmoon.d.ts +21 -0
  57. package/types/pyscript/pyscript.core/esm/interpreters.d.ts +9 -0
  58. package/types/pyscript/pyscript.core/esm/listeners.d.ts +2 -0
  59. package/types/pyscript/pyscript.core/esm/loader.d.ts +2 -0
  60. package/types/pyscript/pyscript.core/esm/plugins.d.ts +54 -0
  61. package/types/pyscript/pyscript.core/esm/runtime/_python.d.ts +8 -0
  62. package/types/pyscript/pyscript.core/esm/runtime/_utils.d.ts +11 -0
  63. package/types/pyscript/pyscript.core/esm/runtime/micropython.d.ts +20 -0
  64. package/types/pyscript/pyscript.core/esm/runtime/pyodide.d.ts +20 -0
  65. package/types/pyscript/pyscript.core/esm/runtime/ruby.d.ts +15 -0
  66. package/types/pyscript/pyscript.core/esm/runtime/wasmoon.d.ts +21 -0
  67. package/types/pyscript/pyscript.core/esm/runtimes.d.ts +9 -0
  68. package/types/pyscript/pyscript.core/esm/script-handler.d.ts +4 -0
  69. package/types/pyscript/pyscript.core/esm/toml.d.ts +1 -0
  70. package/types/pyscript/pyscript.core/esm/utils.d.ts +23 -0
  71. package/types/pyscript/pyscript.core/esm/worker/class.d.ts +19 -0
  72. package/types/pyscript/pyscript.core/esm/worker/hooks.d.ts +2 -0
  73. package/types/pyscript/pyscript.core/esm/worker/xworker.d.ts +2 -0
  74. package/types/runtime/_python.d.ts +8 -0
  75. package/types/runtime/_utils.d.ts +11 -0
  76. package/types/runtime/micropython.d.ts +20 -0
  77. package/types/runtime/pyodide.d.ts +20 -0
  78. package/types/runtime/ruby.d.ts +15 -0
  79. package/types/runtime/wasmoon.d.ts +21 -0
  80. package/types/runtimes.d.ts +9 -0
  81. package/types/script-handler.d.ts +3 -0
  82. package/types/toml.d.ts +1 -0
  83. package/types/utils.d.ts +23 -0
  84. package/types/worker/class.d.ts +19 -0
  85. package/types/worker/hooks.d.ts +2 -0
  86. package/types/worker/xworker.d.ts +2 -0
@@ -0,0 +1,68 @@
1
+ import { $x } from "basic-devtools";
2
+
3
+ import { interpreters } from "./script-handler.js";
4
+ import { all, create, defineProperty } from "./utils.js";
5
+ import { registry, prefixes } from "./interpreters.js";
6
+
7
+ // TODO: this is ugly; need to find a better way
8
+ defineProperty(globalThis, "pyscript", {
9
+ value: {
10
+ env: new Proxy(create(null), {
11
+ get: (_, name) => awaitInterpreter(name),
12
+ }),
13
+ },
14
+ });
15
+
16
+ /* c8 ignore start */ // attributes are tested via integration / e2e
17
+ // ensure both interpreter and its queue are awaited then returns the interpreter
18
+ const awaitInterpreter = async (key) => {
19
+ if (interpreters.has(key)) {
20
+ const { interpreter, queue } = interpreters.get(key);
21
+ return (await all([interpreter, queue]))[0];
22
+ }
23
+
24
+ const available = interpreters.size
25
+ ? `Available interpreters are: ${[...interpreters.keys()]
26
+ .map((r) => `"${r}"`)
27
+ .join(", ")}.`
28
+ : `There are no interpreters in this page.`;
29
+
30
+ throw new Error(`The interpreter "${key}" was not found. ${available}`);
31
+ };
32
+
33
+ export const listener = async (event) => {
34
+ const { type, currentTarget } = event;
35
+ for (let { name, value, ownerElement: el } of $x(
36
+ `./@*[${prefixes.map((p) => `name()="${p}${type}"`).join(" or ")}]`,
37
+ currentTarget,
38
+ )) {
39
+ name = name.slice(0, -(type.length + 1));
40
+ const interpreter = await awaitInterpreter(
41
+ el.getAttribute(`${name}-env`) || name,
42
+ );
43
+ const handler = registry.get(name);
44
+ try {
45
+ handler.setGlobal(interpreter, "event", event);
46
+ handler.run(interpreter, value);
47
+ } finally {
48
+ handler.deleteGlobal(interpreter, "event");
49
+ }
50
+ }
51
+ };
52
+
53
+ /**
54
+ * Look for known prefixes and add related listeners.
55
+ * @param {Document | Element} root
56
+ */
57
+ export const addAllListeners = (root) => {
58
+ for (let { name, ownerElement: el } of $x(
59
+ `.//@*[${prefixes
60
+ .map((p) => `starts-with(name(),"${p}")`)
61
+ .join(" or ")}]`,
62
+ root,
63
+ )) {
64
+ name = name.slice(name.lastIndexOf("-") + 1);
65
+ if (name !== "env") el.addEventListener(name, listener);
66
+ }
67
+ };
68
+ /* c8 ignore stop */
package/esm/loader.js ADDED
@@ -0,0 +1,40 @@
1
+ import { interpreter } from "./interpreters.js";
2
+ import { absoluteURL, resolve } from "./utils.js";
3
+ import { parse } from "./toml.js";
4
+ import { getJSON, getText } from "./fetch-utils.js";
5
+
6
+ /**
7
+ * @param {string} id the interpreter name @ version identifier
8
+ * @param {string} [config] optional config file to parse
9
+ * @returns
10
+ */
11
+ export const getRuntime = (id, config) => {
12
+ let options = {};
13
+ if (config) {
14
+ // REQUIRES INTEGRATION TEST
15
+ /* c8 ignore start */
16
+ if (config.endsWith(".json")) {
17
+ options = fetch(config).then(getJSON);
18
+ } else if (config.endsWith(".toml")) {
19
+ options = fetch(config).then(getText).then(parse);
20
+ } else {
21
+ try {
22
+ options = JSON.parse(config);
23
+ } catch (_) {
24
+ options = parse(config);
25
+ }
26
+ // make the config a URL to be able to retrieve relative paths from it
27
+ config = absoluteURL("./config.txt");
28
+ }
29
+ /* c8 ignore stop */
30
+ }
31
+ return resolve(options).then((options) => interpreter[id](options, config));
32
+ };
33
+
34
+ /**
35
+ * @param {string} type the interpreter type
36
+ * @param {string} [version] the optional interpreter version
37
+ * @returns
38
+ */
39
+ export const getRuntimeID = (type, version = "") =>
40
+ `${type}@${version}`.replace(/@$/, "");
@@ -0,0 +1,136 @@
1
+ import { $ } from "basic-devtools";
2
+
3
+ import xworker from "./worker/class.js";
4
+ import { getRuntime, getRuntimeID } from "./loader.js";
5
+ import { registry } from "./interpreters.js";
6
+ import { all, resolve, defineProperty, absoluteURL } from "./utils.js";
7
+ import { getText } from "./fetch-utils.js";
8
+
9
+ const getRoot = (script) => {
10
+ let parent = script;
11
+ while (parent.parentNode) parent = parent.parentNode;
12
+ return parent;
13
+ };
14
+
15
+ const queryTarget = (script, idOrSelector) => {
16
+ const root = getRoot(script);
17
+ return root.getElementById(idOrSelector) || $(idOrSelector, root);
18
+ };
19
+
20
+ const targets = new WeakMap();
21
+ const targetDescriptor = {
22
+ get() {
23
+ let target = targets.get(this);
24
+ if (!target) {
25
+ target = document.createElement(`${this.type}-script`);
26
+ targets.set(this, target);
27
+ handle(this);
28
+ }
29
+ return target;
30
+ },
31
+ set(target) {
32
+ if (typeof target === "string")
33
+ targets.set(this, queryTarget(this, target));
34
+ else {
35
+ targets.set(this, target);
36
+ handle(this);
37
+ }
38
+ },
39
+ };
40
+
41
+ const handled = new WeakMap();
42
+
43
+ export const interpreters = new Map();
44
+
45
+ const execute = async (script, source, XWorker, isAsync) => {
46
+ const module = registry.get(script.type);
47
+ /* c8 ignore next */
48
+ if (module.experimental)
49
+ console.warn(`The ${script.type} interpreter is experimental`);
50
+ const [interpreter, content] = await all([
51
+ handled.get(script).interpreter,
52
+ source,
53
+ ]);
54
+ try {
55
+ // temporarily override inherited document.currentScript in a non writable way
56
+ // but it deletes it right after to preserve native behavior (as it's sync: no trouble)
57
+ defineProperty(document, "currentScript", {
58
+ configurable: true,
59
+ get: () => script,
60
+ });
61
+ module.setGlobal(interpreter, "XWorker", XWorker);
62
+ return module[isAsync ? "runAsync" : "run"](interpreter, content);
63
+ } finally {
64
+ delete document.currentScript;
65
+ module.deleteGlobal(interpreter, "XWorker");
66
+ }
67
+ };
68
+
69
+ const getValue = (ref, prefix) => {
70
+ const value = ref?.value;
71
+ return value ? prefix + value : "";
72
+ };
73
+
74
+ export const getDetails = (type, id, name, version, config) => {
75
+ if (!interpreters.has(id)) {
76
+ const details = {
77
+ interpreter: getRuntime(name, config),
78
+ queue: resolve(),
79
+ XWorker: xworker(type, version),
80
+ };
81
+ interpreters.set(id, details);
82
+ // enable sane defaults when single interpreter *of kind* is used in the page
83
+ // this allows `xxx-*` attributes to refer to such interpreter without `env` around
84
+ if (!interpreters.has(type)) interpreters.set(type, details);
85
+ }
86
+ return interpreters.get(id);
87
+ };
88
+
89
+ /**
90
+ * @param {HTMLScriptElement} script a special type of <script>
91
+ */
92
+ export const handle = async (script) => {
93
+ // known node, move its companion target after
94
+ // vDOM or other use cases where the script is a tracked element
95
+ if (handled.has(script)) {
96
+ const { target } = script;
97
+ if (target) {
98
+ // if the script is in the head just append target to the body
99
+ if (script.closest("head")) document.body.append(target);
100
+ // in any other case preserve the script position
101
+ else script.after(target);
102
+ }
103
+ }
104
+ // new script to handle ... allow newly created scripts to work
105
+ // just exactly like any other script would
106
+ else {
107
+ // allow a shared config among scripts, beside interpreter,
108
+ // and/or source code with different config or interpreter
109
+ const {
110
+ attributes: { async: isAsync, config, env, target, version },
111
+ src,
112
+ type,
113
+ } = script;
114
+ const versionValue = version?.value;
115
+ const name = getRuntimeID(type, versionValue);
116
+ const targetValue = getValue(target, "");
117
+ let configValue = getValue(config, "|");
118
+ const id = getValue(env, "") || `${name}${configValue}`;
119
+ configValue = configValue.slice(1);
120
+ if (configValue) configValue = absoluteURL(configValue);
121
+ const details = getDetails(type, id, name, versionValue, configValue);
122
+
123
+ handled.set(
124
+ defineProperty(script, "target", targetDescriptor),
125
+ details,
126
+ );
127
+
128
+ if (targetValue) targets.set(script, queryTarget(script, targetValue));
129
+
130
+ // start fetching external resources ASAP
131
+ const source = src ? fetch(src).then(getText) : script.textContent;
132
+ details.queue = details.queue.then(() =>
133
+ execute(script, source, details.XWorker, !!isAsync),
134
+ );
135
+ }
136
+ };
package/esm/toml.js ADDED
@@ -0,0 +1,8 @@
1
+ // lazy TOML parser (fast-toml might be a better alternative)
2
+ const TOML_LIB = `https://cdn.jsdelivr.net/npm/basic-toml@0.3.1/es.js`;
3
+
4
+ /**
5
+ * @param {string} text TOML text to parse
6
+ * @returns {object} the resulting JS object
7
+ */
8
+ export const parse = async (text) => (await import(TOML_LIB)).parse(text);
package/esm/utils.js ADDED
@@ -0,0 +1,20 @@
1
+ const { isArray } = Array;
2
+
3
+ const { assign, create, defineProperties, defineProperty } = Object;
4
+
5
+ const { all, resolve } = new Proxy(Promise, {
6
+ get: ($, name) => $[name].bind($),
7
+ });
8
+
9
+ const absoluteURL = (path, base = location.href) => new URL(path, base).href;
10
+
11
+ export {
12
+ isArray,
13
+ assign,
14
+ create,
15
+ defineProperties,
16
+ defineProperty,
17
+ all,
18
+ resolve,
19
+ absoluteURL,
20
+ };
@@ -0,0 +1,45 @@
1
+ import coincident from "coincident/structured";
2
+ import xworker from "./xworker.js";
3
+ import { assign, defineProperties, absoluteURL } from "../utils.js";
4
+ import { getText } from "../fetch-utils.js";
5
+ import workerHooks from "./hooks.js";
6
+
7
+ /**
8
+ * @typedef {Object} WorkerOptions custom configuration
9
+ * @prop {string} type the interpreter type to use
10
+ * @prop {string} [version] the optional interpreter version to use
11
+ * @prop {string} [config] the optional config to use within such interpreter
12
+ */
13
+
14
+ export default (...args) =>
15
+ /**
16
+ * A XWorker is a Worker facade able to bootstrap a channel with any desired interpreter.
17
+ * @param {string} url the remote file to evaluate on bootstrap
18
+ * @param {WorkerOptions} [options] optional arguments to define the interpreter to use
19
+ * @returns {Worker}
20
+ */
21
+ function XWorker(url, options) {
22
+ const hooks = workerHooks.get(XWorker);
23
+ const worker = xworker();
24
+ const { postMessage } = worker;
25
+ if (args.length) {
26
+ const [type, version] = args;
27
+ options = assign({}, options || { type, version });
28
+ if (!options.type) options.type = type;
29
+ }
30
+ if (options?.config) options.config = absoluteURL(options.config);
31
+ const bootstrap = fetch(url)
32
+ .then(getText)
33
+ .then((code) => postMessage.call(worker, { options, code, hooks }));
34
+ return defineProperties(worker, {
35
+ postMessage: {
36
+ value: (data, ...rest) =>
37
+ bootstrap.then(() =>
38
+ postMessage.call(worker, data, ...rest),
39
+ ),
40
+ },
41
+ sync: {
42
+ value: coincident(worker),
43
+ },
44
+ });
45
+ };
@@ -0,0 +1 @@
1
+ export default new WeakMap();
@@ -0,0 +1,2 @@
1
+ /* c8 ignore next */
2
+ export default () => new Worker(URL.createObjectURL(new Blob(["const e=\"object\"==typeof self?self:globalThis,t=t=>((t,r)=>{const n=(e,r)=>(t.set(r,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=r[o];switch(a){case 0:case-1:return n(i,o);case 1:{const e=n([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=n({},o);for(const[t,r]of i)e[s(t)]=s(r);return e}case 3:return n(new Date(i),o);case 4:{const{source:e,flags:t}=i;return n(new RegExp(e,t),o)}case 5:{const e=n(new Map,o);for(const[t,r]of i)e.set(s(t),s(r));return e}case 6:{const e=n(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:r}=i;return n(new e[t](r),o)}case 8:return n(BigInt(i),o);case\"BigInt\":return n(Object(BigInt(i)),o)}return n(new e[a](i),o)};return s})(new Map,t)(0),r=\"\",{toString:n}={},{keys:s}=Object,o=e=>{const t=typeof e;if(\"object\"!==t||!e)return[0,t];const s=n.call(e).slice(8,-1);switch(s){case\"Array\":return[1,r];case\"Object\":return[2,r];case\"Date\":return[3,r];case\"RegExp\":return[4,r];case\"Map\":return[5,r];case\"Set\":return[6,r]}return s.includes(\"Array\")?[1,s]:s.includes(\"Error\")?[7,s]:[2,s]},a=([e,t])=>0===e&&(\"function\"===t||\"symbol\"===t),i=(e,{json:t,lossy:r}={})=>{const n=[];return((e,t,r,n)=>{const i=(e,t)=>{const s=n.push(e)-1;return r.set(t,s),s},c=n=>{if(r.has(n))return r.get(n);let[l,u]=o(n);switch(l){case 0:{let t=n;switch(u){case\"bigint\":l=8,t=n.toString();break;case\"function\":case\"symbol\":if(e)throw new TypeError(\"unable to serialize \"+u);t=null;break;case\"undefined\":return i([-1],n)}return i([l,t],n)}case 1:{if(u)return i([u,[...n]],n);const e=[],t=i([l,e],n);for(const t of n)e.push(c(t));return t}case 2:{if(u)switch(u){case\"BigInt\":return i([u,n.toString()],n);case\"Boolean\":case\"Number\":case\"String\":return i([u,n.valueOf()],n)}if(t&&\"toJSON\"in n)return c(n.toJSON());const r=[],f=i([l,r],n);for(const t of s(n))!e&&a(o(n[t]))||r.push([c(t),c(n[t])]);return f}case 3:return i([l,n.toISOString()],n);case 4:{const{source:e,flags:t}=n;return i([l,{source:e,flags:t}],n)}case 5:{const t=[],r=i([l,t],n);for(const[r,s]of n)(e||!a(o(r))&&!a(o(s)))&&t.push([c(r),c(s)]);return r}case 6:{const t=[],r=i([l,t],n);for(const r of n)!e&&a(o(r))||t.push(c(r));return r}}const{message:f}=n;return i([l,{name:u,message:f}],n)};return c})(!(t||r),!!t,new Map,n)(e),n},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var f=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))}),p=e=>({value:new Promise((t=>{let r=new Worker(\"data:application/javascript,\"+encodeURIComponent('onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(\"ok\"))'));r.onmessage=t,r.postMessage(e)}))})\n/*! (c) Andrea Giammarchi - ISC */;const d=\"eef159e0-b39b-4e0e-b711-43432daf4928\",{Int32Array:h,Map:w,SharedArrayBuffer:y,Uint16Array:g}=globalThis,{BYTES_PER_ELEMENT:m}=h,{BYTES_PER_ELEMENT:b}=g,{isArray:v}=Array,{notify:$,wait:_,waitAsync:j}=Atomics,{fromCharCode:S}=String,A=(e,t)=>e?(j||p)(t,0):(_(t,0),{value:{then:e=>e()}}),E=new WeakSet,M=new WeakMap;let k=0;const P=(e,{parse:t,stringify:r}=JSON)=>{if(!M.has(e)){const n=(t,...r)=>e.postMessage({[d]:r},{transfer:t});M.set(e,new Proxy(new w,{get:(r,s)=>\"then\"===s?null:(...r)=>{const o=k++;let a=new y(m);const i=new h(a);let c=[];E.has(r.at(-1)||c)&&E.delete(c=r.pop()),n(c,o,a,s,r);const l=e instanceof Worker;return A(l,i).value.then((()=>{const e=i[0];if(!e)return;const r=b*e;return a=new y(r+r%m),n([],o,a),A(l,new h(a)).value.then((()=>t(S(...new g(a).slice(0,e)))))}))},set(t,n,s){if(!t.size){const n=new w;e.addEventListener(\"message\",(async({data:e})=>{const s=e?.[d];if(v(s)){const[e,o,...a]=s,i=new h(o);if(a.length){const[s,o]=a;if(!t.has(s))throw new Error(`Unsupported action: ${s}`);{const a=r(await t.get(s)(...o));a&&(n.set(e,a),i[0]=a.length)}}else{const t=n.get(e);n.delete(e);for(let e=new g(o),r=0;r<t.length;r++)e[r]=t.charCodeAt(r)}$(i,0)}}))}return!!t.set(n,s)}}))}return M.get(e)},O=e=>P(e,f);O.transfer=P.transfer=(...e)=>(E.add(e),e);const{isArray:x}=Array,{assign:R,create:B,defineProperties:F,defineProperty:T}=Object,{all:W,resolve:G}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),I=(e,t=location.href)=>new URL(e,t).href;Promise.withResolvers||(Promise.withResolvers=function(){var e,t,r=new this((function(r,n){e=r,t=n}));return{resolve:e,reject:t,promise:r}});const U=e=>e.arrayBuffer(),L=e=>e.json(),N=e=>e.text(),J=e=>e.replace(/^[^\\r\\n]+$/,(e=>e.trim())),z=new WeakMap,C=e=>{const t=e||console,r={stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const t=await e;return z.set(t,r),t}}},D=e=>{const t=e.split(\"/\");return t.pop(),t.join(\"/\")},q=(e,t)=>{const r=[];for(const n of t.split(\"/\"))r.push(n),n&&e.mkdir(r.join(\"/\"))},Y=(e,t)=>{const r=[];for(const e of t.split(\"/\"))switch(e){case\"\":case\".\":break;case\"..\":r.pop();break;default:r.push(e)}return[e.cwd()].concat(r).join(\"/\").replace(/^\\/+/,\"/\")},V=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,\"\"))).filter((e=>\"\"!==e&&\".\"!==e)).join(\"/\");return e[0].startsWith(\"/\")?`/${t}`:t},H=new WeakMap,K=(e,t,r)=>W((e=>{for(const{files:t,to_file:r,from:n=\"\"}of e){if(void 0!==t&&void 0!==r)throw new Error(\"Cannot use 'to_file' and 'files' parameters together!\");if(void 0===t&&void 0===r&&n.endsWith(\"/\"))throw new Error(`Couldn't determine the filename from the path ${n}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e=\"\",to_folder:t=\".\",to_file:r,files:n})=>{if(x(n))return n.map((r=>({url:V([e,r]),path:V([t,r])})));const s=r||e.slice(1+e.lastIndexOf(\"/\"));return[{url:e,path:V([t,s])}]}))})(r).map((({url:n,path:s})=>((e,t)=>fetch(I(t,H.get(e))))(r,n).then(U).then((r=>e.writeFile(t,s,r)))))),Q=(e,t)=>e.runPython(J(t)),X=(e,t)=>e.runPythonAsync(J(t)),Z=({FS:e},t,r)=>((e,t,r)=>{const{parentPath:n,name:s}=e.analyzePath(t,!0);return e.mkdirTree(n),e.writeFile([n,s].join(\"/\"),new Uint8Array(r),{canOwn:!0})})(e,t,r);var ee={type:\"micropython\",module:(e=\"1.20.0-239\")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r){const{stderr:n,stdout:s,get:o}=C();r=r.replace(/\\.m?js$/,\".wasm\");const a=await o(e({stderr:n,stdout:s,url:r}));return t.fetch&&await K(this,a,t.fetch),a},setGlobal(e,t,r){const n=`__pyscript_${this.type}_${t}`;globalThis[n]=r,this.run(e,`from js import ${n};${t}=${n};`)},deleteGlobal(e,t){const r=`__pyscript_${this.type}_${t}`;this.run(e,`del ${r};del ${t}`),delete globalThis[r]},run:Q,runAsync:X,writeFile:Z};var te={type:\"pyodide\",module:(e=\"0.23.2\")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,r){const{stderr:n,stdout:s,get:o}=C(),a=r.slice(0,r.lastIndexOf(\"/\")),i=await o(e({stderr:n,stdout:s,indexURL:a}));if(t.fetch&&await K(this,i,t.fetch),t.packages){await i.loadPackage(\"micropip\");const e=await i.pyimport(\"micropip\");await e.install(t.packages),e.destroy()}return i},setGlobal(e,t,r){e.globals.set(t,r)},deleteGlobal(e,t){e.globals.delete(t)},run:Q,runAsync:X,writeFile:Z};const re=\"ruby-wasm-wasi\";var ne={type:re,experimental:!0,module:(e=\"2.0.0\")=>`https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@${e}/dist/browser.esm.js`,async engine({DefaultRubyVM:e},t,r){const n=await fetch(`${r.slice(0,r.lastIndexOf(\"/\"))}/ruby.wasm`),s=await WebAssembly.compile(await n.arrayBuffer()),{vm:o}=await e(s);return t.fetch&&await K(this,o,t.fetch),o},setGlobal(e,t,r){const n=`__pyscript_ruby_wasm_wasi_${t}`;globalThis[n]=r,this.run(e,`require \"js\";$${t}=JS::eval(\"return ${n}\")`)},deleteGlobal(e,t){const r=`__pyscript_ruby_wasm_wasi_${t}`;this.run(e,`$${t}=nil`),delete globalThis[r]},run:(e,t)=>e.eval(J(t)),runAsync:(e,t)=>e.evalAsync(J(t)),writeFile:()=>{throw new Error(`writeFile is not supported in ${re}`)}};var se={type:\"wasmoon\",module:(e=\"1.15.0\")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},r){const{stderr:n,stdout:s,get:o}=C(),a=await o((new e).createEngine());return a.global.getTable(t.Base,(e=>{a.global.setField(e,\"print\",s),a.global.setField(e,\"printErr\",n)})),r.fetch&&await K(this,a,r.fetch),a},setGlobal(e,t,r){e.global.set(t,r)},deleteGlobal(e,t){e.global.set(t,void 0)},run:(e,t)=>e.doStringSync(J(t)),runAsync:(e,t)=>e.doString(J(t)),writeFile:({cmodule:{module:{FS:e}}},t,r)=>((e,t,r)=>(t=Y(e,t),q(e,D(t)),e.writeFile(t,new Uint8Array(r),{canOwn:!0})))(e,t,r)};const oe=new Map,ae=new Map,ie=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[r,...n]=t.split(\"@\"),s=oe.get(r),o=/^https?:\\/\\//i.test(n)?n.join(\"@\"):s.module(...n);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:r,module:n,engine:s}=e.get(t);return(e,o)=>n.then((n=>{ae.set(t,e);const a=e?.fetch;return a&&H.set(a,o),s(n,e,r)}))}}),ce=e=>{for(const t of[].concat(e.type))oe.set(t,e)};for(const e of[ee,te,ne,se])ce(e);const le=async e=>(await import(\"https://cdn.jsdelivr.net/npm/basic-toml@0.3.1/es.js\")).parse(e);try{new SharedArrayBuffer(4)}catch(e){throw new Error([\"Unable to use SharedArrayBuffer due insecure environment.\",\"Please read requirements in MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements\"].join(\"\\n\"))}let ue,fe,pe;const de=(e,t)=>{addEventListener(e,t||(async t=>{await ue,pe=t,fe(`xworker.on${e}(xworker.event);`,he)}),!!t&&{once:!0})},he={sync:O(self),onerror(){},onmessage(){},onmessageerror(){},postMessage:postMessage.bind(self),get event(){const e=pe;if(!e)throw new Error(\"Unauthorized event access\");return pe=void 0,e}};de(\"message\",(({data:{options:e,code:t,hooks:r}})=>{ue=(async()=>{const{type:n,version:s,config:o,async:a}=e,i=await((e,t)=>{let r={};if(t)if(t.endsWith(\".json\"))r=fetch(t).then(L);else if(t.endsWith(\".toml\"))r=fetch(t).then(N).then(le);else{try{r=JSON.parse(t)}catch(e){r=le(t)}t=I(\"./config.txt\")}return G(r).then((r=>ie[e](r,t)))})(((e,t=\"\")=>`${e}@${t}`.replace(/@$/,\"\"))(n,s),o),c=B(oe.get(n)),l=\"run\"+(a?\"Async\":\"\");if(r){const{beforeRun:e,beforeRunAsync:t,afterRun:n,afterRunAsync:s}=r,o=n||s,a=e||t;if(o){const e=c[l].bind(c);c[l]=(t,r)=>e(t,`${r}\\n${o}`)}if(a){const e=c[l].bind(c);c[l]=(t,r)=>e(t,`${a}\\n${r}`)}}return c.setGlobal(i,\"xworker\",he),fe=c[l].bind(c,i),fe(t),i})(),de(\"error\"),de(\"message\"),de(\"messageerror\")}));\n"],{type:'application/javascript'})),{type:'module'});
package/min.js ADDED
@@ -0,0 +1,2 @@
1
+ const e=(e,t=document)=>[...t.querySelectorAll(e)],t=(e,t=document)=>{const r=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),n=[];for(let e=0,{snapshotLength:t}=r;e<t;e++)n.push(r.snapshotItem(e));return n},r="object"==typeof self?self:globalThis,n=e=>((e,t)=>{const n=(t,r)=>(e.set(r,t),t),s=o=>{if(e.has(o))return e.get(o);const[a,i]=t[o];switch(a){case 0:case-1:return n(i,o);case 1:{const e=n([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=n({},o);for(const[t,r]of i)e[s(t)]=s(r);return e}case 3:return n(new Date(i),o);case 4:{const{source:e,flags:t}=i;return n(new RegExp(e,t),o)}case 5:{const e=n(new Map,o);for(const[t,r]of i)e.set(s(t),s(r));return e}case 6:{const e=n(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:e,message:t}=i;return n(new r[e](t),o)}case 8:return n(BigInt(i),o);case"BigInt":return n(Object(BigInt(i)),o)}return n(new r[a](i),o)};return s})(new Map,e)(0),s="",{toString:o}={},{keys:a}=Object,i=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const r=o.call(e).slice(8,-1);switch(r){case"Array":return[1,s];case"Object":return[2,s];case"Date":return[3,s];case"RegExp":return[4,s];case"Map":return[5,s];case"Set":return[6,s]}return r.includes("Array")?[1,r]:r.includes("Error")?[7,r]:[2,r]},c=([e,t])=>0===e&&("function"===t||"symbol"===t),l=(e,{json:t,lossy:r}={})=>{const n=[];return((e,t,r,n)=>{const s=(e,t)=>{const s=n.push(e)-1;return r.set(t,s),s},o=n=>{if(r.has(n))return r.get(n);let[l,u]=i(n);switch(l){case 0:{let t=n;switch(u){case"bigint":l=8,t=n.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);t=null;break;case"undefined":return s([-1],n)}return s([l,t],n)}case 1:{if(u)return s([u,[...n]],n);const e=[],t=s([l,e],n);for(const t of n)e.push(o(t));return t}case 2:{if(u)switch(u){case"BigInt":return s([u,n.toString()],n);case"Boolean":case"Number":case"String":return s([u,n.valueOf()],n)}if(t&&"toJSON"in n)return o(n.toJSON());const r=[],p=s([l,r],n);for(const t of a(n))!e&&c(i(n[t]))||r.push([o(t),o(n[t])]);return p}case 3:return s([l,n.toISOString()],n);case 4:{const{source:e,flags:t}=n;return s([l,{source:e,flags:t}],n)}case 5:{const t=[],r=s([l,t],n);for(const[r,s]of n)(e||!c(i(r))&&!c(i(s)))&&t.push([o(r),o(s)]);return r}case 6:{const t=[],r=s([l,t],n);for(const r of n)!e&&c(i(r))||t.push(o(r));return r}}const{message:p}=n;return s([l,{name:u,message:p}],n)};return o})(!(t||r),!!t,new Map,n)(e),n},{parse:u,stringify:p}=JSON,f={json:!0,lossy:!0};var d=Object.freeze({__proto__:null,parse:e=>n(u(e)),stringify:e=>p(l(e,f))}),h=e=>({value:new Promise((t=>{let r=new Worker("data:application/javascript,"+encodeURIComponent('onmessage=({data:b})=>(Atomics.wait(b,0),postMessage("ok"))'));r.onmessage=t,r.postMessage(e)}))})
2
+ /*! (c) Andrea Giammarchi - ISC */;const w="eef159e0-b39b-4e0e-b711-43432daf4928",{Int32Array:y,Map:g,SharedArrayBuffer:m,Uint16Array:b}=globalThis,{BYTES_PER_ELEMENT:v}=y,{BYTES_PER_ELEMENT:$}=b,{isArray:_}=Array,{notify:j,wait:A,waitAsync:E}=Atomics,{fromCharCode:S}=String,k=(e,t)=>e?(E||h)(t,0):(A(t,0),{value:{then:e=>e()}}),M=new WeakSet,P=new WeakMap;let R=0;const O=(e,{parse:t,stringify:r}=JSON)=>{if(!P.has(e)){const n=(t,...r)=>e.postMessage({[w]:r},{transfer:t});P.set(e,new Proxy(new g,{get:(r,s)=>"then"===s?null:(...r)=>{const o=R++;let a=new m(v);const i=new y(a);let c=[];M.has(r.at(-1)||c)&&M.delete(c=r.pop()),n(c,o,a,s,r);const l=e instanceof Worker;return k(l,i).value.then((()=>{const e=i[0];if(!e)return;const r=$*e;return a=new m(r+r%v),n([],o,a),k(l,new y(a)).value.then((()=>t(S(...new b(a).slice(0,e)))))}))},set(t,n,s){if(!t.size){const n=new g;e.addEventListener("message",(async({data:e})=>{const s=e?.[w];if(_(s)){const[e,o,...a]=s,i=new y(o);if(a.length){const[s,o]=a;if(!t.has(s))throw new Error(`Unsupported action: ${s}`);{const a=r(await t.get(s)(...o));a&&(n.set(e,a),i[0]=a.length)}}else{const t=n.get(e);n.delete(e);for(let e=new b(o),r=0;r<t.length;r++)e[r]=t.charCodeAt(r)}j(i,0)}}))}return!!t.set(n,s)}}))}return P.get(e)},W=e=>O(e,d);W.transfer=O.transfer=(...e)=>(M.add(e),e);const{isArray:x}=Array,{assign:T,create:B,defineProperties:I,defineProperty:F}=Object,{all:G,resolve:L}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),N=(e,t=location.href)=>new URL(e,t).href,U=e=>e.arrayBuffer(),J=e=>e.json(),C=e=>e.text();var z=new WeakMap,q=(...e)=>function t(r,n){const s=z.get(t),o=new Worker(URL.createObjectURL(new Blob(['const e="object"==typeof self?self:globalThis,t=t=>((t,r)=>{const n=(e,r)=>(t.set(r,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=r[o];switch(a){case 0:case-1:return n(i,o);case 1:{const e=n([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=n({},o);for(const[t,r]of i)e[s(t)]=s(r);return e}case 3:return n(new Date(i),o);case 4:{const{source:e,flags:t}=i;return n(new RegExp(e,t),o)}case 5:{const e=n(new Map,o);for(const[t,r]of i)e.set(s(t),s(r));return e}case 6:{const e=n(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:r}=i;return n(new e[t](r),o)}case 8:return n(BigInt(i),o);case"BigInt":return n(Object(BigInt(i)),o)}return n(new e[a](i),o)};return s})(new Map,t)(0),r="",{toString:n}={},{keys:s}=Object,o=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const s=n.call(e).slice(8,-1);switch(s){case"Array":return[1,r];case"Object":return[2,r];case"Date":return[3,r];case"RegExp":return[4,r];case"Map":return[5,r];case"Set":return[6,r]}return s.includes("Array")?[1,s]:s.includes("Error")?[7,s]:[2,s]},a=([e,t])=>0===e&&("function"===t||"symbol"===t),i=(e,{json:t,lossy:r}={})=>{const n=[];return((e,t,r,n)=>{const i=(e,t)=>{const s=n.push(e)-1;return r.set(t,s),s},c=n=>{if(r.has(n))return r.get(n);let[l,u]=o(n);switch(l){case 0:{let t=n;switch(u){case"bigint":l=8,t=n.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);t=null;break;case"undefined":return i([-1],n)}return i([l,t],n)}case 1:{if(u)return i([u,[...n]],n);const e=[],t=i([l,e],n);for(const t of n)e.push(c(t));return t}case 2:{if(u)switch(u){case"BigInt":return i([u,n.toString()],n);case"Boolean":case"Number":case"String":return i([u,n.valueOf()],n)}if(t&&"toJSON"in n)return c(n.toJSON());const r=[],f=i([l,r],n);for(const t of s(n))!e&&a(o(n[t]))||r.push([c(t),c(n[t])]);return f}case 3:return i([l,n.toISOString()],n);case 4:{const{source:e,flags:t}=n;return i([l,{source:e,flags:t}],n)}case 5:{const t=[],r=i([l,t],n);for(const[r,s]of n)(e||!a(o(r))&&!a(o(s)))&&t.push([c(r),c(s)]);return r}case 6:{const t=[],r=i([l,t],n);for(const r of n)!e&&a(o(r))||t.push(c(r));return r}}const{message:f}=n;return i([l,{name:u,message:f}],n)};return c})(!(t||r),!!t,new Map,n)(e),n},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var f=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))}),p=e=>({value:new Promise((t=>{let r=new Worker("data:application/javascript,"+encodeURIComponent(\'onmessage=({data:b})=>(Atomics.wait(b,0),postMessage("ok"))\'));r.onmessage=t,r.postMessage(e)}))})\n/*! (c) Andrea Giammarchi - ISC */;const d="eef159e0-b39b-4e0e-b711-43432daf4928",{Int32Array:h,Map:w,SharedArrayBuffer:y,Uint16Array:g}=globalThis,{BYTES_PER_ELEMENT:m}=h,{BYTES_PER_ELEMENT:b}=g,{isArray:v}=Array,{notify:$,wait:_,waitAsync:j}=Atomics,{fromCharCode:S}=String,A=(e,t)=>e?(j||p)(t,0):(_(t,0),{value:{then:e=>e()}}),E=new WeakSet,M=new WeakMap;let k=0;const P=(e,{parse:t,stringify:r}=JSON)=>{if(!M.has(e)){const n=(t,...r)=>e.postMessage({[d]:r},{transfer:t});M.set(e,new Proxy(new w,{get:(r,s)=>"then"===s?null:(...r)=>{const o=k++;let a=new y(m);const i=new h(a);let c=[];E.has(r.at(-1)||c)&&E.delete(c=r.pop()),n(c,o,a,s,r);const l=e instanceof Worker;return A(l,i).value.then((()=>{const e=i[0];if(!e)return;const r=b*e;return a=new y(r+r%m),n([],o,a),A(l,new h(a)).value.then((()=>t(S(...new g(a).slice(0,e)))))}))},set(t,n,s){if(!t.size){const n=new w;e.addEventListener("message",(async({data:e})=>{const s=e?.[d];if(v(s)){const[e,o,...a]=s,i=new h(o);if(a.length){const[s,o]=a;if(!t.has(s))throw new Error(`Unsupported action: ${s}`);{const a=r(await t.get(s)(...o));a&&(n.set(e,a),i[0]=a.length)}}else{const t=n.get(e);n.delete(e);for(let e=new g(o),r=0;r<t.length;r++)e[r]=t.charCodeAt(r)}$(i,0)}}))}return!!t.set(n,s)}}))}return M.get(e)},O=e=>P(e,f);O.transfer=P.transfer=(...e)=>(E.add(e),e);const{isArray:x}=Array,{assign:R,create:B,defineProperties:F,defineProperty:T}=Object,{all:W,resolve:G}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),I=(e,t=location.href)=>new URL(e,t).href;Promise.withResolvers||(Promise.withResolvers=function(){var e,t,r=new this((function(r,n){e=r,t=n}));return{resolve:e,reject:t,promise:r}});const U=e=>e.arrayBuffer(),L=e=>e.json(),N=e=>e.text(),J=e=>e.replace(/^[^\\r\\n]+$/,(e=>e.trim())),z=new WeakMap,C=e=>{const t=e||console,r={stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const t=await e;return z.set(t,r),t}}},D=e=>{const t=e.split("/");return t.pop(),t.join("/")},q=(e,t)=>{const r=[];for(const n of t.split("/"))r.push(n),n&&e.mkdir(r.join("/"))},Y=(e,t)=>{const r=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":r.pop();break;default:r.push(e)}return[e.cwd()].concat(r).join("/").replace(/^\\/+/,"/")},V=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},H=new WeakMap,K=(e,t,r)=>W((e=>{for(const{files:t,to_file:r,from:n=""}of e){if(void 0!==t&&void 0!==r)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===r&&n.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${n}, please supply \'to_file\' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:r,files:n})=>{if(x(n))return n.map((r=>({url:V([e,r]),path:V([t,r])})));const s=r||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:V([t,s])}]}))})(r).map((({url:n,path:s})=>((e,t)=>fetch(I(t,H.get(e))))(r,n).then(U).then((r=>e.writeFile(t,s,r)))))),Q=(e,t)=>e.runPython(J(t)),X=(e,t)=>e.runPythonAsync(J(t)),Z=({FS:e},t,r)=>((e,t,r)=>{const{parentPath:n,name:s}=e.analyzePath(t,!0);return e.mkdirTree(n),e.writeFile([n,s].join("/"),new Uint8Array(r),{canOwn:!0})})(e,t,r);var ee={type:"micropython",module:(e="1.20.0-239")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r){const{stderr:n,stdout:s,get:o}=C();r=r.replace(/\\.m?js$/,".wasm");const a=await o(e({stderr:n,stdout:s,url:r}));return t.fetch&&await K(this,a,t.fetch),a},setGlobal(e,t,r){const n=`__pyscript_${this.type}_${t}`;globalThis[n]=r,this.run(e,`from js import ${n};${t}=${n};`)},deleteGlobal(e,t){const r=`__pyscript_${this.type}_${t}`;this.run(e,`del ${r};del ${t}`),delete globalThis[r]},run:Q,runAsync:X,writeFile:Z};var te={type:"pyodide",module:(e="0.23.2")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,r){const{stderr:n,stdout:s,get:o}=C(),a=r.slice(0,r.lastIndexOf("/")),i=await o(e({stderr:n,stdout:s,indexURL:a}));if(t.fetch&&await K(this,i,t.fetch),t.packages){await i.loadPackage("micropip");const e=await i.pyimport("micropip");await e.install(t.packages),e.destroy()}return i},setGlobal(e,t,r){e.globals.set(t,r)},deleteGlobal(e,t){e.globals.delete(t)},run:Q,runAsync:X,writeFile:Z};const re="ruby-wasm-wasi";var ne={type:re,experimental:!0,module:(e="2.0.0")=>`https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@${e}/dist/browser.esm.js`,async engine({DefaultRubyVM:e},t,r){const n=await fetch(`${r.slice(0,r.lastIndexOf("/"))}/ruby.wasm`),s=await WebAssembly.compile(await n.arrayBuffer()),{vm:o}=await e(s);return t.fetch&&await K(this,o,t.fetch),o},setGlobal(e,t,r){const n=`__pyscript_ruby_wasm_wasi_${t}`;globalThis[n]=r,this.run(e,`require "js";$${t}=JS::eval("return ${n}")`)},deleteGlobal(e,t){const r=`__pyscript_ruby_wasm_wasi_${t}`;this.run(e,`$${t}=nil`),delete globalThis[r]},run:(e,t)=>e.eval(J(t)),runAsync:(e,t)=>e.evalAsync(J(t)),writeFile:()=>{throw new Error(`writeFile is not supported in ${re}`)}};var se={type:"wasmoon",module:(e="1.15.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},r){const{stderr:n,stdout:s,get:o}=C(),a=await o((new e).createEngine());return a.global.getTable(t.Base,(e=>{a.global.setField(e,"print",s),a.global.setField(e,"printErr",n)})),r.fetch&&await K(this,a,r.fetch),a},setGlobal(e,t,r){e.global.set(t,r)},deleteGlobal(e,t){e.global.set(t,void 0)},run:(e,t)=>e.doStringSync(J(t)),runAsync:(e,t)=>e.doString(J(t)),writeFile:({cmodule:{module:{FS:e}}},t,r)=>((e,t,r)=>(t=Y(e,t),q(e,D(t)),e.writeFile(t,new Uint8Array(r),{canOwn:!0})))(e,t,r)};const oe=new Map,ae=new Map,ie=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[r,...n]=t.split("@"),s=oe.get(r),o=/^https?:\\/\\//i.test(n)?n.join("@"):s.module(...n);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:r,module:n,engine:s}=e.get(t);return(e,o)=>n.then((n=>{ae.set(t,e);const a=e?.fetch;return a&&H.set(a,o),s(n,e,r)}))}}),ce=e=>{for(const t of[].concat(e.type))oe.set(t,e)};for(const e of[ee,te,ne,se])ce(e);const le=async e=>(await import("https://cdn.jsdelivr.net/npm/basic-toml@0.3.1/es.js")).parse(e);try{new SharedArrayBuffer(4)}catch(e){throw new Error(["Unable to use SharedArrayBuffer due insecure environment.","Please read requirements in MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements"].join("\\n"))}let ue,fe,pe;const de=(e,t)=>{addEventListener(e,t||(async t=>{await ue,pe=t,fe(`xworker.on${e}(xworker.event);`,he)}),!!t&&{once:!0})},he={sync:O(self),onerror(){},onmessage(){},onmessageerror(){},postMessage:postMessage.bind(self),get event(){const e=pe;if(!e)throw new Error("Unauthorized event access");return pe=void 0,e}};de("message",(({data:{options:e,code:t,hooks:r}})=>{ue=(async()=>{const{type:n,version:s,config:o,async:a}=e,i=await((e,t)=>{let r={};if(t)if(t.endsWith(".json"))r=fetch(t).then(L);else if(t.endsWith(".toml"))r=fetch(t).then(N).then(le);else{try{r=JSON.parse(t)}catch(e){r=le(t)}t=I("./config.txt")}return G(r).then((r=>ie[e](r,t)))})(((e,t="")=>`${e}@${t}`.replace(/@$/,""))(n,s),o),c=B(oe.get(n)),l="run"+(a?"Async":"");if(r){const{beforeRun:e,beforeRunAsync:t,afterRun:n,afterRunAsync:s}=r,o=n||s,a=e||t;if(o){const e=c[l].bind(c);c[l]=(t,r)=>e(t,`${r}\\n${o}`)}if(a){const e=c[l].bind(c);c[l]=(t,r)=>e(t,`${a}\\n${r}`)}}return c.setGlobal(i,"xworker",he),fe=c[l].bind(c,i),fe(t),i})(),de("error"),de("message"),de("messageerror")}));\n'],{type:"application/javascript"})),{type:"module"}),{postMessage:a}=o;if(e.length){const[t,r]=e;(n=T({},n||{type:t,version:r})).type||(n.type=t)}n?.config&&(n.config=N(n.config));const i=fetch(r).then(C).then((e=>a.call(o,{options:n,code:e,hooks:s})));return I(o,{postMessage:{value:(e,...t)=>i.then((()=>a.call(o,e,...t)))},sync:{value:W(o)}})};Promise.withResolvers||(Promise.withResolvers=function(){var e,t,r=new this((function(r,n){e=r,t=n}));return{resolve:e,reject:t,promise:r}});const D=e=>e.replace(/^[^\r\n]+$/,(e=>e.trim())),X=new WeakMap,Y=e=>{const t=e||console,r={stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const t=await e;return X.set(t,r),t}}},V=e=>{const t=e.split("/");return t.pop(),t.join("/")},K=(e,t)=>{const r=[];for(const n of t.split("/"))r.push(n),n&&e.mkdir(r.join("/"))},H=(e,t)=>{const r=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":r.pop();break;default:r.push(e)}return[e.cwd()].concat(r).join("/").replace(/^\/+/,"/")},Q=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},Z=new WeakMap,ee=(e,t,r)=>G((e=>{for(const{files:t,to_file:r,from:n=""}of e){if(void 0!==t&&void 0!==r)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===r&&n.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${n}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:r,files:n})=>{if(x(n))return n.map((r=>({url:Q([e,r]),path:Q([t,r])})));const s=r||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Q([t,s])}]}))})(r).map((({url:n,path:s})=>((e,t)=>fetch(N(t,Z.get(e))))(r,n).then(U).then((r=>e.writeFile(t,s,r)))))),te=(e,t)=>e.runPython(D(t)),re=(e,t)=>e.runPythonAsync(D(t)),ne=({FS:e},t,r)=>((e,t,r)=>{const{parentPath:n,name:s}=e.analyzePath(t,!0);return e.mkdirTree(n),e.writeFile([n,s].join("/"),new Uint8Array(r),{canOwn:!0})})(e,t,r);var se={type:"micropython",module:(e="1.20.0-239")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r){const{stderr:n,stdout:s,get:o}=Y();r=r.replace(/\.m?js$/,".wasm");const a=await o(e({stderr:n,stdout:s,url:r}));return t.fetch&&await ee(this,a,t.fetch),a},setGlobal(e,t,r){const n=`__pyscript_${this.type}_${t}`;globalThis[n]=r,this.run(e,`from js import ${n};${t}=${n};`)},deleteGlobal(e,t){const r=`__pyscript_${this.type}_${t}`;this.run(e,`del ${r};del ${t}`),delete globalThis[r]},run:te,runAsync:re,writeFile:ne};var oe={type:"pyodide",module:(e="0.23.2")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,r){const{stderr:n,stdout:s,get:o}=Y(),a=r.slice(0,r.lastIndexOf("/")),i=await o(e({stderr:n,stdout:s,indexURL:a}));if(t.fetch&&await ee(this,i,t.fetch),t.packages){await i.loadPackage("micropip");const e=await i.pyimport("micropip");await e.install(t.packages),e.destroy()}return i},setGlobal(e,t,r){e.globals.set(t,r)},deleteGlobal(e,t){e.globals.delete(t)},run:te,runAsync:re,writeFile:ne};const ae="ruby-wasm-wasi";var ie={type:ae,experimental:!0,module:(e="2.0.0")=>`https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@${e}/dist/browser.esm.js`,async engine({DefaultRubyVM:e},t,r){const n=await fetch(`${r.slice(0,r.lastIndexOf("/"))}/ruby.wasm`),s=await WebAssembly.compile(await n.arrayBuffer()),{vm:o}=await e(s);return t.fetch&&await ee(this,o,t.fetch),o},setGlobal(e,t,r){const n=`__pyscript_ruby_wasm_wasi_${t}`;globalThis[n]=r,this.run(e,`require "js";$${t}=JS::eval("return ${n}")`)},deleteGlobal(e,t){const r=`__pyscript_ruby_wasm_wasi_${t}`;this.run(e,`$${t}=nil`),delete globalThis[r]},run:(e,t)=>e.eval(D(t)),runAsync:(e,t)=>e.evalAsync(D(t)),writeFile:()=>{throw new Error(`writeFile is not supported in ${ae}`)}};var ce={type:"wasmoon",module:(e="1.15.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},r){const{stderr:n,stdout:s,get:o}=Y(),a=await o((new e).createEngine());return a.global.getTable(t.Base,(e=>{a.global.setField(e,"print",s),a.global.setField(e,"printErr",n)})),r.fetch&&await ee(this,a,r.fetch),a},setGlobal(e,t,r){e.global.set(t,r)},deleteGlobal(e,t){e.global.set(t,void 0)},run:(e,t)=>e.doStringSync(D(t)),runAsync:(e,t)=>e.doString(D(t)),writeFile:({cmodule:{module:{FS:e}}},t,r)=>((e,t,r)=>(t=H(e,t),K(e,V(t)),e.writeFile(t,new Uint8Array(r),{canOwn:!0})))(e,t,r)};const le=new Map,ue=new Map,pe=[],fe=[],de=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[r,...n]=t.split("@"),s=le.get(r),o=/^https?:\/\//i.test(n)?n.join("@"):s.module(...n);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:r,module:n,engine:s}=e.get(t);return(e,o)=>n.then((n=>{ue.set(t,e);const a=e?.fetch;return a&&Z.set(a,o),s(n,e,r)}))}}),he=e=>{for(const t of[].concat(e.type))le.set(t,e),pe.push(`script[type="${t}"]`),fe.push(`${t}-`)};for(const e of[se,oe,ie,ce])he(e);const we=async e=>(await import("https://cdn.jsdelivr.net/npm/basic-toml@0.3.1/es.js")).parse(e),ye=(e,t)=>{let r={};if(t)if(t.endsWith(".json"))r=fetch(t).then(J);else if(t.endsWith(".toml"))r=fetch(t).then(C).then(we);else{try{r=JSON.parse(t)}catch(e){r=we(t)}t=N("./config.txt")}return L(r).then((r=>de[e](r,t)))},ge=(e,t="")=>`${e}@${t}`.replace(/@$/,""),me=(e,t)=>{const r=(e=>{let t=e;for(;t.parentNode;)t=t.parentNode;return t})(e);return r.getElementById(t)||((e,t=document)=>t.querySelector(e))(t,r)},be=new WeakMap,ve={get(){let e=be.get(this);return e||(e=document.createElement(`${this.type}-script`),be.set(this,e),Ee(this)),e},set(e){"string"==typeof e?be.set(this,me(this,e)):(be.set(this,e),Ee(this))}},$e=new WeakMap,_e=new Map,je=(e,t)=>{const r=e?.value;return r?t+r:""},Ae=(e,t,r,n,s)=>{if(!_e.has(t)){const o={interpreter:ye(r,s),queue:L(),XWorker:q(e,n)};_e.set(t,o),_e.has(e)||_e.set(e,o)}return _e.get(t)},Ee=async e=>{if($e.has(e)){const{target:t}=e;t&&(e.closest("head")?document.body.append(t):e.after(t))}else{const{attributes:{async:t,config:r,env:n,target:s,version:o},src:a,type:i}=e,c=o?.value,l=ge(i,c),u=je(s,"");let p=je(r,"|");const f=je(n,"")||`${l}${p}`;p=p.slice(1),p&&(p=N(p));const d=Ae(i,f,l,c,p);$e.set(F(e,"target",ve),d),u&&be.set(e,me(e,u));const h=a?fetch(a).then(C):e.textContent;d.queue=d.queue.then((()=>(async(e,t,r,n)=>{const s=le.get(e.type);s.experimental&&console.warn(`The ${e.type} interpreter is experimental`);const[o,a]=await G([$e.get(e).interpreter,t]);try{return F(document,"currentScript",{configurable:!0,get:()=>e}),s.setGlobal(o,"XWorker",r),s[n?"runAsync":"run"](o,a)}finally{delete document.currentScript,s.deleteGlobal(o,"XWorker")}})(e,h,d.XWorker,!!t)))}};F(globalThis,"pyscript",{value:{env:new Proxy(B(null),{get:(e,t)=>Se(t)})}});const Se=async e=>{if(_e.has(e)){const{interpreter:t,queue:r}=_e.get(e);return(await G([t,r]))[0]}const t=_e.size?`Available interpreters are: ${[..._e.keys()].map((e=>`"${e}"`)).join(", ")}.`:"There are no interpreters in this page.";throw new Error(`The interpreter "${e}" was not found. ${t}`)},ke=async e=>{const{type:r,currentTarget:n}=e;for(let{name:s,value:o,ownerElement:a}of t(`./@*[${fe.map((e=>`name()="${e}${r}"`)).join(" or ")}]`,n)){s=s.slice(0,-(r.length+1));const t=await Se(a.getAttribute(`${s}-env`)||s),n=le.get(s);try{n.setGlobal(t,"event",e),n.run(t,o)}finally{n.deleteGlobal(t,"event")}}},Me=e=>{for(let{name:r,ownerElement:n}of t(`.//@*[${fe.map((e=>`starts-with(name(),"${e}")`)).join(" or ")}]`,e))r=r.slice(r.lastIndexOf("-")+1),"env"!==r&&n.addEventListener(r,ke)},Pe=[],Re=new Map,Oe=new Map,We=new Map,xe=e=>{for(const t of Pe)if(e.matches(t)){const r=Oe.get(t),{resolve:n}=We.get(r),{options:s,known:o}=Te.get(r);if(!o.has(e)){o.add(e);const{interpreter:t,version:a,config:i,env:c,onRuntimeReady:l}=s,u=ge(t,a),p=c||`${u}${i?`|${i}`:""}`,{interpreter:f,XWorker:d}=Ae(t,p,u,a,i);f.then((o=>{if(!Re.has(p)){const a=B(le.get(t)),{onBeforeRun:i,onBeforeRunAsync:c,onAfterRun:l,onAfterRunAsync:f,codeBeforeRunWorker:h,codeBeforeRunWorkerAsync:w,codeAfterRunWorker:y,codeAfterRunWorkerAsync:g}=s;for(const[t,[r,n]]of[["run",[i,l]]]){const s=a[t];a[t]=function(t,o){r&&r.call(this,m,e);const a=s.call(this,t,o);return n&&n.call(this,m,e),a}}for(const[t,[r,n]]of[["runAsync",[c,f]]]){const s=a[t];a[t]=async function(t,o){r&&await r.call(this,m,e);const a=await s.call(this,t,o);return n&&await n.call(this,m,e),a}}z.set(d,{beforeRun:h,beforeRunAsync:w,afterRun:y,afterRunAsync:g}),a.setGlobal(o,"XWorker",d);const m={type:r,interpreter:o,XWorker:d,io:X.get(o),config:structuredClone(ue.get(u)),run:a.run.bind(a,o),runAsync:a.runAsync.bind(a,o)};Re.set(p,m),n(m)}l?.(Re.get(p),e)}))}}},Te=new Map,Be=(t,r)=>{if(le.has(t)||Te.has(t))throw new Error(`<script type="${t}"> already registered`);if(!le.has(r?.interpreter))throw new Error("Unspecified interpreter");le.set(t,le.get(r?.interpreter)),Ie(t);const n=[`script[type="${t}"]`,`${t}-script`];for(const e of n)Oe.set(e,t);Pe.push(...n),fe.push(`${t}-`),Te.set(t,{options:T({env:t},r),known:new WeakSet}),Me(document),e(n.join(",")).forEach(xe)},Ie=e=>(We.has(e)||We.set(e,Promise.withResolvers()),We.get(e).promise),Fe=q(),Ge=pe.join(","),Le=new MutationObserver((t=>{for(const{type:r,target:n,attributeName:s,addedNodes:o}of t)if("attributes"!==r){for(const t of o)if(1===t.nodeType)if(Me(t),t.matches(Ge))Ee(t);else{if(e(Ge,t).forEach(Ee),!Pe.length)continue;xe(t),e(Pe.join(","),t).forEach(xe)}}else{const e=s.lastIndexOf("-")+1;if(e){const t=s.slice(0,e);for(const r of fe)if(t===r){const t=s.slice(e);if("env"!==t){const e=n.hasAttribute(s)?"add":"remove";n[`${e}EventListener`](t,ke)}break}}}})),Ne=e=>(Le.observe(e,{childList:!0,subtree:!0,attributes:!0}),e),{attachShadow:Ue}=Element.prototype;T(Element.prototype,{attachShadow(e){return Ne(Ue.call(this,e))}}),Me(Ne(document)),e(Ge,document).forEach(Ee);export{Fe as XWorker,Be as define,Ie as whenDefined};
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@pyscript/core",
3
+ "version": "0.0.0",
4
+ "description": "The next version of PyScript core",
5
+ "main": "./cjs/index.js",
6
+ "types": "./types/index.d.ts",
7
+ "scripts": {
8
+ "server": "npx static-handler --cors --coep --coop --corp .",
9
+ "build": "npm run rollup:xworker && npm run rollup:min && eslint esm/ && npm run ts && npm run cjs && npm run test",
10
+ "cjs": "ascjs --no-default esm cjs",
11
+ "rollup:min": "rollup --config rollup/min.config.js",
12
+ "rollup:xworker": "rollup --config rollup/xworker.config.js",
13
+ "test": "c8 --100 node --experimental-loader @node-loader/import-maps test/index.js ",
14
+ "test:html": "npm run test && c8 report -r html",
15
+ "coverage": "mkdir -p ./coverage; c8 report --reporter=text-lcov > ./coverage/lcov.info",
16
+ "size": "npm run size:module && npm run size:worker",
17
+ "size:module": "echo module is $(cat min.js | brotli | wc -c) bytes once compressed",
18
+ "size:worker": "echo worker is $(cat esm/worker/xworker.js | brotli | wc -c) bytes once compressed",
19
+ "ts": "tsc -p ."
20
+ },
21
+ "keywords": [],
22
+ "author": "Anaconda Inc.",
23
+ "license": "MIT",
24
+ "devDependencies": {
25
+ "@node-loader/import-maps": "^1.1.0",
26
+ "@rollup/plugin-node-resolve": "^15.1.0",
27
+ "@rollup/plugin-terser": "^0.4.3",
28
+ "ascjs": "^5.0.1",
29
+ "c8": "^8.0.0",
30
+ "eslint": "^8.42.0",
31
+ "linkedom": "^0.14.26",
32
+ "rollup": "^3.25.1",
33
+ "static-handler": "^0.4.1",
34
+ "typescript": "^5.1.3"
35
+ },
36
+ "module": "./esm/index.js",
37
+ "type": "module",
38
+ "exports": {
39
+ ".": {
40
+ "types": "./types/esm/index.d.ts",
41
+ "import": "./esm/index.js",
42
+ "default": "./cjs/index.js"
43
+ },
44
+ "./package.json": "./package.json"
45
+ },
46
+ "unpkg": "min.js",
47
+ "dependencies": {
48
+ "@ungap/with-resolvers": "^0.1.0",
49
+ "basic-devtools": "^0.1.6",
50
+ "coincident": "^0.4.1"
51
+ },
52
+ "worker": {
53
+ "blob": "sha256-obDch1OaxOZKhaCpSW9vEAHJk01N+9kYvSiGkNmeJRU="
54
+ }
55
+ }
@@ -0,0 +1,5 @@
1
+ export { k as default };
2
+ declare function k(e: any): any;
3
+ declare namespace k {
4
+ function transfer(...e: any[]): any[];
5
+ }
@@ -0,0 +1,3 @@
1
+ export function getBuffer(response: Response): Promise<ArrayBuffer>;
2
+ export function getJSON(response: Response): Promise<any>;
3
+ export function getText(response: Response): Promise<string>;
@@ -0,0 +1,2 @@
1
+ export { registerPlugin } from "./plugins.js";
2
+ export const XWorker: (url: string, options?: import("./worker/class.js").WorkerOptions) => Worker;
@@ -0,0 +1,2 @@
1
+ export function getRuntime(id: string, config?: string): Promise<any>;
2
+ export function getRuntimeID(type: string, version?: string): string;
@@ -0,0 +1,61 @@
1
+ export const PLUGINS_SELECTORS: any[];
2
+ export function handlePlugin(node: Element): void;
3
+ export function registerPlugin(name: string, options: PluginOptions): void;
4
+ /**
5
+ * plugin configuration
6
+ */
7
+ export type Runtime = {
8
+ /**
9
+ * the runtime type
10
+ */
11
+ type: string;
12
+ /**
13
+ * the bootstrapped runtime
14
+ */
15
+ runtime: object;
16
+ /**
17
+ * an XWorker constructor that defaults to same runtime on the Worker.
18
+ */
19
+ XWorker: (url: string, options?: object) => Worker;
20
+ /**
21
+ * a cloned config used to bootstrap the runtime
22
+ */
23
+ config: object;
24
+ /**
25
+ * an utility to run code within the runtime
26
+ */
27
+ run: (code: string) => any;
28
+ /**
29
+ * an utility to run code asynchronously within the runtime
30
+ */
31
+ runAsync: (code: string) => Promise<any>;
32
+ /**
33
+ * an utility to write a file in the virtual FS, if available
34
+ */
35
+ writeFile: (path: string, data: ArrayBuffer) => void;
36
+ };
37
+ /**
38
+ * plugin configuration
39
+ */
40
+ export type PluginOptions = {
41
+ /**
42
+ * the runtime/interpreter type to receive
43
+ */
44
+ type: string;
45
+ /**
46
+ * the optional runtime version to use
47
+ */
48
+ version?: string;
49
+ /**
50
+ * the optional config to use within such runtime
51
+ */
52
+ config?: string;
53
+ /**
54
+ * the optional environment to use
55
+ */
56
+ env?: string;
57
+ /**
58
+ * the callback that will be invoked once
59
+ */
60
+ onRuntimeReady: (node: Element, runtime: Runtime) => void;
61
+ };
@@ -0,0 +1,54 @@
1
+ export const CUSTOM_SELECTORS: any[];
2
+ export function handleCustomType(node: Element): void;
3
+ export function define(type: string, options: PluginOptions): void;
4
+ export function whenDefined(type: string): Promise<object>;
5
+ /**
6
+ * custom configuration
7
+ */
8
+ export type Runtime = {
9
+ /**
10
+ * the bootstrapped interpreter
11
+ */
12
+ interpreter: object;
13
+ /**
14
+ * an XWorker constructor that defaults to same interpreter on the Worker.
15
+ */
16
+ XWorker: (url: string, options?: object) => Worker;
17
+ /**
18
+ * a cloned config used to bootstrap the interpreter
19
+ */
20
+ config: object;
21
+ /**
22
+ * an utility to run code within the interpreter
23
+ */
24
+ run: (code: string) => any;
25
+ /**
26
+ * an utility to run code asynchronously within the interpreter
27
+ */
28
+ runAsync: (code: string) => Promise<any>;
29
+ /**
30
+ * an utility to write a file in the virtual FS, if available
31
+ */
32
+ writeFile: (path: string, data: ArrayBuffer) => void;
33
+ };
34
+ /**
35
+ * custom configuration
36
+ */
37
+ export type PluginOptions = {
38
+ /**
39
+ * the interpreter to use
40
+ */
41
+ interpreter: 'pyodide' | 'micropython' | 'wasmoon' | 'ruby-wasm-wasi';
42
+ /**
43
+ * the optional interpreter version to use
44
+ */
45
+ version?: string;
46
+ /**
47
+ * the optional config to use within such interpreter
48
+ */
49
+ config?: string;
50
+ /**
51
+ * the callback that will be invoked once
52
+ */
53
+ onRuntimeReady?: (environment: object, node: Element) => void;
54
+ };
@@ -0,0 +1,3 @@
1
+ export function getBuffer(response: Response): Promise<ArrayBuffer>;
2
+ export function getJSON(response: Response): Promise<any>;
3
+ export function getText(response: Response): Promise<string>;
@@ -0,0 +1,2 @@
1
+ export const XWorker: (url: string, options?: import("./worker/class.js").WorkerOptions) => Worker;
2
+ export { define, whenDefined } from "./custom-types.js";
@@ -0,0 +1,5 @@
1
+ export function run(interpreter: any, code: any): any;
2
+ export function runAsync(interpreter: any, code: any): any;
3
+ export function writeFile({ FS }: {
4
+ FS: any;
5
+ }, path: any, buffer: any): any;
@@ -0,0 +1,11 @@
1
+ export function clean(code: string): string;
2
+ export const io: WeakMap<object, any>;
3
+ export function stdio(init: any): {
4
+ stderr: (...args: any[]) => any;
5
+ stdout: (...args: any[]) => any;
6
+ get(engine: any): Promise<any>;
7
+ };
8
+ export function writeFile(FS: any, path: any, buffer: any): any;
9
+ export function writeFileShim(FS: any, path: any, buffer: any): any;
10
+ export const base: WeakMap<object, any>;
11
+ export function fetchPaths(module: any, interpreter: any, config_fetch: any): Promise<any[]>;