alien-dom
Version:
Next-generation JSX client renderer with observable data primitives, immediate DOM references, and more.
120 lines (116 loc) • 3.84 kB
JavaScript
import { AlienElement, AlienNodeListPrototype } from './chunk-YVHVFFPI.mjs';
import { isNumber, isUnitlessNumber, defineEffectType, getCurrentEffect, isFunction } from './chunk-JH7ONIU5.mjs';
// internal/eventEffect.ts
var createEventEffect = /* @__PURE__ */ defineEffectType(
(target, eventName, handler, options) => {
const self = getCurrentEffect();
if (self) {
const isOnce = options && typeof options != "boolean" && options.once;
const userHandler = isFunction(handler) ? handler : handler.handleEvent.bind(handler);
handler = (event) => {
if (isOnce) {
self.context?.remove(self);
}
userHandler(event);
};
}
target.addEventListener(eventName, handler, options);
return () => {
target.removeEventListener(eventName, handler, options);
};
}
);
// addons/global/element.ts
var AlienElementPrototype = new Proxy(AlienElement.prototype, {
get(target, key, receiver) {
if (typeof key == "string") {
const cachedMethod = methodCache[key];
if (cachedMethod) {
return cachedMethod;
}
if (cachedMethod === void 0) {
const styleMethod = getStyleMethod(key);
if (styleMethod) {
return styleMethod;
}
const eventType = key.match(/^one?([A-Z]\w+?)(?:Capture)?$/)?.[1];
if (eventType) {
return getEventMethod(key, eventType.toLowerCase());
}
methodCache[key] = null;
}
} else if (key != Symbol.toStringTag) {
return;
}
if (target.hasOwnProperty(key)) {
return Reflect.get(target, key);
}
const prop = Object.getOwnPropertyDescriptor(Node.prototype, key) || Object.getOwnPropertyDescriptor(EventTarget.prototype, key) || Object.getOwnPropertyDescriptor(Object.prototype, key);
if (prop && prop.get) {
return prop.get.call(receiver);
}
return Reflect.get(target, key);
}
});
var styleDeconflict = /* @__PURE__ */ reverseLookup({
border: "cssBorder",
// HTMLImageElement.border
content: "cssContent",
// HTMLMetaElement.content
filter: "cssFilter",
// AlienElement.filter()
height: "cssHeight",
// HTMLImageElement.height
transform: "cssTransform",
// SVGElement.transform
translate: "cssTranslate",
// HTMLElement.translate
width: "cssWidth"
// HTMLImageElement.width
});
var cssProperties = typeof CSS2Properties != "undefined" ? CSS2Properties.prototype : document.body.style;
function getStyleMethod(key) {
const styleKey = styleDeconflict[key] || key;
if (styleKey in cssProperties) {
return methodCache[key] = function(value) {
if (arguments.length == 0) {
return this.style[styleKey];
}
if (isNumber(value) && !isUnitlessNumber[key]) {
value += "px";
}
this.style[styleKey] = value;
return this;
};
}
}
var methodCache = {};
function getEventMethod(key, eventType) {
const once = key.startsWith("one");
const passive = eventType == "scroll";
const capture = key.endsWith("Capture");
const baseOptions = once || passive || capture ? { once, passive, capture } : void 0;
return methodCache[key] = function(callback, options) {
if (baseOptions) {
if (options) {
options = options == true ? { capture: true } : options;
options = { ...baseOptions, ...options };
} else {
options = baseOptions;
}
}
return createEventEffect(this, eventType, callback, options);
};
}
function reverseLookup(obj) {
return {
...obj,
...Object.fromEntries(
Object.entries(obj).map(([key, value]) => [value, key])
)
};
}
// global.ts
Object.setPrototypeOf(AlienElementPrototype, Node.prototype);
Object.setPrototypeOf(Element.prototype, AlienElementPrototype);
Object.assign(NodeList.prototype, AlienNodeListPrototype);