uraniyum 1.3.4 → 1.3.6
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/dist/globalTags.d.ts +8 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +33 -3
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
- package/src/globalTags.ts +17 -0
- package/src/index.ts +2 -0
- package/src/tags.ts +42 -4
package/dist/index.d.ts
CHANGED
package/dist/index.esm.js
CHANGED
|
@@ -49,10 +49,15 @@ function derive(fn) {
|
|
|
49
49
|
return effect;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/* ---------------------------------- */
|
|
53
|
+
/* Utilities */
|
|
54
|
+
/* ---------------------------------- */
|
|
52
55
|
function isState(x) {
|
|
53
56
|
return x && typeof x === "object" && "subs" in x && "val" in x;
|
|
54
57
|
}
|
|
55
|
-
|
|
58
|
+
/* ---------------------------------- */
|
|
59
|
+
/* Attribute detection */
|
|
60
|
+
/* ---------------------------------- */
|
|
56
61
|
function isAttrs(x) {
|
|
57
62
|
return (x &&
|
|
58
63
|
typeof x === "object" &&
|
|
@@ -61,18 +66,32 @@ function isAttrs(x) {
|
|
|
61
66
|
typeof x !== "function" &&
|
|
62
67
|
!Array.isArray(x));
|
|
63
68
|
}
|
|
69
|
+
/* ---------------------------------- */
|
|
70
|
+
/* Tags proxy */
|
|
71
|
+
/* ---------------------------------- */
|
|
64
72
|
const tags = new Proxy({}, {
|
|
65
73
|
get(_, tag) {
|
|
66
74
|
return (attrsOrChild, ...children) => {
|
|
67
75
|
const el = document.createElement(tag);
|
|
68
|
-
|
|
76
|
+
/* ------------------------------ */
|
|
77
|
+
/* Attributes */
|
|
78
|
+
/* ------------------------------ */
|
|
69
79
|
if (isAttrs(attrsOrChild)) {
|
|
70
80
|
for (const [k, v] of Object.entries(attrsOrChild)) {
|
|
81
|
+
// omit null / undefined / false
|
|
82
|
+
if (v === false || v == null)
|
|
83
|
+
continue;
|
|
84
|
+
// boolean attribute → presence only
|
|
85
|
+
if (v === true) {
|
|
86
|
+
el.setAttribute(k, "");
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// normal / ARIA attribute
|
|
71
90
|
el.setAttribute(k, String(v));
|
|
72
91
|
}
|
|
73
92
|
}
|
|
74
93
|
else if (attrsOrChild != null) {
|
|
75
|
-
//
|
|
94
|
+
// attrsOrChild is actually a child
|
|
76
95
|
children.unshift(attrsOrChild);
|
|
77
96
|
}
|
|
78
97
|
processChildren(el, children);
|
|
@@ -80,6 +99,9 @@ const tags = new Proxy({}, {
|
|
|
80
99
|
};
|
|
81
100
|
}
|
|
82
101
|
});
|
|
102
|
+
/* ---------------------------------- */
|
|
103
|
+
/* Children processing */
|
|
104
|
+
/* ---------------------------------- */
|
|
83
105
|
function processChildren(el, children) {
|
|
84
106
|
for (const child of children.flat()) {
|
|
85
107
|
if (child == null || child === false)
|
|
@@ -99,6 +121,9 @@ function processChildren(el, children) {
|
|
|
99
121
|
el.appendChild(document.createTextNode(String(child)));
|
|
100
122
|
}
|
|
101
123
|
}
|
|
124
|
+
/* ---------------------------------- */
|
|
125
|
+
/* Reactive function children */
|
|
126
|
+
/* ---------------------------------- */
|
|
102
127
|
function mountReactiveFunction(parent, fn) {
|
|
103
128
|
const marker = document.createTextNode("");
|
|
104
129
|
parent.appendChild(marker);
|
|
@@ -143,6 +168,9 @@ function mountReactiveFunction(parent, fn) {
|
|
|
143
168
|
}
|
|
144
169
|
});
|
|
145
170
|
}
|
|
171
|
+
/* ---------------------------------- */
|
|
172
|
+
/* Reactive state children */
|
|
173
|
+
/* ---------------------------------- */
|
|
146
174
|
function mountReactiveState(parent, st) {
|
|
147
175
|
const node = document.createTextNode(String(st.val));
|
|
148
176
|
parent.appendChild(node);
|
|
@@ -153,6 +181,8 @@ function mountReactiveState(parent, st) {
|
|
|
153
181
|
});
|
|
154
182
|
}
|
|
155
183
|
|
|
184
|
+
Object.assign(globalThis, tags);
|
|
185
|
+
|
|
156
186
|
function router(routes) {
|
|
157
187
|
const patterns = [];
|
|
158
188
|
let wildcard = null;
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/state.ts","../src/tags.ts","../src/router.ts","../src/helpers.ts"],"sourcesContent":["export const STATE = Symbol(\"STATE\");\nexport function isState(x) {\n return typeof x === \"object\" && x !== null && x[STATE] === true;\n}\nlet currentEffect = null;\nfunction track(st) {\n if (currentEffect) {\n st.subs.add(currentEffect);\n currentEffect.deps.add(st);\n }\n}\nfunction cleanup(effect) {\n for (const st of effect.deps)\n st.subs.delete(effect);\n effect.deps.clear();\n}\nexport function state(v) {\n const st = {\n [STATE]: true,\n subs: new Set(),\n get val() {\n track(st);\n return v;\n },\n set val(nv) {\n if (nv === v)\n return;\n v = nv;\n for (const fn of Array.from(st.subs)) {\n fn();\n }\n }\n };\n return st;\n}\nexport function derive(fn) {\n const effect = (() => {\n cleanup(effect);\n currentEffect = effect;\n try {\n fn();\n }\n finally {\n currentEffect = null;\n }\n });\n effect.deps = new Set();\n effect();\n return effect;\n}\n","import { derive } from \"./state\";\nfunction isState(x) {\n return x && typeof x === \"object\" && \"subs\" in x && \"val\" in x;\n}\n// --- Attribute detection (fix for TypeScript narrowing) ---\nfunction isAttrs(x) {\n return (x &&\n typeof x === \"object\" &&\n !(x instanceof Node) &&\n !isState(x) &&\n typeof x !== \"function\" &&\n !Array.isArray(x));\n}\nexport const tags = new Proxy({}, {\n get(_, tag) {\n return (attrsOrChild, ...children) => {\n const el = document.createElement(tag);\n // Handle attributes safely\n if (isAttrs(attrsOrChild)) {\n for (const [k, v] of Object.entries(attrsOrChild)) {\n el.setAttribute(k, String(v));\n }\n }\n else if (attrsOrChild != null) {\n // Now TypeScript knows it's ChildLike, not Attrs\n children.unshift(attrsOrChild);\n }\n processChildren(el, children);\n return el;\n };\n }\n});\nfunction processChildren(el, children) {\n for (const child of children.flat()) {\n if (child == null || child === false)\n continue;\n if (typeof child === \"function\") {\n mountReactiveFunction(el, child);\n continue;\n }\n if (isState(child)) {\n mountReactiveState(el, child);\n continue;\n }\n if (child instanceof Node) {\n el.appendChild(child);\n continue;\n }\n el.appendChild(document.createTextNode(String(child)));\n }\n}\nfunction mountReactiveFunction(parent, fn) {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n let mounted = [];\n const cleanup = () => {\n for (const n of mounted) {\n if (n.parentNode === parent)\n parent.removeChild(n);\n }\n mounted = [];\n };\n derive(() => {\n cleanup();\n const value = fn();\n const values = Array.isArray(value) ? value.flat() : [value];\n for (const v of values) {\n if (v == null || v === false)\n continue;\n if (typeof v === \"function\") {\n mountReactiveFunction(parent, v);\n continue;\n }\n if (isState(v)) {\n const node = document.createTextNode(String(v.val));\n parent.insertBefore(node, marker);\n v.subs.add(() => {\n const next = String(v.val);\n if (node.data !== next)\n node.data = next;\n });\n mounted.push(node);\n continue;\n }\n if (v instanceof Node) {\n parent.insertBefore(v, marker);\n mounted.push(v);\n continue;\n }\n const text = document.createTextNode(String(v));\n parent.insertBefore(text, marker);\n mounted.push(text);\n }\n });\n}\nfunction mountReactiveState(parent, st) {\n const node = document.createTextNode(String(st.val));\n parent.appendChild(node);\n st.subs.add(() => {\n const next = String(st.val);\n if (node.data !== next)\n node.data = next;\n });\n}\n","export function router(routes) {\n const patterns = [];\n let wildcard = null;\n for (const path of Object.keys(routes)) {\n const handler = routes[path];\n if (!handler)\n continue;\n if (path === \"*\") {\n wildcard = handler;\n continue;\n }\n const keys = [];\n const pattern = path.replace(/:[^/]+/g, (m) => {\n keys.push(m.slice(1));\n return \"([^/]+)\";\n });\n patterns.push({\n regex: new RegExp(`^${pattern}$`),\n keys,\n handler\n });\n }\n let currentEl = null;\n let currentPath = \"\";\n function parseQuery(search) {\n const params = {};\n if (!search)\n return params;\n for (const [k, v] of new URLSearchParams(search))\n params[k] = v;\n return params;\n }\n function matchRoute(pathname) {\n for (const { regex, keys, handler } of patterns) {\n const match = pathname.match(regex);\n if (!match)\n continue;\n const params = {};\n keys.forEach((key, i) => {\n params[key] = decodeURIComponent(match[i + 1]);\n });\n Object.assign(params, parseQuery(location.search));\n return handler(params);\n }\n if (wildcard)\n return wildcard({});\n throw new Error(`No route matches \"${pathname}\"`);\n }\n function render() {\n const newFullPath = location.pathname + location.search;\n if (newFullPath === currentPath)\n return;\n currentPath = newFullPath;\n const next = matchRoute(location.pathname);\n if (currentEl && currentEl.parentNode) {\n document.body.removeChild(currentEl);\n }\n document.body.appendChild(next);\n currentEl = next;\n }\n window.addEventListener(\"popstate\", render);\n render();\n return {\n render,\n push(path) {\n history.pushState(null, \"\", path);\n render();\n },\n replace(path) {\n history.replaceState(null, \"\", path);\n render();\n },\n back: () => history.back()\n };\n}\n","export function add(component) {\n if (typeof component === \"function\") {\n const el = component();\n if (!(el instanceof HTMLElement)) {\n throw new Error(\"Component function must return an HTMLElement\");\n }\n document.body.appendChild(el);\n return;\n }\n if (\"render\" in component && typeof component.render === \"function\") {\n component.render();\n return;\n }\n throw new Error(\"Invalid component passed to add()\");\n}\n"],"names":["isState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/state.ts","../src/tags.ts","../src/globalTags.ts","../src/router.ts","../src/helpers.ts"],"sourcesContent":["export const STATE = Symbol(\"STATE\");\nexport function isState(x) {\n return typeof x === \"object\" && x !== null && x[STATE] === true;\n}\nlet currentEffect = null;\nfunction track(st) {\n if (currentEffect) {\n st.subs.add(currentEffect);\n currentEffect.deps.add(st);\n }\n}\nfunction cleanup(effect) {\n for (const st of effect.deps)\n st.subs.delete(effect);\n effect.deps.clear();\n}\nexport function state(v) {\n const st = {\n [STATE]: true,\n subs: new Set(),\n get val() {\n track(st);\n return v;\n },\n set val(nv) {\n if (nv === v)\n return;\n v = nv;\n for (const fn of Array.from(st.subs)) {\n fn();\n }\n }\n };\n return st;\n}\nexport function derive(fn) {\n const effect = (() => {\n cleanup(effect);\n currentEffect = effect;\n try {\n fn();\n }\n finally {\n currentEffect = null;\n }\n });\n effect.deps = new Set();\n effect();\n return effect;\n}\n","import { derive } from \"./state\";\n/* ---------------------------------- */\n/* Utilities */\n/* ---------------------------------- */\nfunction isState(x) {\n return x && typeof x === \"object\" && \"subs\" in x && \"val\" in x;\n}\n/* ---------------------------------- */\n/* Attribute detection */\n/* ---------------------------------- */\nfunction isAttrs(x) {\n return (x &&\n typeof x === \"object\" &&\n !(x instanceof Node) &&\n !isState(x) &&\n typeof x !== \"function\" &&\n !Array.isArray(x));\n}\n/* ---------------------------------- */\n/* Tags proxy */\n/* ---------------------------------- */\nexport const tags = new Proxy({}, {\n get(_, tag) {\n return (attrsOrChild, ...children) => {\n const el = document.createElement(tag);\n /* ------------------------------ */\n /* Attributes */\n /* ------------------------------ */\n if (isAttrs(attrsOrChild)) {\n for (const [k, v] of Object.entries(attrsOrChild)) {\n // omit null / undefined / false\n if (v === false || v == null)\n continue;\n // boolean attribute → presence only\n if (v === true) {\n el.setAttribute(k, \"\");\n continue;\n }\n // normal / ARIA attribute\n el.setAttribute(k, String(v));\n }\n }\n else if (attrsOrChild != null) {\n // attrsOrChild is actually a child\n children.unshift(attrsOrChild);\n }\n processChildren(el, children);\n return el;\n };\n }\n});\n/* ---------------------------------- */\n/* Children processing */\n/* ---------------------------------- */\nfunction processChildren(el, children) {\n for (const child of children.flat()) {\n if (child == null || child === false)\n continue;\n if (typeof child === \"function\") {\n mountReactiveFunction(el, child);\n continue;\n }\n if (isState(child)) {\n mountReactiveState(el, child);\n continue;\n }\n if (child instanceof Node) {\n el.appendChild(child);\n continue;\n }\n el.appendChild(document.createTextNode(String(child)));\n }\n}\n/* ---------------------------------- */\n/* Reactive function children */\n/* ---------------------------------- */\nfunction mountReactiveFunction(parent, fn) {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n let mounted = [];\n const cleanup = () => {\n for (const n of mounted) {\n if (n.parentNode === parent)\n parent.removeChild(n);\n }\n mounted = [];\n };\n derive(() => {\n cleanup();\n const value = fn();\n const values = Array.isArray(value) ? value.flat() : [value];\n for (const v of values) {\n if (v == null || v === false)\n continue;\n if (typeof v === \"function\") {\n mountReactiveFunction(parent, v);\n continue;\n }\n if (isState(v)) {\n const node = document.createTextNode(String(v.val));\n parent.insertBefore(node, marker);\n v.subs.add(() => {\n const next = String(v.val);\n if (node.data !== next)\n node.data = next;\n });\n mounted.push(node);\n continue;\n }\n if (v instanceof Node) {\n parent.insertBefore(v, marker);\n mounted.push(v);\n continue;\n }\n const text = document.createTextNode(String(v));\n parent.insertBefore(text, marker);\n mounted.push(text);\n }\n });\n}\n/* ---------------------------------- */\n/* Reactive state children */\n/* ---------------------------------- */\nfunction mountReactiveState(parent, st) {\n const node = document.createTextNode(String(st.val));\n parent.appendChild(node);\n st.subs.add(() => {\n const next = String(st.val);\n if (node.data !== next)\n node.data = next;\n });\n}\n","import { tags } from \"./tags\";\nObject.assign(globalThis, tags);\nexport {};\n","export function router(routes) {\n const patterns = [];\n let wildcard = null;\n for (const path of Object.keys(routes)) {\n const handler = routes[path];\n if (!handler)\n continue;\n if (path === \"*\") {\n wildcard = handler;\n continue;\n }\n const keys = [];\n const pattern = path.replace(/:[^/]+/g, (m) => {\n keys.push(m.slice(1));\n return \"([^/]+)\";\n });\n patterns.push({\n regex: new RegExp(`^${pattern}$`),\n keys,\n handler\n });\n }\n let currentEl = null;\n let currentPath = \"\";\n function parseQuery(search) {\n const params = {};\n if (!search)\n return params;\n for (const [k, v] of new URLSearchParams(search))\n params[k] = v;\n return params;\n }\n function matchRoute(pathname) {\n for (const { regex, keys, handler } of patterns) {\n const match = pathname.match(regex);\n if (!match)\n continue;\n const params = {};\n keys.forEach((key, i) => {\n params[key] = decodeURIComponent(match[i + 1]);\n });\n Object.assign(params, parseQuery(location.search));\n return handler(params);\n }\n if (wildcard)\n return wildcard({});\n throw new Error(`No route matches \"${pathname}\"`);\n }\n function render() {\n const newFullPath = location.pathname + location.search;\n if (newFullPath === currentPath)\n return;\n currentPath = newFullPath;\n const next = matchRoute(location.pathname);\n if (currentEl && currentEl.parentNode) {\n document.body.removeChild(currentEl);\n }\n document.body.appendChild(next);\n currentEl = next;\n }\n window.addEventListener(\"popstate\", render);\n render();\n return {\n render,\n push(path) {\n history.pushState(null, \"\", path);\n render();\n },\n replace(path) {\n history.replaceState(null, \"\", path);\n render();\n },\n back: () => history.back()\n };\n}\n","export function add(component) {\n if (typeof component === \"function\") {\n const el = component();\n if (!(el instanceof HTMLElement)) {\n throw new Error(\"Component function must return an HTMLElement\");\n }\n document.body.appendChild(el);\n return;\n }\n if (\"render\" in component && typeof component.render === \"function\") {\n component.render();\n return;\n }\n throw new Error(\"Invalid component passed to add()\");\n}\n"],"names":["isState"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -53,10 +53,15 @@ function derive(fn) {
|
|
|
53
53
|
return effect;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
/* ---------------------------------- */
|
|
57
|
+
/* Utilities */
|
|
58
|
+
/* ---------------------------------- */
|
|
56
59
|
function isState(x) {
|
|
57
60
|
return x && typeof x === "object" && "subs" in x && "val" in x;
|
|
58
61
|
}
|
|
59
|
-
|
|
62
|
+
/* ---------------------------------- */
|
|
63
|
+
/* Attribute detection */
|
|
64
|
+
/* ---------------------------------- */
|
|
60
65
|
function isAttrs(x) {
|
|
61
66
|
return (x &&
|
|
62
67
|
typeof x === "object" &&
|
|
@@ -65,18 +70,32 @@ function isAttrs(x) {
|
|
|
65
70
|
typeof x !== "function" &&
|
|
66
71
|
!Array.isArray(x));
|
|
67
72
|
}
|
|
73
|
+
/* ---------------------------------- */
|
|
74
|
+
/* Tags proxy */
|
|
75
|
+
/* ---------------------------------- */
|
|
68
76
|
const tags = new Proxy({}, {
|
|
69
77
|
get(_, tag) {
|
|
70
78
|
return (attrsOrChild, ...children) => {
|
|
71
79
|
const el = document.createElement(tag);
|
|
72
|
-
|
|
80
|
+
/* ------------------------------ */
|
|
81
|
+
/* Attributes */
|
|
82
|
+
/* ------------------------------ */
|
|
73
83
|
if (isAttrs(attrsOrChild)) {
|
|
74
84
|
for (const [k, v] of Object.entries(attrsOrChild)) {
|
|
85
|
+
// omit null / undefined / false
|
|
86
|
+
if (v === false || v == null)
|
|
87
|
+
continue;
|
|
88
|
+
// boolean attribute → presence only
|
|
89
|
+
if (v === true) {
|
|
90
|
+
el.setAttribute(k, "");
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// normal / ARIA attribute
|
|
75
94
|
el.setAttribute(k, String(v));
|
|
76
95
|
}
|
|
77
96
|
}
|
|
78
97
|
else if (attrsOrChild != null) {
|
|
79
|
-
//
|
|
98
|
+
// attrsOrChild is actually a child
|
|
80
99
|
children.unshift(attrsOrChild);
|
|
81
100
|
}
|
|
82
101
|
processChildren(el, children);
|
|
@@ -84,6 +103,9 @@ const tags = new Proxy({}, {
|
|
|
84
103
|
};
|
|
85
104
|
}
|
|
86
105
|
});
|
|
106
|
+
/* ---------------------------------- */
|
|
107
|
+
/* Children processing */
|
|
108
|
+
/* ---------------------------------- */
|
|
87
109
|
function processChildren(el, children) {
|
|
88
110
|
for (const child of children.flat()) {
|
|
89
111
|
if (child == null || child === false)
|
|
@@ -103,6 +125,9 @@ function processChildren(el, children) {
|
|
|
103
125
|
el.appendChild(document.createTextNode(String(child)));
|
|
104
126
|
}
|
|
105
127
|
}
|
|
128
|
+
/* ---------------------------------- */
|
|
129
|
+
/* Reactive function children */
|
|
130
|
+
/* ---------------------------------- */
|
|
106
131
|
function mountReactiveFunction(parent, fn) {
|
|
107
132
|
const marker = document.createTextNode("");
|
|
108
133
|
parent.appendChild(marker);
|
|
@@ -147,6 +172,9 @@ function mountReactiveFunction(parent, fn) {
|
|
|
147
172
|
}
|
|
148
173
|
});
|
|
149
174
|
}
|
|
175
|
+
/* ---------------------------------- */
|
|
176
|
+
/* Reactive state children */
|
|
177
|
+
/* ---------------------------------- */
|
|
150
178
|
function mountReactiveState(parent, st) {
|
|
151
179
|
const node = document.createTextNode(String(st.val));
|
|
152
180
|
parent.appendChild(node);
|
|
@@ -157,6 +185,8 @@ function mountReactiveState(parent, st) {
|
|
|
157
185
|
});
|
|
158
186
|
}
|
|
159
187
|
|
|
188
|
+
Object.assign(globalThis, tags);
|
|
189
|
+
|
|
160
190
|
function router(routes) {
|
|
161
191
|
const patterns = [];
|
|
162
192
|
let wildcard = null;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/state.ts","../src/tags.ts","../src/router.ts","../src/helpers.ts"],"sourcesContent":["export const STATE = Symbol(\"STATE\");\nexport function isState(x) {\n return typeof x === \"object\" && x !== null && x[STATE] === true;\n}\nlet currentEffect = null;\nfunction track(st) {\n if (currentEffect) {\n st.subs.add(currentEffect);\n currentEffect.deps.add(st);\n }\n}\nfunction cleanup(effect) {\n for (const st of effect.deps)\n st.subs.delete(effect);\n effect.deps.clear();\n}\nexport function state(v) {\n const st = {\n [STATE]: true,\n subs: new Set(),\n get val() {\n track(st);\n return v;\n },\n set val(nv) {\n if (nv === v)\n return;\n v = nv;\n for (const fn of Array.from(st.subs)) {\n fn();\n }\n }\n };\n return st;\n}\nexport function derive(fn) {\n const effect = (() => {\n cleanup(effect);\n currentEffect = effect;\n try {\n fn();\n }\n finally {\n currentEffect = null;\n }\n });\n effect.deps = new Set();\n effect();\n return effect;\n}\n","import { derive } from \"./state\";\nfunction isState(x) {\n return x && typeof x === \"object\" && \"subs\" in x && \"val\" in x;\n}\n// --- Attribute detection (fix for TypeScript narrowing) ---\nfunction isAttrs(x) {\n return (x &&\n typeof x === \"object\" &&\n !(x instanceof Node) &&\n !isState(x) &&\n typeof x !== \"function\" &&\n !Array.isArray(x));\n}\nexport const tags = new Proxy({}, {\n get(_, tag) {\n return (attrsOrChild, ...children) => {\n const el = document.createElement(tag);\n // Handle attributes safely\n if (isAttrs(attrsOrChild)) {\n for (const [k, v] of Object.entries(attrsOrChild)) {\n el.setAttribute(k, String(v));\n }\n }\n else if (attrsOrChild != null) {\n // Now TypeScript knows it's ChildLike, not Attrs\n children.unshift(attrsOrChild);\n }\n processChildren(el, children);\n return el;\n };\n }\n});\nfunction processChildren(el, children) {\n for (const child of children.flat()) {\n if (child == null || child === false)\n continue;\n if (typeof child === \"function\") {\n mountReactiveFunction(el, child);\n continue;\n }\n if (isState(child)) {\n mountReactiveState(el, child);\n continue;\n }\n if (child instanceof Node) {\n el.appendChild(child);\n continue;\n }\n el.appendChild(document.createTextNode(String(child)));\n }\n}\nfunction mountReactiveFunction(parent, fn) {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n let mounted = [];\n const cleanup = () => {\n for (const n of mounted) {\n if (n.parentNode === parent)\n parent.removeChild(n);\n }\n mounted = [];\n };\n derive(() => {\n cleanup();\n const value = fn();\n const values = Array.isArray(value) ? value.flat() : [value];\n for (const v of values) {\n if (v == null || v === false)\n continue;\n if (typeof v === \"function\") {\n mountReactiveFunction(parent, v);\n continue;\n }\n if (isState(v)) {\n const node = document.createTextNode(String(v.val));\n parent.insertBefore(node, marker);\n v.subs.add(() => {\n const next = String(v.val);\n if (node.data !== next)\n node.data = next;\n });\n mounted.push(node);\n continue;\n }\n if (v instanceof Node) {\n parent.insertBefore(v, marker);\n mounted.push(v);\n continue;\n }\n const text = document.createTextNode(String(v));\n parent.insertBefore(text, marker);\n mounted.push(text);\n }\n });\n}\nfunction mountReactiveState(parent, st) {\n const node = document.createTextNode(String(st.val));\n parent.appendChild(node);\n st.subs.add(() => {\n const next = String(st.val);\n if (node.data !== next)\n node.data = next;\n });\n}\n","export function router(routes) {\n const patterns = [];\n let wildcard = null;\n for (const path of Object.keys(routes)) {\n const handler = routes[path];\n if (!handler)\n continue;\n if (path === \"*\") {\n wildcard = handler;\n continue;\n }\n const keys = [];\n const pattern = path.replace(/:[^/]+/g, (m) => {\n keys.push(m.slice(1));\n return \"([^/]+)\";\n });\n patterns.push({\n regex: new RegExp(`^${pattern}$`),\n keys,\n handler\n });\n }\n let currentEl = null;\n let currentPath = \"\";\n function parseQuery(search) {\n const params = {};\n if (!search)\n return params;\n for (const [k, v] of new URLSearchParams(search))\n params[k] = v;\n return params;\n }\n function matchRoute(pathname) {\n for (const { regex, keys, handler } of patterns) {\n const match = pathname.match(regex);\n if (!match)\n continue;\n const params = {};\n keys.forEach((key, i) => {\n params[key] = decodeURIComponent(match[i + 1]);\n });\n Object.assign(params, parseQuery(location.search));\n return handler(params);\n }\n if (wildcard)\n return wildcard({});\n throw new Error(`No route matches \"${pathname}\"`);\n }\n function render() {\n const newFullPath = location.pathname + location.search;\n if (newFullPath === currentPath)\n return;\n currentPath = newFullPath;\n const next = matchRoute(location.pathname);\n if (currentEl && currentEl.parentNode) {\n document.body.removeChild(currentEl);\n }\n document.body.appendChild(next);\n currentEl = next;\n }\n window.addEventListener(\"popstate\", render);\n render();\n return {\n render,\n push(path) {\n history.pushState(null, \"\", path);\n render();\n },\n replace(path) {\n history.replaceState(null, \"\", path);\n render();\n },\n back: () => history.back()\n };\n}\n","export function add(component) {\n if (typeof component === \"function\") {\n const el = component();\n if (!(el instanceof HTMLElement)) {\n throw new Error(\"Component function must return an HTMLElement\");\n }\n document.body.appendChild(el);\n return;\n }\n if (\"render\" in component && typeof component.render === \"function\") {\n component.render();\n return;\n }\n throw new Error(\"Invalid component passed to add()\");\n}\n"],"names":["isState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/state.ts","../src/tags.ts","../src/globalTags.ts","../src/router.ts","../src/helpers.ts"],"sourcesContent":["export const STATE = Symbol(\"STATE\");\nexport function isState(x) {\n return typeof x === \"object\" && x !== null && x[STATE] === true;\n}\nlet currentEffect = null;\nfunction track(st) {\n if (currentEffect) {\n st.subs.add(currentEffect);\n currentEffect.deps.add(st);\n }\n}\nfunction cleanup(effect) {\n for (const st of effect.deps)\n st.subs.delete(effect);\n effect.deps.clear();\n}\nexport function state(v) {\n const st = {\n [STATE]: true,\n subs: new Set(),\n get val() {\n track(st);\n return v;\n },\n set val(nv) {\n if (nv === v)\n return;\n v = nv;\n for (const fn of Array.from(st.subs)) {\n fn();\n }\n }\n };\n return st;\n}\nexport function derive(fn) {\n const effect = (() => {\n cleanup(effect);\n currentEffect = effect;\n try {\n fn();\n }\n finally {\n currentEffect = null;\n }\n });\n effect.deps = new Set();\n effect();\n return effect;\n}\n","import { derive } from \"./state\";\n/* ---------------------------------- */\n/* Utilities */\n/* ---------------------------------- */\nfunction isState(x) {\n return x && typeof x === \"object\" && \"subs\" in x && \"val\" in x;\n}\n/* ---------------------------------- */\n/* Attribute detection */\n/* ---------------------------------- */\nfunction isAttrs(x) {\n return (x &&\n typeof x === \"object\" &&\n !(x instanceof Node) &&\n !isState(x) &&\n typeof x !== \"function\" &&\n !Array.isArray(x));\n}\n/* ---------------------------------- */\n/* Tags proxy */\n/* ---------------------------------- */\nexport const tags = new Proxy({}, {\n get(_, tag) {\n return (attrsOrChild, ...children) => {\n const el = document.createElement(tag);\n /* ------------------------------ */\n /* Attributes */\n /* ------------------------------ */\n if (isAttrs(attrsOrChild)) {\n for (const [k, v] of Object.entries(attrsOrChild)) {\n // omit null / undefined / false\n if (v === false || v == null)\n continue;\n // boolean attribute → presence only\n if (v === true) {\n el.setAttribute(k, \"\");\n continue;\n }\n // normal / ARIA attribute\n el.setAttribute(k, String(v));\n }\n }\n else if (attrsOrChild != null) {\n // attrsOrChild is actually a child\n children.unshift(attrsOrChild);\n }\n processChildren(el, children);\n return el;\n };\n }\n});\n/* ---------------------------------- */\n/* Children processing */\n/* ---------------------------------- */\nfunction processChildren(el, children) {\n for (const child of children.flat()) {\n if (child == null || child === false)\n continue;\n if (typeof child === \"function\") {\n mountReactiveFunction(el, child);\n continue;\n }\n if (isState(child)) {\n mountReactiveState(el, child);\n continue;\n }\n if (child instanceof Node) {\n el.appendChild(child);\n continue;\n }\n el.appendChild(document.createTextNode(String(child)));\n }\n}\n/* ---------------------------------- */\n/* Reactive function children */\n/* ---------------------------------- */\nfunction mountReactiveFunction(parent, fn) {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n let mounted = [];\n const cleanup = () => {\n for (const n of mounted) {\n if (n.parentNode === parent)\n parent.removeChild(n);\n }\n mounted = [];\n };\n derive(() => {\n cleanup();\n const value = fn();\n const values = Array.isArray(value) ? value.flat() : [value];\n for (const v of values) {\n if (v == null || v === false)\n continue;\n if (typeof v === \"function\") {\n mountReactiveFunction(parent, v);\n continue;\n }\n if (isState(v)) {\n const node = document.createTextNode(String(v.val));\n parent.insertBefore(node, marker);\n v.subs.add(() => {\n const next = String(v.val);\n if (node.data !== next)\n node.data = next;\n });\n mounted.push(node);\n continue;\n }\n if (v instanceof Node) {\n parent.insertBefore(v, marker);\n mounted.push(v);\n continue;\n }\n const text = document.createTextNode(String(v));\n parent.insertBefore(text, marker);\n mounted.push(text);\n }\n });\n}\n/* ---------------------------------- */\n/* Reactive state children */\n/* ---------------------------------- */\nfunction mountReactiveState(parent, st) {\n const node = document.createTextNode(String(st.val));\n parent.appendChild(node);\n st.subs.add(() => {\n const next = String(st.val);\n if (node.data !== next)\n node.data = next;\n });\n}\n","import { tags } from \"./tags\";\nObject.assign(globalThis, tags);\nexport {};\n","export function router(routes) {\n const patterns = [];\n let wildcard = null;\n for (const path of Object.keys(routes)) {\n const handler = routes[path];\n if (!handler)\n continue;\n if (path === \"*\") {\n wildcard = handler;\n continue;\n }\n const keys = [];\n const pattern = path.replace(/:[^/]+/g, (m) => {\n keys.push(m.slice(1));\n return \"([^/]+)\";\n });\n patterns.push({\n regex: new RegExp(`^${pattern}$`),\n keys,\n handler\n });\n }\n let currentEl = null;\n let currentPath = \"\";\n function parseQuery(search) {\n const params = {};\n if (!search)\n return params;\n for (const [k, v] of new URLSearchParams(search))\n params[k] = v;\n return params;\n }\n function matchRoute(pathname) {\n for (const { regex, keys, handler } of patterns) {\n const match = pathname.match(regex);\n if (!match)\n continue;\n const params = {};\n keys.forEach((key, i) => {\n params[key] = decodeURIComponent(match[i + 1]);\n });\n Object.assign(params, parseQuery(location.search));\n return handler(params);\n }\n if (wildcard)\n return wildcard({});\n throw new Error(`No route matches \"${pathname}\"`);\n }\n function render() {\n const newFullPath = location.pathname + location.search;\n if (newFullPath === currentPath)\n return;\n currentPath = newFullPath;\n const next = matchRoute(location.pathname);\n if (currentEl && currentEl.parentNode) {\n document.body.removeChild(currentEl);\n }\n document.body.appendChild(next);\n currentEl = next;\n }\n window.addEventListener(\"popstate\", render);\n render();\n return {\n render,\n push(path) {\n history.pushState(null, \"\", path);\n render();\n },\n replace(path) {\n history.replaceState(null, \"\", path);\n render();\n },\n back: () => history.back()\n };\n}\n","export function add(component) {\n if (typeof component === \"function\") {\n const el = component();\n if (!(el instanceof HTMLElement)) {\n throw new Error(\"Component function must return an HTMLElement\");\n }\n document.body.appendChild(el);\n return;\n }\n if (\"render\" in component && typeof component.render === \"function\") {\n component.render();\n return;\n }\n throw new Error(\"Invalid component passed to add()\");\n}\n"],"names":["isState"],"mappings":"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"}
|
package/dist/index.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MiniUI={})}(this,function(e){"use strict";const t=Symbol("STATE");let n=null;function o(e){const t=()=>{!function(e){for(const t of e.deps)t.subs.delete(e);e.deps.clear()}(t),n=t;try{e()}finally{n=null}};return t.deps=new Set,t(),t}function r(e){return e&&"object"==typeof e&&"subs"in e&&"val"in e}const c=new Proxy({},{get:(e,t)=>(e,...n)=>{const o=document.createElement(t);if(!(c=e)||"object"!=typeof c||c instanceof Node||r(c)||"function"==typeof c||Array.isArray(c))null!=e&&n.unshift(e);else for(const[t,n]of Object.entries(e))!1!==n&&null!=n&&(!0!==n?o.setAttribute(t,String(n)):o.setAttribute(t,""));var c;return function(e,t){for(const n of t.flat())null!=n&&!1!==n&&("function"!=typeof n?r(n)?s(e,n):n instanceof Node?e.appendChild(n):e.appendChild(document.createTextNode(String(n))):i(e,n))}(o,n),o}});function i(e,t){const n=document.createTextNode("");e.appendChild(n);let c=[];o(()=>{(()=>{for(const t of c)t.parentNode===e&&e.removeChild(t);c=[]})();const o=t(),s=Array.isArray(o)?o.flat():[o];for(const t of s){if(null==t||!1===t)continue;if("function"==typeof t){i(e,t);continue}if(r(t)){const o=document.createTextNode(String(t.val));e.insertBefore(o,n),t.subs.add(()=>{const e=String(t.val);o.data!==e&&(o.data=e)}),c.push(o);continue}if(t instanceof Node){e.insertBefore(t,n),c.push(t);continue}const o=document.createTextNode(String(t));e.insertBefore(o,n),c.push(o)}})}function s(e,t){const n=document.createTextNode(String(t.val));e.appendChild(n),t.subs.add(()=>{const e=String(t.val);n.data!==e&&(n.data=e)})}Object.assign(globalThis,c),e.STATE=t,e.add=function(e){if("function"==typeof e){const t=e();if(!(t instanceof HTMLElement))throw new Error("Component function must return an HTMLElement");return void document.body.appendChild(t)}if(!("render"in e)||"function"!=typeof e.render)throw new Error("Invalid component passed to add()");e.render()},e.derive=o,e.isState=function(e){return"object"==typeof e&&null!==e&&!0===e[t]},e.router=function(e){const t=[];let n=null;for(const o of Object.keys(e)){const r=e[o];if(!r)continue;if("*"===o){n=r;continue}const c=[],i=o.replace(/:[^/]+/g,e=>(c.push(e.slice(1)),"([^/]+)"));t.push({regex:new RegExp(`^${i}$`),keys:c,handler:r})}let o=null,r="";function c(e){const t={};if(!e)return t;for(const[n,o]of new URLSearchParams(e))t[n]=o;return t}function i(){const e=location.pathname+location.search;if(e===r)return;r=e;const i=function(e){for(const{regex:n,keys:o,handler:r}of t){const t=e.match(n);if(!t)continue;const i={};return o.forEach((e,n)=>{i[e]=decodeURIComponent(t[n+1])}),Object.assign(i,c(location.search)),r(i)}if(n)return n({});throw new Error(`No route matches "${e}"`)}(location.pathname);o&&o.parentNode&&document.body.removeChild(o),document.body.appendChild(i),o=i}return window.addEventListener("popstate",i),i(),{render:i,push(e){history.pushState(null,"",e),i()},replace(e){history.replaceState(null,"",e),i()},back:()=>history.back()}},e.state=function(e){const o={[t]:!0,subs:new Set,get val(){return function(e){n&&(e.subs.add(n),n.deps.add(e))}(o),e},set val(t){if(t!==e){e=t;for(const e of Array.from(o.subs))e()}}};return o},e.tags=c,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
2
2
|
//# sourceMappingURL=index.min.js.map
|
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","sources":["../src/state.ts","../src/tags.ts","../src/helpers.ts","../src/router.ts"],"sourcesContent":["export const STATE = Symbol(\"STATE\");\nexport function isState(x) {\n return typeof x === \"object\" && x !== null && x[STATE] === true;\n}\nlet currentEffect = null;\nfunction track(st) {\n if (currentEffect) {\n st.subs.add(currentEffect);\n currentEffect.deps.add(st);\n }\n}\nfunction cleanup(effect) {\n for (const st of effect.deps)\n st.subs.delete(effect);\n effect.deps.clear();\n}\nexport function state(v) {\n const st = {\n [STATE]: true,\n subs: new Set(),\n get val() {\n track(st);\n return v;\n },\n set val(nv) {\n if (nv === v)\n return;\n v = nv;\n for (const fn of Array.from(st.subs)) {\n fn();\n }\n }\n };\n return st;\n}\nexport function derive(fn) {\n const effect = (() => {\n cleanup(effect);\n currentEffect = effect;\n try {\n fn();\n }\n finally {\n currentEffect = null;\n }\n });\n effect.deps = new Set();\n effect();\n return effect;\n}\n","import { derive } from \"./state\";\nfunction isState(x) {\n return x && typeof x === \"object\" && \"subs\" in x && \"val\" in x;\n}\n// --- Attribute detection (fix for TypeScript narrowing) ---\nfunction isAttrs(x) {\n return (x &&\n typeof x === \"object\" &&\n !(x instanceof Node) &&\n !isState(x) &&\n typeof x !== \"function\" &&\n !Array.isArray(x));\n}\nexport const tags = new Proxy({}, {\n get(_, tag) {\n return (attrsOrChild, ...children) => {\n const el = document.createElement(tag);\n // Handle attributes safely\n if (isAttrs(attrsOrChild)) {\n for (const [k, v] of Object.entries(attrsOrChild)) {\n el.setAttribute(k, String(v));\n }\n }\n else if (attrsOrChild != null) {\n // Now TypeScript knows it's ChildLike, not Attrs\n children.unshift(attrsOrChild);\n }\n processChildren(el, children);\n return el;\n };\n }\n});\nfunction processChildren(el, children) {\n for (const child of children.flat()) {\n if (child == null || child === false)\n continue;\n if (typeof child === \"function\") {\n mountReactiveFunction(el, child);\n continue;\n }\n if (isState(child)) {\n mountReactiveState(el, child);\n continue;\n }\n if (child instanceof Node) {\n el.appendChild(child);\n continue;\n }\n el.appendChild(document.createTextNode(String(child)));\n }\n}\nfunction mountReactiveFunction(parent, fn) {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n let mounted = [];\n const cleanup = () => {\n for (const n of mounted) {\n if (n.parentNode === parent)\n parent.removeChild(n);\n }\n mounted = [];\n };\n derive(() => {\n cleanup();\n const value = fn();\n const values = Array.isArray(value) ? value.flat() : [value];\n for (const v of values) {\n if (v == null || v === false)\n continue;\n if (typeof v === \"function\") {\n mountReactiveFunction(parent, v);\n continue;\n }\n if (isState(v)) {\n const node = document.createTextNode(String(v.val));\n parent.insertBefore(node, marker);\n v.subs.add(() => {\n const next = String(v.val);\n if (node.data !== next)\n node.data = next;\n });\n mounted.push(node);\n continue;\n }\n if (v instanceof Node) {\n parent.insertBefore(v, marker);\n mounted.push(v);\n continue;\n }\n const text = document.createTextNode(String(v));\n parent.insertBefore(text, marker);\n mounted.push(text);\n }\n });\n}\nfunction mountReactiveState(parent, st) {\n const node = document.createTextNode(String(st.val));\n parent.appendChild(node);\n st.subs.add(() => {\n const next = String(st.val);\n if (node.data !== next)\n node.data = next;\n });\n}\n","export function add(component) {\n if (typeof component === \"function\") {\n const el = component();\n if (!(el instanceof HTMLElement)) {\n throw new Error(\"Component function must return an HTMLElement\");\n }\n document.body.appendChild(el);\n return;\n }\n if (\"render\" in component && typeof component.render === \"function\") {\n component.render();\n return;\n }\n throw new Error(\"Invalid component passed to add()\");\n}\n","export function router(routes) {\n const patterns = [];\n let wildcard = null;\n for (const path of Object.keys(routes)) {\n const handler = routes[path];\n if (!handler)\n continue;\n if (path === \"*\") {\n wildcard = handler;\n continue;\n }\n const keys = [];\n const pattern = path.replace(/:[^/]+/g, (m) => {\n keys.push(m.slice(1));\n return \"([^/]+)\";\n });\n patterns.push({\n regex: new RegExp(`^${pattern}$`),\n keys,\n handler\n });\n }\n let currentEl = null;\n let currentPath = \"\";\n function parseQuery(search) {\n const params = {};\n if (!search)\n return params;\n for (const [k, v] of new URLSearchParams(search))\n params[k] = v;\n return params;\n }\n function matchRoute(pathname) {\n for (const { regex, keys, handler } of patterns) {\n const match = pathname.match(regex);\n if (!match)\n continue;\n const params = {};\n keys.forEach((key, i) => {\n params[key] = decodeURIComponent(match[i + 1]);\n });\n Object.assign(params, parseQuery(location.search));\n return handler(params);\n }\n if (wildcard)\n return wildcard({});\n throw new Error(`No route matches \"${pathname}\"`);\n }\n function render() {\n const newFullPath = location.pathname + location.search;\n if (newFullPath === currentPath)\n return;\n currentPath = newFullPath;\n const next = matchRoute(location.pathname);\n if (currentEl && currentEl.parentNode) {\n document.body.removeChild(currentEl);\n }\n document.body.appendChild(next);\n currentEl = next;\n }\n window.addEventListener(\"popstate\", render);\n render();\n return {\n render,\n push(path) {\n history.pushState(null, \"\", path);\n render();\n },\n replace(path) {\n history.replaceState(null, \"\", path);\n render();\n },\n back: () => history.back()\n };\n}\n"],"names":["STATE","Symbol","currentEffect","derive","fn","effect","st","deps","subs","delete","clear","cleanup","Set","isState","x","tags","Proxy","get","_","tag","attrsOrChild","children","el","document","createElement","Node","Array","isArray","unshift","k","v","Object","entries","setAttribute","String","child","flat","mountReactiveState","appendChild","createTextNode","mountReactiveFunction","processChildren","parent","marker","mounted","n","parentNode","removeChild","value","values","node","val","insertBefore","add","next","data","push","text","component","HTMLElement","Error","body","render","routes","patterns","wildcard","path","keys","handler","pattern","replace","m","slice","regex","RegExp","currentEl","currentPath","parseQuery","search","params","URLSearchParams","newFullPath","location","pathname","match","forEach","key","i","decodeURIComponent","assign","matchRoute","window","addEventListener","history","pushState","replaceState","back","track","nv","from"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":["../src/state.ts","../src/tags.ts","../src/globalTags.ts","../src/helpers.ts","../src/router.ts"],"sourcesContent":["export const STATE = Symbol(\"STATE\");\nexport function isState(x) {\n return typeof x === \"object\" && x !== null && x[STATE] === true;\n}\nlet currentEffect = null;\nfunction track(st) {\n if (currentEffect) {\n st.subs.add(currentEffect);\n currentEffect.deps.add(st);\n }\n}\nfunction cleanup(effect) {\n for (const st of effect.deps)\n st.subs.delete(effect);\n effect.deps.clear();\n}\nexport function state(v) {\n const st = {\n [STATE]: true,\n subs: new Set(),\n get val() {\n track(st);\n return v;\n },\n set val(nv) {\n if (nv === v)\n return;\n v = nv;\n for (const fn of Array.from(st.subs)) {\n fn();\n }\n }\n };\n return st;\n}\nexport function derive(fn) {\n const effect = (() => {\n cleanup(effect);\n currentEffect = effect;\n try {\n fn();\n }\n finally {\n currentEffect = null;\n }\n });\n effect.deps = new Set();\n effect();\n return effect;\n}\n","import { derive } from \"./state\";\n/* ---------------------------------- */\n/* Utilities */\n/* ---------------------------------- */\nfunction isState(x) {\n return x && typeof x === \"object\" && \"subs\" in x && \"val\" in x;\n}\n/* ---------------------------------- */\n/* Attribute detection */\n/* ---------------------------------- */\nfunction isAttrs(x) {\n return (x &&\n typeof x === \"object\" &&\n !(x instanceof Node) &&\n !isState(x) &&\n typeof x !== \"function\" &&\n !Array.isArray(x));\n}\n/* ---------------------------------- */\n/* Tags proxy */\n/* ---------------------------------- */\nexport const tags = new Proxy({}, {\n get(_, tag) {\n return (attrsOrChild, ...children) => {\n const el = document.createElement(tag);\n /* ------------------------------ */\n /* Attributes */\n /* ------------------------------ */\n if (isAttrs(attrsOrChild)) {\n for (const [k, v] of Object.entries(attrsOrChild)) {\n // omit null / undefined / false\n if (v === false || v == null)\n continue;\n // boolean attribute → presence only\n if (v === true) {\n el.setAttribute(k, \"\");\n continue;\n }\n // normal / ARIA attribute\n el.setAttribute(k, String(v));\n }\n }\n else if (attrsOrChild != null) {\n // attrsOrChild is actually a child\n children.unshift(attrsOrChild);\n }\n processChildren(el, children);\n return el;\n };\n }\n});\n/* ---------------------------------- */\n/* Children processing */\n/* ---------------------------------- */\nfunction processChildren(el, children) {\n for (const child of children.flat()) {\n if (child == null || child === false)\n continue;\n if (typeof child === \"function\") {\n mountReactiveFunction(el, child);\n continue;\n }\n if (isState(child)) {\n mountReactiveState(el, child);\n continue;\n }\n if (child instanceof Node) {\n el.appendChild(child);\n continue;\n }\n el.appendChild(document.createTextNode(String(child)));\n }\n}\n/* ---------------------------------- */\n/* Reactive function children */\n/* ---------------------------------- */\nfunction mountReactiveFunction(parent, fn) {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n let mounted = [];\n const cleanup = () => {\n for (const n of mounted) {\n if (n.parentNode === parent)\n parent.removeChild(n);\n }\n mounted = [];\n };\n derive(() => {\n cleanup();\n const value = fn();\n const values = Array.isArray(value) ? value.flat() : [value];\n for (const v of values) {\n if (v == null || v === false)\n continue;\n if (typeof v === \"function\") {\n mountReactiveFunction(parent, v);\n continue;\n }\n if (isState(v)) {\n const node = document.createTextNode(String(v.val));\n parent.insertBefore(node, marker);\n v.subs.add(() => {\n const next = String(v.val);\n if (node.data !== next)\n node.data = next;\n });\n mounted.push(node);\n continue;\n }\n if (v instanceof Node) {\n parent.insertBefore(v, marker);\n mounted.push(v);\n continue;\n }\n const text = document.createTextNode(String(v));\n parent.insertBefore(text, marker);\n mounted.push(text);\n }\n });\n}\n/* ---------------------------------- */\n/* Reactive state children */\n/* ---------------------------------- */\nfunction mountReactiveState(parent, st) {\n const node = document.createTextNode(String(st.val));\n parent.appendChild(node);\n st.subs.add(() => {\n const next = String(st.val);\n if (node.data !== next)\n node.data = next;\n });\n}\n","import { tags } from \"./tags\";\nObject.assign(globalThis, tags);\nexport {};\n","export function add(component) {\n if (typeof component === \"function\") {\n const el = component();\n if (!(el instanceof HTMLElement)) {\n throw new Error(\"Component function must return an HTMLElement\");\n }\n document.body.appendChild(el);\n return;\n }\n if (\"render\" in component && typeof component.render === \"function\") {\n component.render();\n return;\n }\n throw new Error(\"Invalid component passed to add()\");\n}\n","export function router(routes) {\n const patterns = [];\n let wildcard = null;\n for (const path of Object.keys(routes)) {\n const handler = routes[path];\n if (!handler)\n continue;\n if (path === \"*\") {\n wildcard = handler;\n continue;\n }\n const keys = [];\n const pattern = path.replace(/:[^/]+/g, (m) => {\n keys.push(m.slice(1));\n return \"([^/]+)\";\n });\n patterns.push({\n regex: new RegExp(`^${pattern}$`),\n keys,\n handler\n });\n }\n let currentEl = null;\n let currentPath = \"\";\n function parseQuery(search) {\n const params = {};\n if (!search)\n return params;\n for (const [k, v] of new URLSearchParams(search))\n params[k] = v;\n return params;\n }\n function matchRoute(pathname) {\n for (const { regex, keys, handler } of patterns) {\n const match = pathname.match(regex);\n if (!match)\n continue;\n const params = {};\n keys.forEach((key, i) => {\n params[key] = decodeURIComponent(match[i + 1]);\n });\n Object.assign(params, parseQuery(location.search));\n return handler(params);\n }\n if (wildcard)\n return wildcard({});\n throw new Error(`No route matches \"${pathname}\"`);\n }\n function render() {\n const newFullPath = location.pathname + location.search;\n if (newFullPath === currentPath)\n return;\n currentPath = newFullPath;\n const next = matchRoute(location.pathname);\n if (currentEl && currentEl.parentNode) {\n document.body.removeChild(currentEl);\n }\n document.body.appendChild(next);\n currentEl = next;\n }\n window.addEventListener(\"popstate\", render);\n render();\n return {\n render,\n push(path) {\n history.pushState(null, \"\", path);\n render();\n },\n replace(path) {\n history.replaceState(null, \"\", path);\n render();\n },\n back: () => history.back()\n };\n}\n"],"names":["STATE","Symbol","currentEffect","derive","fn","effect","st","deps","subs","delete","clear","cleanup","Set","isState","x","tags","Proxy","get","_","tag","attrsOrChild","children","el","document","createElement","Node","Array","isArray","unshift","k","v","Object","entries","setAttribute","String","child","flat","mountReactiveState","appendChild","createTextNode","mountReactiveFunction","processChildren","parent","marker","mounted","n","parentNode","removeChild","value","values","node","val","insertBefore","add","next","data","push","text","assign","globalThis","component","HTMLElement","Error","body","render","routes","patterns","wildcard","path","keys","handler","pattern","replace","m","slice","regex","RegExp","currentEl","currentPath","parseQuery","search","params","URLSearchParams","newFullPath","location","pathname","match","forEach","key","i","decodeURIComponent","matchRoute","window","addEventListener","history","pushState","replaceState","back","track","nv","from"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { tags } from "./tags";
|
|
2
|
+
|
|
3
|
+
type TagFn = (
|
|
4
|
+
attrsOrChild?: any,
|
|
5
|
+
...children: any[]
|
|
6
|
+
) => HTMLElement;
|
|
7
|
+
|
|
8
|
+
declare global {
|
|
9
|
+
const tags: Record<string, TagFn>;
|
|
10
|
+
interface Window {
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
Object.assign(globalThis, tags);
|
|
16
|
+
|
|
17
|
+
export { };
|
package/src/index.ts
CHANGED
package/src/tags.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { derive } from "./state";
|
|
2
2
|
import type { State } from "./state";
|
|
3
3
|
|
|
4
|
+
/* ---------------------------------- */
|
|
5
|
+
/* Utilities */
|
|
6
|
+
/* ---------------------------------- */
|
|
7
|
+
|
|
4
8
|
function isState(x: any): x is State<any> {
|
|
5
9
|
return x && typeof x === "object" && "subs" in x && "val" in x;
|
|
6
10
|
}
|
|
@@ -25,7 +29,10 @@ type Child =
|
|
|
25
29
|
|
|
26
30
|
type ChildLike = Child | ChildLike[];
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
/* ---------------------------------- */
|
|
33
|
+
/* Attribute detection */
|
|
34
|
+
/* ---------------------------------- */
|
|
35
|
+
|
|
29
36
|
function isAttrs(x: any): x is Attrs {
|
|
30
37
|
return (
|
|
31
38
|
x &&
|
|
@@ -37,6 +44,10 @@ function isAttrs(x: any): x is Attrs {
|
|
|
37
44
|
);
|
|
38
45
|
}
|
|
39
46
|
|
|
47
|
+
/* ---------------------------------- */
|
|
48
|
+
/* Tags proxy */
|
|
49
|
+
/* ---------------------------------- */
|
|
50
|
+
|
|
40
51
|
export const tags: Record<
|
|
41
52
|
string,
|
|
42
53
|
(attrsOrChild?: Attrs | ChildLike, ...children: ChildLike[]) => HTMLElement
|
|
@@ -45,13 +56,26 @@ export const tags: Record<
|
|
|
45
56
|
return (attrsOrChild?: Attrs | ChildLike, ...children: ChildLike[]) => {
|
|
46
57
|
const el = document.createElement(tag);
|
|
47
58
|
|
|
48
|
-
|
|
59
|
+
/* ------------------------------ */
|
|
60
|
+
/* Attributes */
|
|
61
|
+
/* ------------------------------ */
|
|
62
|
+
|
|
49
63
|
if (isAttrs(attrsOrChild)) {
|
|
50
64
|
for (const [k, v] of Object.entries(attrsOrChild)) {
|
|
65
|
+
// omit null / undefined / false
|
|
66
|
+
if (v === false || v == null) continue;
|
|
67
|
+
|
|
68
|
+
// boolean attribute → presence only
|
|
69
|
+
if (v === true) {
|
|
70
|
+
el.setAttribute(k, "");
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// normal / ARIA attribute
|
|
51
75
|
el.setAttribute(k, String(v));
|
|
52
76
|
}
|
|
53
77
|
} else if (attrsOrChild != null) {
|
|
54
|
-
//
|
|
78
|
+
// attrsOrChild is actually a child
|
|
55
79
|
children.unshift(attrsOrChild);
|
|
56
80
|
}
|
|
57
81
|
|
|
@@ -61,6 +85,10 @@ export const tags: Record<
|
|
|
61
85
|
}
|
|
62
86
|
});
|
|
63
87
|
|
|
88
|
+
/* ---------------------------------- */
|
|
89
|
+
/* Children processing */
|
|
90
|
+
/* ---------------------------------- */
|
|
91
|
+
|
|
64
92
|
function processChildren(el: HTMLElement, children: ChildLike[]) {
|
|
65
93
|
for (const child of children.flat()) {
|
|
66
94
|
if (child == null || child === false) continue;
|
|
@@ -84,6 +112,10 @@ function processChildren(el: HTMLElement, children: ChildLike[]) {
|
|
|
84
112
|
}
|
|
85
113
|
}
|
|
86
114
|
|
|
115
|
+
/* ---------------------------------- */
|
|
116
|
+
/* Reactive function children */
|
|
117
|
+
/* ---------------------------------- */
|
|
118
|
+
|
|
87
119
|
function mountReactiveFunction(parent: HTMLElement, fn: () => any) {
|
|
88
120
|
const marker = document.createTextNode("");
|
|
89
121
|
parent.appendChild(marker);
|
|
@@ -114,10 +146,12 @@ function mountReactiveFunction(parent: HTMLElement, fn: () => any) {
|
|
|
114
146
|
if (isState(v)) {
|
|
115
147
|
const node = document.createTextNode(String(v.val));
|
|
116
148
|
parent.insertBefore(node, marker);
|
|
149
|
+
|
|
117
150
|
v.subs.add(() => {
|
|
118
151
|
const next = String(v.val);
|
|
119
152
|
if (node.data !== next) node.data = next;
|
|
120
153
|
});
|
|
154
|
+
|
|
121
155
|
mounted.push(node);
|
|
122
156
|
continue;
|
|
123
157
|
}
|
|
@@ -135,6 +169,10 @@ function mountReactiveFunction(parent: HTMLElement, fn: () => any) {
|
|
|
135
169
|
});
|
|
136
170
|
}
|
|
137
171
|
|
|
172
|
+
/* ---------------------------------- */
|
|
173
|
+
/* Reactive state children */
|
|
174
|
+
/* ---------------------------------- */
|
|
175
|
+
|
|
138
176
|
function mountReactiveState(parent: HTMLElement, st: State<any>) {
|
|
139
177
|
const node = document.createTextNode(String(st.val));
|
|
140
178
|
parent.appendChild(node);
|
|
@@ -143,4 +181,4 @@ function mountReactiveState(parent: HTMLElement, st: State<any>) {
|
|
|
143
181
|
const next = String(st.val);
|
|
144
182
|
if (node.data !== next) node.data = next;
|
|
145
183
|
});
|
|
146
|
-
}
|
|
184
|
+
}
|