mirror of
https://github.com/pyscript/pyscript.git
synced 2025-12-19 18:27:29 -05:00
69 lines
2.3 KiB
JavaScript
69 lines
2.3 KiB
JavaScript
import { $$ } from "basic-devtools";
|
|
|
|
import xworker from "./worker/class.js";
|
|
import { handle } from "./script-handler.js";
|
|
import { assign } from "./utils.js";
|
|
import { selectors, prefixes } from "./interpreters.js";
|
|
import { CUSTOM_SELECTORS, handleCustomType } from "./custom-types.js";
|
|
import { listener, addAllListeners } from "./listeners.js";
|
|
|
|
export { define, whenDefined } from "./custom-types.js";
|
|
export const XWorker = xworker();
|
|
|
|
const INTERPRETER_SELECTORS = selectors.join(",");
|
|
|
|
const mo = new MutationObserver((records) => {
|
|
for (const { type, target, attributeName, addedNodes } of records) {
|
|
// attributes are tested via integration / e2e
|
|
/* c8 ignore next 17 */
|
|
if (type === "attributes") {
|
|
const i = attributeName.lastIndexOf("-") + 1;
|
|
if (i) {
|
|
const prefix = attributeName.slice(0, i);
|
|
for (const p of prefixes) {
|
|
if (prefix === p) {
|
|
const type = attributeName.slice(i);
|
|
if (type !== "env") {
|
|
const method = target.hasAttribute(attributeName)
|
|
? "add"
|
|
: "remove";
|
|
target[`${method}EventListener`](type, listener);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
for (const node of addedNodes) {
|
|
if (node.nodeType === 1) {
|
|
addAllListeners(node);
|
|
if (node.matches(INTERPRETER_SELECTORS)) handle(node);
|
|
else {
|
|
$$(INTERPRETER_SELECTORS, node).forEach(handle);
|
|
if (!CUSTOM_SELECTORS.length) continue;
|
|
handleCustomType(node);
|
|
$$(CUSTOM_SELECTORS.join(","), node).forEach(
|
|
handleCustomType,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
const observe = (root) => {
|
|
mo.observe(root, { childList: true, subtree: true, attributes: true });
|
|
return root;
|
|
};
|
|
|
|
const { attachShadow } = Element.prototype;
|
|
assign(Element.prototype, {
|
|
attachShadow(init) {
|
|
return observe(attachShadow.call(this, init));
|
|
},
|
|
});
|
|
|
|
addAllListeners(observe(document));
|
|
$$(INTERPRETER_SELECTORS, document).forEach(handle);
|