|
'use strict'; |
|
const stickyModule = (m => m.__esModule ? m.default : m )(require('sticky-module')); |
|
const { $$ } = require('basic-devtools'); |
|
|
|
const { handle } = require('./script-handler.js'); |
|
const { assign } = require('./utils.js'); |
|
const { selectors, prefixes } = require('./interpreters.js'); |
|
const { CUSTOM_SELECTORS, handleCustomType } = require('./custom.js'); |
|
const { listener, addAllListeners } = require('./listeners.js'); |
|
|
|
const { customObserver: $customObserver, define: $define, whenDefined: $whenDefined } = require('./custom.js'); |
|
const { env: $env } = require('./listeners.js'); |
|
const { Hook: $Hook, XWorker: $XWorker } = require('./xworker.js'); |
|
|
|
|
|
const [ |
|
{ |
|
customObserver, |
|
define, |
|
whenDefined, |
|
env, |
|
Hook, |
|
XWorker |
|
}, |
|
alreadyLive |
|
] = stickyModule( |
|
'polyscript', |
|
{ |
|
customObserver: $customObserver, |
|
define: $define, |
|
whenDefined: $whenDefined, |
|
env: $env, |
|
Hook: $Hook, |
|
XWorker: $XWorker |
|
} |
|
); |
|
|
|
exports.customObserver = customObserver; |
|
exports.define = define; |
|
exports.whenDefined = whenDefined; |
|
exports.env = env; |
|
exports.Hook = Hook; |
|
exports.XWorker = XWorker; |
|
(m => Object.keys(m).map(k => k !== 'default' && (exports[k] = m[k]))) |
|
(require('./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); |
|
}); |
|
|
|
} |
|
|