From be79784b2d53cbbad7233cbf717c23576e5c504c Mon Sep 17 00:00:00 2001 From: DarkWiiPlayer Date: Mon, 8 Jan 2024 13:37:36 +0100 Subject: [PATCH] Add domLense helper --- domLense.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 domLense.js diff --git a/domLense.js b/domLense.js new file mode 100644 index 0000000..66f52c6 --- /dev/null +++ b/domLense.js @@ -0,0 +1,61 @@ +const lense = (methods, extra) => { + if (extra) return lense(extra)(methods) + + const traps = { + get(target, prop) { + if (prop === "length") { + return target.children.length + } else if (prop === Symbol.iterator) { + return function*() { + for (const child of target.children) { + yield methods.get(child) + } + } + } else if (prop.match?.call(prop, /^[0-9]+$/)) { + const child = target.children[prop] + if (child) return methods.get(child) + return child + } else { + return Array.prototype[prop] + } + }, + set(target, prop, value) { + if (prop.match?.call(prop, /^[0-9]+$/)) { + const child = target.children[prop] + if (child) { + methods.set(child, value) + return true + } else if(prop == target.children.length) { + const element = methods.new(value) + target.appendChild(element) + if (methods.get(element) !== value) + methods.set(element, value) + return true + } + } else if (prop == "length") { + if (value == target.children.length) + return true + else + return false + } + }, + deleteProperty(target, prop) { + if (prop.match?.call(prop, /^[0-9]+$/)) { + const child = target.children[prop] + if (child) child.remove() + return true + } + }, + has(target, prop) { + return (prop === Symbol.iterator) || (prop in target.children) || (prop in Array.prototype) + } + } + + return element => { + const proxy = new Proxy(element, traps) + + return proxy + } +} + +export default lense