atomico
Version:
Atomico is a small library for the creation of interfaces based on web-components, only using functions and hooks.
54 lines (46 loc) • 1.54 kB
JavaScript
import { ELEMENT_TRUE_VALUES } from "../constants";
export function setAttr(node, attr, value) {
if (value == null) {
node.removeAttribute(attr);
} else {
node.setAttribute(
attr,
typeof value == "object" ? JSON.stringify(value) : value
);
}
}
export function formatType(value, type = String) {
try {
if (type == Boolean) {
value = ELEMENT_TRUE_VALUES.includes(value);
} else if (typeof value == "string") {
value =
type == Number
? Number(value)
: type == Object || type == Array
? JSON.parse(value)
: value;
}
if ({}.toString.call(value) == `[object ${type.name}]`) {
return { value, error: type == Number && Number.isNaN(value) };
}
} catch (e) {}
return { value, error: true };
}
export function propToAttr(prop) {
return prop.replace(/([A-Z])/g, "-$1").toLowerCase();
}
export function attrToProp(attr) {
return attr.replace(/-(\w)/g, (all, letter) => letter.toUpperCase());
}
export function dispatchEvent(node, type, customEventInit) {
node.dispatchEvent(
new CustomEvent(
type,
typeof customEventInit == "object" ? customEventInit : null
)
);
}
export function createPropError(status, message) {
return Object.assign(new Error("Failed prop\n" + message), status);
}