|
|
|
|
|
|
|
|
|
import { base } from './interpreter/_utils.js'; |
|
|
|
|
|
export const registry = new Map(); |
|
|
|
|
|
export const configs = new Map(); |
|
|
|
|
|
export const selectors = []; |
|
|
|
|
|
export const prefixes = []; |
|
|
|
|
|
export const interpreter = new Proxy(new Map(), { |
|
get(map, id) { |
|
if (!map.has(id)) { |
|
const [type, ...rest] = id.split('@'); |
|
const interpreter = registry.get(type); |
|
const url = /^(?:\.?\.?\/|https?:\/\/)/i.test(rest) |
|
? rest.join('@') |
|
: interpreter.module(...rest); |
|
map.set(id, { |
|
url, |
|
module: import(url), |
|
engine: interpreter.engine.bind(interpreter), |
|
}); |
|
} |
|
const { url, module, engine } = map.get(id); |
|
return (config, baseURL) => |
|
module.then((module) => { |
|
configs.set(id, config); |
|
for (const entry of ['files', 'fetch']) { |
|
const value = config?.[entry]; |
|
if (value) base.set(value, baseURL); |
|
} |
|
for (const entry of ['main', 'worker']) { |
|
const value = config?.js_modules?.[entry]; |
|
if (value) base.set(value, baseURL); |
|
} |
|
return engine(module, config, url); |
|
}); |
|
}, |
|
}); |
|
|
|
|
|
const register = (interpreter) => { |
|
for (const type of [].concat(interpreter.type)) { |
|
registry.set(type, interpreter); |
|
selectors.push(`script[type="${type}"]`); |
|
prefixes.push(`${type}-`); |
|
} |
|
}; |
|
|
|
|
|
import micropython from './interpreter/micropython.js'; |
|
import pyodide from './interpreter/pyodide.js'; |
|
import ruby_wasm_wasi from './interpreter/ruby-wasm-wasi.js'; |
|
import wasmoon from './interpreter/wasmoon.js'; |
|
import webr from './interpreter/webr.js'; |
|
for (const interpreter of [micropython, pyodide, ruby_wasm_wasi, wasmoon, webr]) |
|
register(interpreter); |
|
|