@algolia/autocomplete-js
Version:
Fast and fully-featured autocomplete JavaScript library.
103 lines (93 loc) • 3.04 kB
JavaScript
/* eslint-disable */
/*
* Taken from Preact
*
* See https://github.com/preactjs/preact/blob/6ab49d9020740127577bf4af66bf63f4af7f9fee/src/diff/props.js#L58-L151
*/
function setStyle(style, key, value) {
if (value === null) {
style[key] = '';
} else if (typeof value !== 'number') {
style[key] = value;
} else {
style[key] = value + 'px';
}
}
/**
* Proxy an event to hooked event handlers
*/
function eventProxy(event) {
this._listeners[event.type](event);
}
/**
* Set a property value on a DOM node
*/
export function setProperty(dom, name, value) {
var useCapture;
var nameLower;
var oldValue = dom[name];
if (name === 'style') {
if (typeof value == 'string') {
dom.style = value;
} else {
if (value === null) {
dom.style = '';
} else {
for (name in value) {
if (!oldValue || value[name] !== oldValue[name]) {
setStyle(dom.style, name, value[name]);
}
}
}
}
} // Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6
else if (name[0] === 'o' && name[1] === 'n') {
useCapture = name !== (name = name.replace(/Capture$/, ''));
nameLower = name.toLowerCase();
if (nameLower in dom) name = nameLower;
name = name.slice(2);
if (!dom._listeners) dom._listeners = {};
dom._listeners[name] = value;
if (value) {
if (!oldValue) dom.addEventListener(name, eventProxy, useCapture);
} else {
dom.removeEventListener(name, eventProxy, useCapture);
}
} else if (name !== 'list' && name !== 'tagName' && // HTMLButtonElement.form and HTMLInputElement.form are read-only but can be set using
// setAttribute
name !== 'form' && name !== 'type' && name !== 'size' && name !== 'download' && name !== 'href' && name in dom) {
dom[name] = value == null ? '' : value;
} else if (typeof value != 'function' && name !== 'dangerouslySetInnerHTML') {
if (value == null || value === false && // ARIA-attributes have a different notion of boolean values.
// The value `false` is different from the attribute not
// existing on the DOM, so we can't remove it. For non-boolean
// ARIA-attributes we could treat false as a removal, but the
// amount of exceptions would cost us too many bytes. On top of
// that other VDOM frameworks also always stringify `false`.
!/^ar/.test(name)) {
dom.removeAttribute(name);
} else {
dom.setAttribute(name, value);
}
}
}
function getNormalizedName(name) {
switch (name) {
case 'onChange':
return 'onInput';
default:
return name;
}
}
export function setProperties(dom, props) {
for (var name in props) {
setProperty(dom, getNormalizedName(name), props[name]);
}
}
export function setPropertiesWithoutEvents(dom, props) {
for (var name in props) {
if (!(name[0] === 'o' && name[1] === 'n')) {
setProperty(dom, getNormalizedName(name), props[name]);
}
}
}