@ettrloz/object-to-dom 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ettrloz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # object-to-dom
2
+
3
+ Parse object to DOM
@@ -0,0 +1,9 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_utils = require("./utils.cjs");
3
+ const require_object_to_dom = require("./object-to-dom.cjs");
4
+ exports.assertDOMObject = require_utils.assertDOMObject;
5
+ exports.assertDOMObjectChildren = require_utils.assertDOMObjectChildren;
6
+ exports.dom = require_object_to_dom.dom;
7
+ exports.isDOMChildren = require_utils.isDOMChildren;
8
+ exports.isDOMInstance = require_utils.isDOMInstance;
9
+ exports.isDOMObject = require_utils.isDOMObject;
@@ -0,0 +1,56 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_utils = require("./utils.cjs");
3
+ //#region src/object-to-dom.ts
4
+ const createOrReturn = (element) => typeof element === "string" ? document.createElement(element) : element;
5
+ const getTagOrConstructorName = (element) => typeof element === "string" ? element : element.constructor.name;
6
+ function createChildlessDOM(obj) {
7
+ const { element: inputElement, class: className, attrs, events } = obj;
8
+ const element = createOrReturn(inputElement);
9
+ if (className) element.classList.add(className);
10
+ if (attrs) for (const name in attrs) switch (typeof attrs[name]) {
11
+ case "string":
12
+ case "number":
13
+ element.setAttribute(name, attrs[name].toString());
14
+ break;
15
+ case "boolean": if (attrs[name]) element.setAttribute(name, "");
16
+ }
17
+ if (events) for (const name in events) element.addEventListener(name, (event) => {
18
+ events[name]?.call(element, event);
19
+ });
20
+ return element;
21
+ }
22
+ function dom(...inputs) {
23
+ const elements = [];
24
+ const markers = {};
25
+ const visited = /* @__PURE__ */ new WeakSet();
26
+ function visit(obj) {
27
+ if (visited.has(obj)) throw new Error(`Object of '${getTagOrConstructorName(obj.element)} has circular dependency.`);
28
+ require_utils.assertDOMObject(obj);
29
+ visited.add(obj);
30
+ const element = createChildlessDOM(obj);
31
+ if (obj.mark && !(obj.mark in markers)) markers[obj.mark] = element;
32
+ if (Object.hasOwn(obj, "children")) obj.children.forEach((child) => {
33
+ switch (typeof child) {
34
+ case "string":
35
+ case "number":
36
+ case "boolean":
37
+ element.appendChild(document.createTextNode(child.toString()));
38
+ break;
39
+ case "object": if (child instanceof Element) element.appendChild(child);
40
+ else if (require_utils.isDOMObject(child)) element.appendChild(visit(child));
41
+ else if (require_utils.isDOMInstance(child)) for (const instanceElement of child.elements) element.appendChild(instanceElement);
42
+ }
43
+ });
44
+ visited.delete(obj);
45
+ return element;
46
+ }
47
+ for (const input of inputs) elements.push(visit(input));
48
+ return {
49
+ elements,
50
+ markers
51
+ };
52
+ }
53
+ //#endregion
54
+ exports.dom = dom;
55
+
56
+ //# sourceMappingURL=object-to-dom.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-to-dom.cjs","names":["isDOMObject","isDOMInstance"],"sources":["../../src/object-to-dom.ts"],"sourcesContent":["import type { DOMChildren, DOMInstance, DOMObject } from './types';\nimport { assertDOMObject, isDOMInstance, isDOMObject } from './utils';\n\nconst createOrReturn = (element: DOMObject['element']) =>\n typeof element === 'string' ? document.createElement(element) : element;\n\nconst getTagOrConstructorName = (element: DOMObject['element']) =>\n typeof element === 'string' ? element : element.constructor.name;\n\nfunction createChildlessDOM(obj: DOMObject) {\n const { element: inputElement, class: className, attrs, events } = obj;\n const element = createOrReturn(inputElement);\n\n if (className) {\n element.classList.add(className);\n }\n\n if (attrs) {\n for (const name in attrs) {\n switch (typeof attrs[name]) {\n case 'string':\n case 'number':\n element.setAttribute(name, attrs[name].toString());\n\n break;\n case 'boolean':\n if (attrs[name]) {\n element.setAttribute(name, '');\n }\n }\n }\n }\n\n if (events) {\n for (const name in events) {\n element.addEventListener(name, event => {\n events[name as keyof typeof events]?.call(element, event as any);\n });\n }\n }\n\n return element;\n}\n\nexport function dom<const Input extends DOMObject[]>(...inputs: Input) {\n const elements: Element[] = [];\n const markers: Record<string, Element> = {};\n\n const visited = new WeakSet<DOMObject>();\n\n function visit(obj: DOMObject) {\n if (visited.has(obj)) {\n throw new Error(\n `Object of '${getTagOrConstructorName(obj.element)} has circular dependency.`\n );\n }\n\n assertDOMObject(obj);\n visited.add(obj);\n\n const element = createChildlessDOM(obj);\n\n if (obj.mark && !(obj.mark in markers)) {\n markers[obj.mark] = element;\n }\n\n if (Object.hasOwn(obj, 'children')) {\n (obj.children as DOMChildren[]).forEach(child => {\n switch (typeof child) {\n case 'string':\n case 'number':\n case 'boolean':\n element.appendChild(document.createTextNode(child.toString()));\n\n break;\n case 'object':\n if (child instanceof Element) {\n element.appendChild(child);\n } else if (isDOMObject(child)) {\n element.appendChild(visit(child));\n } else if (isDOMInstance(child)) {\n for (const instanceElement of child.elements) {\n element.appendChild(instanceElement);\n }\n }\n }\n });\n }\n\n visited.delete(obj);\n\n return element;\n }\n\n for (const input of inputs) {\n elements.push(visit(input));\n }\n\n return {\n elements,\n markers\n } as DOMInstance<Input>;\n}\n"],"mappings":";;;AAGA,MAAM,kBAAkB,YACtB,OAAO,YAAY,WAAW,SAAS,cAAc,OAAO,IAAI;AAElE,MAAM,2BAA2B,YAC/B,OAAO,YAAY,WAAW,UAAU,QAAQ,YAAY;AAE9D,SAAS,mBAAmB,KAAgB;CAC1C,MAAM,EAAE,SAAS,cAAc,OAAO,WAAW,OAAO,WAAW;CACnE,MAAM,UAAU,eAAe,YAAY;CAE3C,IAAI,WACF,QAAQ,UAAU,IAAI,SAAS;CAGjC,IAAI,OACF,KAAK,MAAM,QAAQ,OACjB,QAAQ,OAAO,MAAM,OAArB;EACE,KAAK;EACL,KAAK;GACH,QAAQ,aAAa,MAAM,MAAM,KAAK,CAAC,SAAS,CAAC;GAEjD;EACF,KAAK,WACH,IAAI,MAAM,OACR,QAAQ,aAAa,MAAM,EAAE;CAEnC;CAIJ,IAAI,QACF,KAAK,MAAM,QAAQ,QACjB,QAAQ,iBAAiB,OAAM,UAAS;EACtC,OAAO,KAA4B,EAAE,KAAK,SAAS,KAAY;CACjE,CAAC;CAIL,OAAO;AACT;AAEA,SAAgB,IAAqC,GAAG,QAAe;CACrE,MAAM,WAAsB,CAAC;CAC7B,MAAM,UAAmC,CAAC;CAE1C,MAAM,0BAAU,IAAI,QAAmB;CAEvC,SAAS,MAAM,KAAgB;EAC7B,IAAI,QAAQ,IAAI,GAAG,GACjB,MAAM,IAAI,MACR,cAAc,wBAAwB,IAAI,OAAO,EAAE,0BACrD;EAGF,cAAA,gBAAgB,GAAG;EACnB,QAAQ,IAAI,GAAG;EAEf,MAAM,UAAU,mBAAmB,GAAG;EAEtC,IAAI,IAAI,QAAQ,EAAE,IAAI,QAAQ,UAC5B,QAAQ,IAAI,QAAQ;EAGtB,IAAI,OAAO,OAAO,KAAK,UAAU,GAC/B,IAAK,SAA2B,SAAQ,UAAS;GAC/C,QAAQ,OAAO,OAAf;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,QAAQ,YAAY,SAAS,eAAe,MAAM,SAAS,CAAC,CAAC;KAE7D;IACF,KAAK,UACH,IAAI,iBAAiB,SACnB,QAAQ,YAAY,KAAK;SACpB,IAAIA,cAAAA,YAAY,KAAK,GAC1B,QAAQ,YAAY,MAAM,KAAK,CAAC;SAC3B,IAAIC,cAAAA,cAAc,KAAK,GAC5B,KAAK,MAAM,mBAAmB,MAAM,UAClC,QAAQ,YAAY,eAAe;GAG3C;EACF,CAAC;EAGH,QAAQ,OAAO,GAAG;EAElB,OAAO;CACT;CAEA,KAAK,MAAM,SAAS,QAClB,SAAS,KAAK,MAAM,KAAK,CAAC;CAG5B,OAAO;EACL;EACA;CACF;AACF"}
File without changes
@@ -0,0 +1,53 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/utils.ts
3
+ const isPlainObject = (value) => Object.prototype.toString.call(value) === "[object Object]";
4
+ function isDOMInstance(value) {
5
+ return isPlainObject(value) && ["elements", "markers"].every((prop) => Object.hasOwn(value, prop));
6
+ }
7
+ function isDOMObject(value) {
8
+ if (!isPlainObject(value)) return false;
9
+ const keys = Object.keys(value);
10
+ return keys.length > 0 && keys.every((key) => /^(element|mark|class|attrs|events|children)$/.test(key));
11
+ }
12
+ function isDOMChildren(value) {
13
+ switch (typeof value) {
14
+ case "string":
15
+ case "number":
16
+ case "boolean": return true;
17
+ case "object": if (value instanceof Element || isDOMInstance(value) || isDOMObject(value)) return true;
18
+ }
19
+ return false;
20
+ }
21
+ /** @internal */
22
+ function assertDOMObject(obj) {
23
+ if (!isDOMObject(obj)) throw new Error("Object is not a valid DOM object.");
24
+ if (!Object.hasOwn(obj, "element")) throw new Error("Missing property 'element', expected HTML or SVG tag name or instanceof Element.");
25
+ if (Object.hasOwn(obj, "mark")) {
26
+ if (typeof obj["mark"] !== "string") throw new Error(`Property 'mark' expected to be a typeof string, but got ${typeof obj["mark"]}.`);
27
+ else if (obj["mark"].length <= 0) throw new Error("Property 'mark' must be non-empty string.");
28
+ }
29
+ if (Object.hasOwn(obj, "class") && typeof obj["class"] !== "string") throw new Error(`Property 'class' expected to be a typeof string, but got ${typeof obj["class"]}.`);
30
+ if (Object.hasOwn(obj, "attrs") && !isPlainObject(obj["attrs"])) throw new Error(`Property 'attrs' expected to be a plain object, but got ${typeof obj["attrs"]}.`);
31
+ if (Object.hasOwn(obj, "events") && !isPlainObject(obj["events"])) throw new Error(`Property 'events' expected to be a plain object, but got ${typeof obj["events"]}.`);
32
+ if (Object.hasOwn(obj, "children")) {
33
+ if (!Array.isArray(obj["children"])) throw new Error(`Property 'children' expected to be a array of DOM children, but got ${typeof obj["children"]}.`);
34
+ assertDOMObjectChildren(obj["children"], obj.element);
35
+ }
36
+ }
37
+ /** @internal */
38
+ function assertDOMObjectChildren(children, parentElement) {
39
+ children.forEach((child, index) => {
40
+ if (!isDOMChildren(child)) {
41
+ if (typeof parentElement === "string") throw new Error(`Tag '${parentElement}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`);
42
+ else throw new Error(`Element tag name '${parentElement.tagName}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`);
43
+ }
44
+ });
45
+ }
46
+ //#endregion
47
+ exports.assertDOMObject = assertDOMObject;
48
+ exports.assertDOMObjectChildren = assertDOMObjectChildren;
49
+ exports.isDOMChildren = isDOMChildren;
50
+ exports.isDOMInstance = isDOMInstance;
51
+ exports.isDOMObject = isDOMObject;
52
+
53
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import type { DOMChildren, DOMInstance, DOMObject } from './types';\n\nconst isPlainObject = (value: unknown): value is Record<PropertyKey, unknown> =>\n Object.prototype.toString.call(value) === '[object Object]';\n\nexport function isDOMInstance(value: unknown): value is DOMInstance<[]> {\n return isPlainObject(value) && ['elements', 'markers'].every(prop => Object.hasOwn(value, prop));\n}\n\nexport function isDOMObject(value: unknown): value is DOMObject {\n if (!isPlainObject(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n return (\n keys.length > 0 && keys.every(key => /^(element|mark|class|attrs|events|children)$/.test(key))\n );\n}\n\nexport function isDOMChildren(value: unknown): value is DOMChildren {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return true;\n case 'object':\n if (value instanceof Element || isDOMInstance(value) || isDOMObject(value)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** @internal */\nexport function assertDOMObject(obj: DOMObject) {\n if (!isDOMObject(obj)) {\n throw new Error('Object is not a valid DOM object.');\n }\n\n if (!Object.hasOwn(obj, 'element')) {\n throw new Error(\n \"Missing property 'element', expected HTML or SVG tag name or instanceof Element.\"\n );\n }\n\n if (Object.hasOwn(obj, 'mark')) {\n if (typeof obj['mark'] !== 'string') {\n throw new Error(\n `Property 'mark' expected to be a typeof string, but got ${typeof obj['mark']}.`\n );\n } else if (obj['mark'].length <= 0) {\n throw new Error(\"Property 'mark' must be non-empty string.\");\n }\n }\n\n if (Object.hasOwn(obj, 'class') && typeof obj['class'] !== 'string') {\n throw new Error(\n `Property 'class' expected to be a typeof string, but got ${typeof obj['class']}.`\n );\n }\n\n if (Object.hasOwn(obj, 'attrs') && !isPlainObject(obj['attrs'])) {\n throw new Error(\n `Property 'attrs' expected to be a plain object, but got ${typeof obj['attrs']}.`\n );\n }\n\n if (Object.hasOwn(obj, 'events') && !isPlainObject(obj['events'])) {\n throw new Error(\n `Property 'events' expected to be a plain object, but got ${typeof obj['events']}.`\n );\n }\n\n if (Object.hasOwn(obj, 'children')) {\n if (!Array.isArray(obj['children'])) {\n throw new Error(\n `Property 'children' expected to be a array of DOM children, but got ${typeof obj['children']}.`\n );\n }\n\n assertDOMObjectChildren(obj['children'], obj.element);\n }\n}\n\n/** @internal */\nexport function assertDOMObjectChildren(\n children: DOMChildren[],\n parentElement: DOMObject['element']\n) {\n children.forEach((child, index) => {\n if (!isDOMChildren(child)) {\n if (typeof parentElement === 'string') {\n throw new Error(\n `Tag '${parentElement}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`\n );\n } else {\n throw new Error(\n `Element tag name '${parentElement.tagName}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`\n );\n }\n }\n });\n}\n"],"mappings":";;AAEA,MAAM,iBAAiB,UACrB,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAE5C,SAAgB,cAAc,OAA0C;CACtE,OAAO,cAAc,KAAK,KAAK,CAAC,YAAY,SAAS,CAAC,CAAC,OAAM,SAAQ,OAAO,OAAO,OAAO,IAAI,CAAC;AACjG;AAEA,SAAgB,YAAY,OAAoC;CAC9D,IAAI,CAAC,cAAc,KAAK,GACtB,OAAO;CAGT,MAAM,OAAO,OAAO,KAAK,KAAK;CAE9B,OACE,KAAK,SAAS,KAAK,KAAK,OAAM,QAAO,+CAA+C,KAAK,GAAG,CAAC;AAEjG;AAEA,SAAgB,cAAc,OAAsC;CAClE,QAAQ,OAAO,OAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,WAAW,cAAc,KAAK,KAAK,YAAY,KAAK,GACvE,OAAO;CAEb;CAEA,OAAO;AACT;;AAGA,SAAgB,gBAAgB,KAAgB;CAC9C,IAAI,CAAC,YAAY,GAAG,GAClB,MAAM,IAAI,MAAM,mCAAmC;CAGrD,IAAI,CAAC,OAAO,OAAO,KAAK,SAAS,GAC/B,MAAM,IAAI,MACR,kFACF;CAGF,IAAI,OAAO,OAAO,KAAK,MAAM,GAAG;EAC9B,IAAI,OAAO,IAAI,YAAY,UACzB,MAAM,IAAI,MACR,2DAA2D,OAAO,IAAI,QAAQ,EAChF;OACK,IAAI,IAAI,OAAO,CAAC,UAAU,GAC/B,MAAM,IAAI,MAAM,2CAA2C;CAE/D;CAEA,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,IAAI,aAAa,UACzD,MAAM,IAAI,MACR,4DAA4D,OAAO,IAAI,SAAS,EAClF;CAGF,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC,cAAc,IAAI,QAAQ,GAC5D,MAAM,IAAI,MACR,2DAA2D,OAAO,IAAI,SAAS,EACjF;CAGF,IAAI,OAAO,OAAO,KAAK,QAAQ,KAAK,CAAC,cAAc,IAAI,SAAS,GAC9D,MAAM,IAAI,MACR,4DAA4D,OAAO,IAAI,UAAU,EACnF;CAGF,IAAI,OAAO,OAAO,KAAK,UAAU,GAAG;EAClC,IAAI,CAAC,MAAM,QAAQ,IAAI,WAAW,GAChC,MAAM,IAAI,MACR,uEAAuE,OAAO,IAAI,YAAY,EAChG;EAGF,wBAAwB,IAAI,aAAa,IAAI,OAAO;CACtD;AACF;;AAGA,SAAgB,wBACd,UACA,eACA;CACA,SAAS,SAAS,OAAO,UAAU;EACjC,IAAI,CAAC,cAAc,KAAK,GAAG;GACzB,IAAI,OAAO,kBAAkB,UAC3B,MAAM,IAAI,MACR,QAAQ,cAAc,kCAAkC,MAAM,8FAChE;QAEA,MAAM,IAAI,MACR,qBAAqB,cAAc,QAAQ,kCAAkC,MAAM,8FACrF;EAEJ;CACF,CAAC;AACH"}
@@ -0,0 +1,3 @@
1
+ import { assertDOMObject, assertDOMObjectChildren, isDOMChildren, isDOMInstance, isDOMObject } from "./utils.mjs";
2
+ import { dom } from "./object-to-dom.mjs";
3
+ export { assertDOMObject, assertDOMObjectChildren, dom, isDOMChildren, isDOMInstance, isDOMObject };
@@ -0,0 +1,55 @@
1
+ import { assertDOMObject, isDOMInstance, isDOMObject } from "./utils.mjs";
2
+ //#region src/object-to-dom.ts
3
+ const createOrReturn = (element) => typeof element === "string" ? document.createElement(element) : element;
4
+ const getTagOrConstructorName = (element) => typeof element === "string" ? element : element.constructor.name;
5
+ function createChildlessDOM(obj) {
6
+ const { element: inputElement, class: className, attrs, events } = obj;
7
+ const element = createOrReturn(inputElement);
8
+ if (className) element.classList.add(className);
9
+ if (attrs) for (const name in attrs) switch (typeof attrs[name]) {
10
+ case "string":
11
+ case "number":
12
+ element.setAttribute(name, attrs[name].toString());
13
+ break;
14
+ case "boolean": if (attrs[name]) element.setAttribute(name, "");
15
+ }
16
+ if (events) for (const name in events) element.addEventListener(name, (event) => {
17
+ events[name]?.call(element, event);
18
+ });
19
+ return element;
20
+ }
21
+ function dom(...inputs) {
22
+ const elements = [];
23
+ const markers = {};
24
+ const visited = /* @__PURE__ */ new WeakSet();
25
+ function visit(obj) {
26
+ if (visited.has(obj)) throw new Error(`Object of '${getTagOrConstructorName(obj.element)} has circular dependency.`);
27
+ assertDOMObject(obj);
28
+ visited.add(obj);
29
+ const element = createChildlessDOM(obj);
30
+ if (obj.mark && !(obj.mark in markers)) markers[obj.mark] = element;
31
+ if (Object.hasOwn(obj, "children")) obj.children.forEach((child) => {
32
+ switch (typeof child) {
33
+ case "string":
34
+ case "number":
35
+ case "boolean":
36
+ element.appendChild(document.createTextNode(child.toString()));
37
+ break;
38
+ case "object": if (child instanceof Element) element.appendChild(child);
39
+ else if (isDOMObject(child)) element.appendChild(visit(child));
40
+ else if (isDOMInstance(child)) for (const instanceElement of child.elements) element.appendChild(instanceElement);
41
+ }
42
+ });
43
+ visited.delete(obj);
44
+ return element;
45
+ }
46
+ for (const input of inputs) elements.push(visit(input));
47
+ return {
48
+ elements,
49
+ markers
50
+ };
51
+ }
52
+ //#endregion
53
+ export { dom };
54
+
55
+ //# sourceMappingURL=object-to-dom.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-to-dom.mjs","names":[],"sources":["../../src/object-to-dom.ts"],"sourcesContent":["import type { DOMChildren, DOMInstance, DOMObject } from './types';\nimport { assertDOMObject, isDOMInstance, isDOMObject } from './utils';\n\nconst createOrReturn = (element: DOMObject['element']) =>\n typeof element === 'string' ? document.createElement(element) : element;\n\nconst getTagOrConstructorName = (element: DOMObject['element']) =>\n typeof element === 'string' ? element : element.constructor.name;\n\nfunction createChildlessDOM(obj: DOMObject) {\n const { element: inputElement, class: className, attrs, events } = obj;\n const element = createOrReturn(inputElement);\n\n if (className) {\n element.classList.add(className);\n }\n\n if (attrs) {\n for (const name in attrs) {\n switch (typeof attrs[name]) {\n case 'string':\n case 'number':\n element.setAttribute(name, attrs[name].toString());\n\n break;\n case 'boolean':\n if (attrs[name]) {\n element.setAttribute(name, '');\n }\n }\n }\n }\n\n if (events) {\n for (const name in events) {\n element.addEventListener(name, event => {\n events[name as keyof typeof events]?.call(element, event as any);\n });\n }\n }\n\n return element;\n}\n\nexport function dom<const Input extends DOMObject[]>(...inputs: Input) {\n const elements: Element[] = [];\n const markers: Record<string, Element> = {};\n\n const visited = new WeakSet<DOMObject>();\n\n function visit(obj: DOMObject) {\n if (visited.has(obj)) {\n throw new Error(\n `Object of '${getTagOrConstructorName(obj.element)} has circular dependency.`\n );\n }\n\n assertDOMObject(obj);\n visited.add(obj);\n\n const element = createChildlessDOM(obj);\n\n if (obj.mark && !(obj.mark in markers)) {\n markers[obj.mark] = element;\n }\n\n if (Object.hasOwn(obj, 'children')) {\n (obj.children as DOMChildren[]).forEach(child => {\n switch (typeof child) {\n case 'string':\n case 'number':\n case 'boolean':\n element.appendChild(document.createTextNode(child.toString()));\n\n break;\n case 'object':\n if (child instanceof Element) {\n element.appendChild(child);\n } else if (isDOMObject(child)) {\n element.appendChild(visit(child));\n } else if (isDOMInstance(child)) {\n for (const instanceElement of child.elements) {\n element.appendChild(instanceElement);\n }\n }\n }\n });\n }\n\n visited.delete(obj);\n\n return element;\n }\n\n for (const input of inputs) {\n elements.push(visit(input));\n }\n\n return {\n elements,\n markers\n } as DOMInstance<Input>;\n}\n"],"mappings":";;AAGA,MAAM,kBAAkB,YACtB,OAAO,YAAY,WAAW,SAAS,cAAc,OAAO,IAAI;AAElE,MAAM,2BAA2B,YAC/B,OAAO,YAAY,WAAW,UAAU,QAAQ,YAAY;AAE9D,SAAS,mBAAmB,KAAgB;CAC1C,MAAM,EAAE,SAAS,cAAc,OAAO,WAAW,OAAO,WAAW;CACnE,MAAM,UAAU,eAAe,YAAY;CAE3C,IAAI,WACF,QAAQ,UAAU,IAAI,SAAS;CAGjC,IAAI,OACF,KAAK,MAAM,QAAQ,OACjB,QAAQ,OAAO,MAAM,OAArB;EACE,KAAK;EACL,KAAK;GACH,QAAQ,aAAa,MAAM,MAAM,KAAK,CAAC,SAAS,CAAC;GAEjD;EACF,KAAK,WACH,IAAI,MAAM,OACR,QAAQ,aAAa,MAAM,EAAE;CAEnC;CAIJ,IAAI,QACF,KAAK,MAAM,QAAQ,QACjB,QAAQ,iBAAiB,OAAM,UAAS;EACtC,OAAO,KAA4B,EAAE,KAAK,SAAS,KAAY;CACjE,CAAC;CAIL,OAAO;AACT;AAEA,SAAgB,IAAqC,GAAG,QAAe;CACrE,MAAM,WAAsB,CAAC;CAC7B,MAAM,UAAmC,CAAC;CAE1C,MAAM,0BAAU,IAAI,QAAmB;CAEvC,SAAS,MAAM,KAAgB;EAC7B,IAAI,QAAQ,IAAI,GAAG,GACjB,MAAM,IAAI,MACR,cAAc,wBAAwB,IAAI,OAAO,EAAE,0BACrD;EAGF,gBAAgB,GAAG;EACnB,QAAQ,IAAI,GAAG;EAEf,MAAM,UAAU,mBAAmB,GAAG;EAEtC,IAAI,IAAI,QAAQ,EAAE,IAAI,QAAQ,UAC5B,QAAQ,IAAI,QAAQ;EAGtB,IAAI,OAAO,OAAO,KAAK,UAAU,GAC/B,IAAK,SAA2B,SAAQ,UAAS;GAC/C,QAAQ,OAAO,OAAf;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,QAAQ,YAAY,SAAS,eAAe,MAAM,SAAS,CAAC,CAAC;KAE7D;IACF,KAAK,UACH,IAAI,iBAAiB,SACnB,QAAQ,YAAY,KAAK;SACpB,IAAI,YAAY,KAAK,GAC1B,QAAQ,YAAY,MAAM,KAAK,CAAC;SAC3B,IAAI,cAAc,KAAK,GAC5B,KAAK,MAAM,mBAAmB,MAAM,UAClC,QAAQ,YAAY,eAAe;GAG3C;EACF,CAAC;EAGH,QAAQ,OAAO,GAAG;EAElB,OAAO;CACT;CAEA,KAAK,MAAM,SAAS,QAClB,SAAS,KAAK,MAAM,KAAK,CAAC;CAG5B,OAAO;EACL;EACA;CACF;AACF"}
File without changes
@@ -0,0 +1,48 @@
1
+ //#region src/utils.ts
2
+ const isPlainObject = (value) => Object.prototype.toString.call(value) === "[object Object]";
3
+ function isDOMInstance(value) {
4
+ return isPlainObject(value) && ["elements", "markers"].every((prop) => Object.hasOwn(value, prop));
5
+ }
6
+ function isDOMObject(value) {
7
+ if (!isPlainObject(value)) return false;
8
+ const keys = Object.keys(value);
9
+ return keys.length > 0 && keys.every((key) => /^(element|mark|class|attrs|events|children)$/.test(key));
10
+ }
11
+ function isDOMChildren(value) {
12
+ switch (typeof value) {
13
+ case "string":
14
+ case "number":
15
+ case "boolean": return true;
16
+ case "object": if (value instanceof Element || isDOMInstance(value) || isDOMObject(value)) return true;
17
+ }
18
+ return false;
19
+ }
20
+ /** @internal */
21
+ function assertDOMObject(obj) {
22
+ if (!isDOMObject(obj)) throw new Error("Object is not a valid DOM object.");
23
+ if (!Object.hasOwn(obj, "element")) throw new Error("Missing property 'element', expected HTML or SVG tag name or instanceof Element.");
24
+ if (Object.hasOwn(obj, "mark")) {
25
+ if (typeof obj["mark"] !== "string") throw new Error(`Property 'mark' expected to be a typeof string, but got ${typeof obj["mark"]}.`);
26
+ else if (obj["mark"].length <= 0) throw new Error("Property 'mark' must be non-empty string.");
27
+ }
28
+ if (Object.hasOwn(obj, "class") && typeof obj["class"] !== "string") throw new Error(`Property 'class' expected to be a typeof string, but got ${typeof obj["class"]}.`);
29
+ if (Object.hasOwn(obj, "attrs") && !isPlainObject(obj["attrs"])) throw new Error(`Property 'attrs' expected to be a plain object, but got ${typeof obj["attrs"]}.`);
30
+ if (Object.hasOwn(obj, "events") && !isPlainObject(obj["events"])) throw new Error(`Property 'events' expected to be a plain object, but got ${typeof obj["events"]}.`);
31
+ if (Object.hasOwn(obj, "children")) {
32
+ if (!Array.isArray(obj["children"])) throw new Error(`Property 'children' expected to be a array of DOM children, but got ${typeof obj["children"]}.`);
33
+ assertDOMObjectChildren(obj["children"], obj.element);
34
+ }
35
+ }
36
+ /** @internal */
37
+ function assertDOMObjectChildren(children, parentElement) {
38
+ children.forEach((child, index) => {
39
+ if (!isDOMChildren(child)) {
40
+ if (typeof parentElement === "string") throw new Error(`Tag '${parentElement}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`);
41
+ else throw new Error(`Element tag name '${parentElement.tagName}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`);
42
+ }
43
+ });
44
+ }
45
+ //#endregion
46
+ export { assertDOMObject, assertDOMObjectChildren, isDOMChildren, isDOMInstance, isDOMObject };
47
+
48
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import type { DOMChildren, DOMInstance, DOMObject } from './types';\n\nconst isPlainObject = (value: unknown): value is Record<PropertyKey, unknown> =>\n Object.prototype.toString.call(value) === '[object Object]';\n\nexport function isDOMInstance(value: unknown): value is DOMInstance<[]> {\n return isPlainObject(value) && ['elements', 'markers'].every(prop => Object.hasOwn(value, prop));\n}\n\nexport function isDOMObject(value: unknown): value is DOMObject {\n if (!isPlainObject(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n return (\n keys.length > 0 && keys.every(key => /^(element|mark|class|attrs|events|children)$/.test(key))\n );\n}\n\nexport function isDOMChildren(value: unknown): value is DOMChildren {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return true;\n case 'object':\n if (value instanceof Element || isDOMInstance(value) || isDOMObject(value)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** @internal */\nexport function assertDOMObject(obj: DOMObject) {\n if (!isDOMObject(obj)) {\n throw new Error('Object is not a valid DOM object.');\n }\n\n if (!Object.hasOwn(obj, 'element')) {\n throw new Error(\n \"Missing property 'element', expected HTML or SVG tag name or instanceof Element.\"\n );\n }\n\n if (Object.hasOwn(obj, 'mark')) {\n if (typeof obj['mark'] !== 'string') {\n throw new Error(\n `Property 'mark' expected to be a typeof string, but got ${typeof obj['mark']}.`\n );\n } else if (obj['mark'].length <= 0) {\n throw new Error(\"Property 'mark' must be non-empty string.\");\n }\n }\n\n if (Object.hasOwn(obj, 'class') && typeof obj['class'] !== 'string') {\n throw new Error(\n `Property 'class' expected to be a typeof string, but got ${typeof obj['class']}.`\n );\n }\n\n if (Object.hasOwn(obj, 'attrs') && !isPlainObject(obj['attrs'])) {\n throw new Error(\n `Property 'attrs' expected to be a plain object, but got ${typeof obj['attrs']}.`\n );\n }\n\n if (Object.hasOwn(obj, 'events') && !isPlainObject(obj['events'])) {\n throw new Error(\n `Property 'events' expected to be a plain object, but got ${typeof obj['events']}.`\n );\n }\n\n if (Object.hasOwn(obj, 'children')) {\n if (!Array.isArray(obj['children'])) {\n throw new Error(\n `Property 'children' expected to be a array of DOM children, but got ${typeof obj['children']}.`\n );\n }\n\n assertDOMObjectChildren(obj['children'], obj.element);\n }\n}\n\n/** @internal */\nexport function assertDOMObjectChildren(\n children: DOMChildren[],\n parentElement: DOMObject['element']\n) {\n children.forEach((child, index) => {\n if (!isDOMChildren(child)) {\n if (typeof parentElement === 'string') {\n throw new Error(\n `Tag '${parentElement}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`\n );\n } else {\n throw new Error(\n `Element tag name '${parentElement.tagName}' has invalid children at index ${index}, expected to be a string, number, boolean, DOM Object, DOM Instance, or instance of Element.`\n );\n }\n }\n });\n}\n"],"mappings":";AAEA,MAAM,iBAAiB,UACrB,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAE5C,SAAgB,cAAc,OAA0C;CACtE,OAAO,cAAc,KAAK,KAAK,CAAC,YAAY,SAAS,CAAC,CAAC,OAAM,SAAQ,OAAO,OAAO,OAAO,IAAI,CAAC;AACjG;AAEA,SAAgB,YAAY,OAAoC;CAC9D,IAAI,CAAC,cAAc,KAAK,GACtB,OAAO;CAGT,MAAM,OAAO,OAAO,KAAK,KAAK;CAE9B,OACE,KAAK,SAAS,KAAK,KAAK,OAAM,QAAO,+CAA+C,KAAK,GAAG,CAAC;AAEjG;AAEA,SAAgB,cAAc,OAAsC;CAClE,QAAQ,OAAO,OAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,WAAW,cAAc,KAAK,KAAK,YAAY,KAAK,GACvE,OAAO;CAEb;CAEA,OAAO;AACT;;AAGA,SAAgB,gBAAgB,KAAgB;CAC9C,IAAI,CAAC,YAAY,GAAG,GAClB,MAAM,IAAI,MAAM,mCAAmC;CAGrD,IAAI,CAAC,OAAO,OAAO,KAAK,SAAS,GAC/B,MAAM,IAAI,MACR,kFACF;CAGF,IAAI,OAAO,OAAO,KAAK,MAAM,GAAG;EAC9B,IAAI,OAAO,IAAI,YAAY,UACzB,MAAM,IAAI,MACR,2DAA2D,OAAO,IAAI,QAAQ,EAChF;OACK,IAAI,IAAI,OAAO,CAAC,UAAU,GAC/B,MAAM,IAAI,MAAM,2CAA2C;CAE/D;CAEA,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,IAAI,aAAa,UACzD,MAAM,IAAI,MACR,4DAA4D,OAAO,IAAI,SAAS,EAClF;CAGF,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC,cAAc,IAAI,QAAQ,GAC5D,MAAM,IAAI,MACR,2DAA2D,OAAO,IAAI,SAAS,EACjF;CAGF,IAAI,OAAO,OAAO,KAAK,QAAQ,KAAK,CAAC,cAAc,IAAI,SAAS,GAC9D,MAAM,IAAI,MACR,4DAA4D,OAAO,IAAI,UAAU,EACnF;CAGF,IAAI,OAAO,OAAO,KAAK,UAAU,GAAG;EAClC,IAAI,CAAC,MAAM,QAAQ,IAAI,WAAW,GAChC,MAAM,IAAI,MACR,uEAAuE,OAAO,IAAI,YAAY,EAChG;EAGF,wBAAwB,IAAI,aAAa,IAAI,OAAO;CACtD;AACF;;AAGA,SAAgB,wBACd,UACA,eACA;CACA,SAAS,SAAS,OAAO,UAAU;EACjC,IAAI,CAAC,cAAc,KAAK,GAAG;GACzB,IAAI,OAAO,kBAAkB,UAC3B,MAAM,IAAI,MACR,QAAQ,cAAc,kCAAkC,MAAM,8FAChE;QAEA,MAAM,IAAI,MACR,qBAAqB,cAAc,QAAQ,kCAAkC,MAAM,8FACrF;EAEJ;CACF,CAAC;AACH"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@ettrloz/object-to-dom",
3
+ "version": "1.0.0",
4
+ "description": "Parse object to DOM",
5
+ "license": "MIT",
6
+ "author": "Ettrloz",
7
+ "files": [
8
+ "dist",
9
+ "types"
10
+ ],
11
+ "main": "./dist/cjs/index.cjs",
12
+ "module": "./dist/esm/index.mjs",
13
+ "types": "./types/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/esm/index.mjs",
17
+ "require": "./dist/cjs/index.cjs",
18
+ "types": "./types/index.d.ts"
19
+ }
20
+ },
21
+ "devDependencies": {
22
+ "@ettrloz/typescript-standard": "^1.0.7",
23
+ "@types/node": "^26.3.0",
24
+ "jsdom": "^30.0.1",
25
+ "npm-run-all": "^4.1.5",
26
+ "oxfmt": "^0.65.0",
27
+ "rolldown": "^1.2.5",
28
+ "tinyglobby": "^0.2.17",
29
+ "typescript": "^7.0.2",
30
+ "vitest": "^4.1.11"
31
+ },
32
+ "scripts": {
33
+ "build": "npx npm-run-all build-dist types",
34
+ "build-dist": "npx rolldown --config rolldown.config.mjs",
35
+ "types": "npx tsc --emitDeclarationOnly --declarationDir types"
36
+ }
37
+ }
@@ -0,0 +1,4 @@
1
+ export * from './object-to-dom';
2
+ export * from './utils';
3
+ export type * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AAExB,mBAAmB,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DOMInstance, DOMObject } from './types';
2
+ export declare function dom<const Input extends DOMObject[]>(...inputs: Input): DOMInstance<Input>;
3
+ //# sourceMappingURL=object-to-dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-to-dom.d.ts","sourceRoot":"","sources":["../src/object-to-dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AA4CnE,wBAAgB,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,GAyD9D,WAAW,CAAC,KAAK,CAAC,CACxB"}
@@ -0,0 +1,35 @@
1
+ type SameTagName = Extract<keyof HTMLElementTagNameMap, keyof SVGElementTagNameMap>;
2
+ export type HTMLSvgElementTagNameMap = HTMLElementTagNameMap & SVGElementTagNameMap;
3
+ export type HTMLSvgElementEventMap = HTMLElementEventMap & SVGElementEventMap;
4
+ export type ActualElement<CurrentElement extends keyof HTMLSvgElementTagNameMap | Element> = CurrentElement extends keyof HTMLSvgElementTagNameMap ? CurrentElement extends SameTagName ? HTMLElementTagNameMap[CurrentElement] | SVGElementTagNameMap[CurrentElement] : CurrentElement extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[CurrentElement] : CurrentElement extends keyof SVGElementTagNameMap ? SVGElementTagNameMap[CurrentElement] : never : CurrentElement extends Element ? CurrentElement : never;
5
+ export type DOMObject<CurrentElement extends keyof HTMLSvgElementTagNameMap | Element = keyof HTMLSvgElementTagNameMap | Element> = {
6
+ element: CurrentElement;
7
+ mark?: string;
8
+ class?: string;
9
+ attrs?: Record<string, unknown>;
10
+ events?: DOMEvent<CurrentElement>;
11
+ children?: DOMChildren[];
12
+ };
13
+ export type DOMEvent<CurrentElement extends keyof HTMLSvgElementTagNameMap | Element> = {
14
+ [EventName in keyof HTMLSvgElementEventMap]?: (this: ActualElement<CurrentElement>, ev: HTMLSvgElementEventMap[EventName]) => void;
15
+ };
16
+ export type DOMChildren = DOMObject | DOMInstance<[]> | Element | string | number | boolean;
17
+ type ToElementArray<Arr extends DOMObject[]> = Arr extends [infer Head, ...infer Tail] ? Head extends DOMObject<infer CurrentElement> ? Tail extends infer InnerDOM extends DOMObject[] ? [ActualElement<CurrentElement>, ...ToElementArray<InnerDOM>] : [ActualElement<CurrentElement>] : [] : [];
18
+ type MergeMarkers<A, B> = {
19
+ [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;
20
+ };
21
+ type ExtractDOMObjects<Children extends DOMChildren[] | undefined> = Children extends undefined ? [] : Children extends [infer First, ...infer Rest extends DOMChildren[]] ? First extends DOMObject ? [First, ...ExtractDOMObjects<Rest>] : ExtractDOMObjects<Rest> : [];
22
+ type ToRecursiveMarkersArray<Arr extends DOMObject[]> = Arr extends [
23
+ infer Head extends DOMObject,
24
+ ...infer Tail extends DOMObject[]
25
+ ] ? MergeMarkers<Head extends {
26
+ mark: string;
27
+ } ? {
28
+ [K in Head['mark']]: ActualElement<Head['element']>;
29
+ } : {}, MergeMarkers<ToRecursiveMarkersArray<ExtractDOMObjects<Head['children']>>, ToRecursiveMarkersArray<Tail>>> : {};
30
+ export type DOMInstance<Input extends DOMObject[]> = {
31
+ elements: ToElementArray<Input>;
32
+ markers: ToRecursiveMarkersArray<Input>;
33
+ };
34
+ export {};
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { DOMChildren, DOMInstance, DOMObject } from './types';
2
+ export declare function isDOMInstance(value: unknown): value is DOMInstance<[]>;
3
+ export declare function isDOMObject(value: unknown): value is DOMObject;
4
+ export declare function isDOMChildren(value: unknown): value is DOMChildren;
5
+ /** @internal */
6
+ export declare function assertDOMObject(obj: DOMObject): void;
7
+ /** @internal */
8
+ export declare function assertDOMObjectChildren(children: DOMChildren[], parentElement: DOMObject['element']): void;
9
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKnE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,EAAE,CAAC,CAEtE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAU9D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAalE;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,QAgD7C;AAED,gBAAgB;AAChB,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EAAE,EACvB,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,QAepC"}