|
import stickyModule from 'sticky-module'; |
|
import { $$ } from 'basic-devtools'; |
|
|
|
import { handle } from './script-handler.js'; |
|
import { assign } from './utils.js'; |
|
import { selectors, prefixes } from './interpreters.js'; |
|
import { CUSTOM_SELECTORS, handleCustomType } from './custom.js'; |
|
import { listener, addAllListeners } from './listeners.js'; |
|
|
|
import { customObserver as $customObserver, define as $define, whenDefined as $whenDefined } from './custom.js'; |
|
import { env as $env } from './listeners.js'; |
|
import { Hook as $Hook, XWorker as $XWorker } from './xworker.js'; |
|
|
|
|
|
const [ |
|
{ |
|
customObserver, |
|
define, |
|
whenDefined, |
|
env, |
|
Hook, |
|
XWorker |
|
}, |
|
alreadyLive |
|
] = stickyModule( |
|
'polyscript', |
|
{ |
|
customObserver: $customObserver, |
|
define: $define, |
|
whenDefined: $whenDefined, |
|
env: $env, |
|
Hook: $Hook, |
|
XWorker: $XWorker |
|
} |
|
); |
|
|
|
export { customObserver, define, whenDefined, env, Hook, XWorker }; |
|
export * from './errors.js'; |
|
|
|
|
|
if (!alreadyLive) { |
|
const mo = new MutationObserver((records) => { |
|
const selector = selectors.join(','); |
|
for (const { type, target, attributeName, addedNodes } of records) { |
|
|
|
|
|
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 (selector && node.matches(selector)) handle(node); |
|
else bootstrap(selector, node, true); |
|
} |
|
} |
|
|
|
} |
|
}); |
|
|
|
|
|
const bootstrap = (selector, node, shouldHandle) => { |
|
if (selector) $$(selector, node).forEach(handle); |
|
selector = CUSTOM_SELECTORS.join(','); |
|
if (selector) { |
|
if (shouldHandle) handleCustomType(node); |
|
$$(selector, 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)); |
|
}, |
|
}); |
|
|
|
|
|
queueMicrotask(() => { |
|
addAllListeners(observe(document)); |
|
bootstrap(selectors.join(','), document, false); |
|
}); |
|
|
|
} |
|
|