@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.
- package/README.md +33 -0
- package/cjs/custom-types.js +212 -0
- package/cjs/fetch-utils.js +12 -0
- package/cjs/index.js +73 -0
- package/cjs/interpreter/_python.js +16 -0
- package/cjs/interpreter/_utils.js +141 -0
- package/cjs/interpreter/micropython.js +34 -0
- package/cjs/interpreter/pyodide.js +38 -0
- package/cjs/interpreter/ruby-wasm-wasi.js +43 -0
- package/cjs/interpreter/wasmoon.js +40 -0
- package/cjs/interpreters.js +64 -0
- package/cjs/listeners.js +71 -0
- package/cjs/loader.js +43 -0
- package/cjs/package.json +1 -0
- package/cjs/plugins/pyscript.js +105 -0
- package/cjs/script-handler.js +141 -0
- package/cjs/toml.js +10 -0
- package/cjs/utils.js +19 -0
- package/cjs/worker/class.js +46 -0
- package/cjs/worker/hooks.js +2 -0
- package/cjs/worker/xworker.js +3 -0
- package/esm/custom-types.js +207 -0
- package/esm/fetch-utils.js +8 -0
- package/esm/index.js +68 -0
- package/esm/interpreter/_python.js +12 -0
- package/esm/interpreter/_utils.js +133 -0
- package/esm/interpreter/micropython.js +33 -0
- package/esm/interpreter/pyodide.js +37 -0
- package/esm/interpreter/ruby-wasm-wasi.js +42 -0
- package/esm/interpreter/wasmoon.js +39 -0
- package/esm/interpreters.js +58 -0
- package/esm/listeners.js +68 -0
- package/esm/loader.js +40 -0
- package/esm/script-handler.js +136 -0
- package/esm/toml.js +8 -0
- package/esm/utils.js +20 -0
- package/esm/worker/class.js +45 -0
- package/esm/worker/hooks.js +1 -0
- package/esm/worker/xworker.js +2 -0
- package/min.js +2 -0
- package/package.json +55 -0
- package/types/coincident/structured.d.ts +5 -0
- package/types/fetch-utils.d.ts +3 -0
- package/types/index.d.ts +2 -0
- package/types/loader.d.ts +2 -0
- package/types/plugins.d.ts +61 -0
- package/types/pyscript/pyscript.core/esm/custom-types.d.ts +54 -0
- package/types/pyscript/pyscript.core/esm/fetch-utils.d.ts +3 -0
- package/types/pyscript/pyscript.core/esm/index.d.ts +2 -0
- package/types/pyscript/pyscript.core/esm/interpreter/_python.d.ts +5 -0
- package/types/pyscript/pyscript.core/esm/interpreter/_utils.d.ts +11 -0
- package/types/pyscript/pyscript.core/esm/interpreter/micropython.d.ts +17 -0
- package/types/pyscript/pyscript.core/esm/interpreter/pyodide.d.ts +17 -0
- package/types/pyscript/pyscript.core/esm/interpreter/ruby-wasm-wasi.d.ts +15 -0
- package/types/pyscript/pyscript.core/esm/interpreter/ruby.d.ts +16 -0
- package/types/pyscript/pyscript.core/esm/interpreter/wasmoon.d.ts +21 -0
- package/types/pyscript/pyscript.core/esm/interpreters.d.ts +9 -0
- package/types/pyscript/pyscript.core/esm/listeners.d.ts +2 -0
- package/types/pyscript/pyscript.core/esm/loader.d.ts +2 -0
- package/types/pyscript/pyscript.core/esm/plugins.d.ts +54 -0
- package/types/pyscript/pyscript.core/esm/runtime/_python.d.ts +8 -0
- package/types/pyscript/pyscript.core/esm/runtime/_utils.d.ts +11 -0
- package/types/pyscript/pyscript.core/esm/runtime/micropython.d.ts +20 -0
- package/types/pyscript/pyscript.core/esm/runtime/pyodide.d.ts +20 -0
- package/types/pyscript/pyscript.core/esm/runtime/ruby.d.ts +15 -0
- package/types/pyscript/pyscript.core/esm/runtime/wasmoon.d.ts +21 -0
- package/types/pyscript/pyscript.core/esm/runtimes.d.ts +9 -0
- package/types/pyscript/pyscript.core/esm/script-handler.d.ts +4 -0
- package/types/pyscript/pyscript.core/esm/toml.d.ts +1 -0
- package/types/pyscript/pyscript.core/esm/utils.d.ts +23 -0
- package/types/pyscript/pyscript.core/esm/worker/class.d.ts +19 -0
- package/types/pyscript/pyscript.core/esm/worker/hooks.d.ts +2 -0
- package/types/pyscript/pyscript.core/esm/worker/xworker.d.ts +2 -0
- package/types/runtime/_python.d.ts +8 -0
- package/types/runtime/_utils.d.ts +11 -0
- package/types/runtime/micropython.d.ts +20 -0
- package/types/runtime/pyodide.d.ts +20 -0
- package/types/runtime/ruby.d.ts +15 -0
- package/types/runtime/wasmoon.d.ts +21 -0
- package/types/runtimes.d.ts +9 -0
- package/types/script-handler.d.ts +3 -0
- package/types/toml.d.ts +1 -0
- package/types/utils.d.ts +23 -0
- package/types/worker/class.d.ts +19 -0
- package/types/worker/hooks.d.ts +2 -0
- package/types/worker/xworker.d.ts +2 -0
package/esm/listeners.js
ADDED
@@ -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
|
+
}
|
package/types/index.d.ts
ADDED
@@ -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,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[]>;
|