mirror of
https://github.com/pyscript/pyscript.git
synced 2025-12-19 18:27:29 -05:00
* Remove duplicate LICENSE. * Remove un-userd pyscript.sw directory and its content. * Remove ReadTheDocs settings (unused). * Remove un-used pyproject.toml * Remove now unused CHANGELOG. Changes now tracked via release notes on GitHub. * Updated / cleaned release page template and associated GH actions. * Update prettierignore to remove un-needed refs. * Move troubleshooting into correct README. * Add reason for the index.html * Rename the "pyscript.core" directory to "core". * Update PR template because CHANGELOG is no longer used. * Codespell configuration in pyproject.toml. * Update pyscript.core -> core in .githubignore * Remove test-results/.last-run.json. This should be ignored by git. * Pin nodejs version. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
61 lines
1.9 KiB
JavaScript
61 lines
1.9 KiB
JavaScript
// PyScript py-terminal plugin
|
|
import { TYPES, relative_url } from "../core.js";
|
|
import { notify } from "./error.js";
|
|
import { customObserver } from "polyscript/exports";
|
|
|
|
// will contain all valid selectors
|
|
const SELECTORS = [];
|
|
|
|
// avoid processing same elements twice
|
|
const processed = new WeakSet();
|
|
|
|
// show the error on main and
|
|
// stops the module from keep executing
|
|
const notifyAndThrow = (message) => {
|
|
notify(message);
|
|
throw new Error(message);
|
|
};
|
|
|
|
const onceOnMain = ({ attributes: { worker } }) => !worker;
|
|
|
|
let addStyle = true;
|
|
|
|
for (const type of TYPES.keys()) {
|
|
const selector = `script[type="${type}"][terminal],${type}-script[terminal]`;
|
|
SELECTORS.push(selector);
|
|
customObserver.set(selector, async (element) => {
|
|
// we currently support only one terminal on main as in "classic"
|
|
const terminals = document.querySelectorAll(SELECTORS.join(","));
|
|
if ([].filter.call(terminals, onceOnMain).length > 1)
|
|
notifyAndThrow("You can use at most 1 main terminal");
|
|
|
|
// import styles lazily
|
|
if (addStyle) {
|
|
addStyle = false;
|
|
document.head.append(
|
|
Object.assign(document.createElement("link"), {
|
|
rel: "stylesheet",
|
|
href: relative_url("./xterm.css", import.meta.url),
|
|
}),
|
|
);
|
|
}
|
|
|
|
if (processed.has(element)) return;
|
|
processed.add(element);
|
|
|
|
const bootstrap = (module) => module.default(element);
|
|
|
|
// we can't be smart with template literals for the dynamic import
|
|
// or bundlers are incapable of producing multiple files around
|
|
if (type === "mpy") {
|
|
await import(/* webpackIgnore: true */ "./py-terminal/mpy.js").then(
|
|
bootstrap,
|
|
);
|
|
} else {
|
|
await import(/* webpackIgnore: true */ "./py-terminal/py.js").then(
|
|
bootstrap,
|
|
);
|
|
}
|
|
});
|
|
}
|