|
import { ScramjetClient } from "../client";
|
|
|
|
export default function (client: ScramjetClient, _self: typeof window) {
|
|
client.Trap("Element.prototype.attributes", {
|
|
get(ctx) {
|
|
const map = ctx.get() as NamedNodeMap;
|
|
const proxy = new Proxy(map, {
|
|
get(target, prop, _receiver) {
|
|
const value = Reflect.get(target, prop);
|
|
|
|
if (prop === "length") {
|
|
return Object.keys(proxy).length;
|
|
}
|
|
|
|
if (prop === "getNamedItem") {
|
|
return (name: string) => proxy[name];
|
|
}
|
|
if (prop === "getNamedItemNS") {
|
|
return (namespace: string, name: string) =>
|
|
proxy[`${namespace}:${name}`];
|
|
}
|
|
|
|
if (prop in NamedNodeMap.prototype && typeof value === "function") {
|
|
return new Proxy(value, {
|
|
apply(target, that, args) {
|
|
if (that === proxy) {
|
|
return Reflect.apply(target, map, args);
|
|
}
|
|
|
|
return Reflect.apply(target, that, args);
|
|
},
|
|
});
|
|
}
|
|
|
|
if (
|
|
(typeof prop === "string" || typeof prop === "number") &&
|
|
!isNaN(Number(prop))
|
|
) {
|
|
const position = Object.keys(proxy)[prop];
|
|
|
|
return map[position];
|
|
}
|
|
|
|
if (!this.has(target, prop)) return undefined;
|
|
|
|
return value;
|
|
},
|
|
ownKeys(target) {
|
|
const keys = Reflect.ownKeys(target);
|
|
|
|
return keys.filter((key) => this.has(target, key));
|
|
},
|
|
has(target, prop) {
|
|
if (typeof prop === "symbol") return Reflect.has(target, prop);
|
|
if (prop.startsWith("scramjet-attr-")) return false;
|
|
if (map[prop]?.name?.startsWith("scramjet-attr-")) return false;
|
|
|
|
return Reflect.has(target, prop);
|
|
},
|
|
});
|
|
|
|
return proxy;
|
|
},
|
|
});
|
|
|
|
client.Trap("Attr.prototype.value", {
|
|
get(ctx) {
|
|
if (ctx.this?.ownerElement) {
|
|
return ctx.this.ownerElement.getAttribute(ctx.this.name);
|
|
}
|
|
|
|
return ctx.get();
|
|
},
|
|
set(ctx, value) {
|
|
if (ctx.this?.ownerElement) {
|
|
return ctx.this.ownerElement.setAttribute(ctx.this.name, value);
|
|
}
|
|
|
|
return ctx.set(value);
|
|
},
|
|
});
|
|
}
|
|
|