linkedom
Version:
A triple-linked lists based DOM implementation
48 lines (40 loc) • 1.16 kB
JavaScript
;
const uhyphen = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('uhyphen'));
const {setPrototypeOf} = require('../shared/object.js');
const refs = new WeakMap;
const key = name => `data-${uhyphen(name)}`;
const prop = name => name.slice(5).replace(/-([a-z])/g, (_, $1) => $1.toUpperCase());
const handler = {
get(dataset, name) {
if (name in dataset)
return refs.get(dataset).getAttribute(key(name));
},
set(dataset, name, value) {
dataset[name] = value;
refs.get(dataset).setAttribute(key(name), value);
return true;
},
deleteProperty(dataset, name) {
if (name in dataset)
refs.get(dataset).removeAttribute(key(name));
return delete dataset[name];
}
};
/**
* @implements globalThis.DOMStringMap
*/
class DOMStringMap {
/**
* @param {Element} ref
*/
constructor(ref) {
for (const {name, value} of ref.attributes) {
if (/^data-/.test(name))
this[prop(name)] = value;
}
refs.set(this, ref);
return new Proxy(this, handler);
}
}
exports.DOMStringMap = DOMStringMap
setPrototypeOf(DOMStringMap.prototype, null);