Files
fluent-dom-esm/dist/fluent-dom-esm.js
Eric Woodward af2e0d2eec update to v2.2.1
fix type issues with root object wrapping node or querySelector
fix incorrect import in demo
fix unused options in vite.config.js
add (some) tests - more to come!
2025-09-13 03:05:49 -04:00

162 lines
4.9 KiB
JavaScript

// @license magnet:?xt=urn:btih:723febf9f6185544f57f0660a41489c7d6b4931b&dn=wtfpl.txt
const isFluentDomObject = (value) => !!value.fluentDom;
const isHTMLElement = (value) => !!value.nodeType;
const isNumber = (value) => typeof value === "number";
const isString = (value) => typeof value === "string";
/**
* fluent-dom-esm v2.2.1
*
* Fluent DOM Manipulation, adapted to ESM and cranked up to v2.2(.1).
*
* https://git.itsericwoodward.com/eric/fluent-dom-esm
*
* v2.2.1 Copyright (c) 2025 Eric Woodward
* Original copyright (c) 2009 Tommy Montgomery (https://glacius.tmont.com/articles/fluent-dom-manipulation-in-javascript)
*
* Released under the WTFPL (Do What the Fuck You Want to Public License)
*
* @author Eric Woodward (v2 update)
* @author Tommy Montgomery (original)
* @license http://sam.zoy.org/wtfpl/
*/
const APP_VERSION = "2.2.1";
const fluentDomEsm = (function() {
const FluentDom = function(nodeOrQuerySelector) {
if (typeof nodeOrQuerySelector !== "string")
return new FluentDomInternal(nodeOrQuerySelector);
const f = new FluentDomInternal();
f.querySelector(nodeOrQuerySelector);
return f;
};
FluentDom.c = FluentDom.create = function(tagName) {
const f = new FluentDomInternal();
f.create(tagName);
return f;
};
FluentDom.v = FluentDom.version = function() {
return APP_VERSION;
};
const FluentDomInternal = function(node) {
let root = node || null;
this.fluentDom = APP_VERSION;
this.a = this.attr = function(name, value) {
if (!root || typeof name === "undefined" || typeof value === "undefined") {
throw new Error("Cannot set an attribute on a non-element");
}
root.setAttribute(name, value);
return this;
};
this.app = this.append = function(value) {
if (!root || !root?.appendChild) {
throw new Error("Cannot append to a non-element");
}
const type = typeof value;
if (type === "object") {
if (isFluentDomObject(value)) {
const domVal = value.toDom();
if (domVal !== null) root.appendChild(domVal);
} else if (isHTMLElement(value)) {
root.appendChild(value);
} else {
throw new Error(
"Invalid argument: not an HTMLElement or FluentDom object"
);
}
} else if (isNumber(value) || isString(value)) {
root.appendChild(document.createTextNode(`${value}`));
} else {
throw new Error(
`Invalid argument: not a valid type (${typeof value})`
);
}
return this;
};
this.c = this.create = function(tagName) {
root = document.createElement(tagName);
return this;
};
this.className = this.cls = function(value) {
return this.attr("class", value);
};
this.clear = function() {
root = null;
return this;
};
this.h = this.href = function(url) {
return this.attr("href", url);
};
this.html = function(content) {
if (!root) {
throw new Error(
"Cannot get or set innerHTML for a non-element"
);
}
root.innerHTML = content;
return this;
};
this.id = function(value) {
return this.attr("id", value);
};
this.l = this.listen = function(...props) {
if (!root || !root.addEventListener) {
throw new Error("Cannot addEventListener to a non-element");
}
root.addEventListener(...props);
return this;
};
this.q = this.querySelector = function(selector) {
root = document.querySelector(selector);
return this;
};
function styleFunction(prop, value) {
if (!root) {
throw new Error("Cannot get or set style for a non-element");
}
if (typeof prop === "string" && typeof value !== "undefined") {
root.style[prop] = value;
return this;
}
if (typeof prop !== "object") {
throw new Error(
`Invalid argument: "prop" must be string or object (found ${typeof prop})`
);
}
Object.keys(prop).forEach((key) => {
root.style[key] = prop[key];
});
return this;
}
this.s = this.style = styleFunction;
this.t = this.text = function(text) {
if (!root) {
throw new Error("Cannot set innerText for a non-element");
}
return this.append(text);
};
this.title = function(title) {
if (!root) {
throw new Error("Cannot get or set title for a non-element");
}
return this.attr("title", title);
};
this.toDom = this.toHTMLElement = function() {
return root;
};
this.unlisten = function(...props) {
if (!root || !root.removeEventListener) {
throw new Error("Cannot removeEventListener on a non-element");
}
root.removeEventListener(...props);
return this;
};
this.v = this.version = function() {
return APP_VERSION;
};
};
return FluentDom;
})();
export {
fluentDomEsm as default
};
// @license-end