mono-jsx 0.9.11 → 0.9.13
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/jsx-runtime.mjs +4 -4
- package/package.json +2 -19
- package/setup.mjs +13 -18
- package/dom/index.mjs +0 -6
- package/dom/jsx-runtime.mjs +0 -785
- package/types/dom/index.d.ts +0 -12
- package/types/dom/jsx-runtime.d.ts +0 -29
package/jsx-runtime.mjs
CHANGED
|
@@ -22,15 +22,15 @@ var ROUTER = 512;
|
|
|
22
22
|
var FORM = 1024;
|
|
23
23
|
var EVENT_JS = `{var w=window,m=new Map;w.$F=m.set.bind(m);w.$fmap=m;w.$emit=(e,i,s)=>m.get(i).call(w.$signals?.(s)??e.target,e.type==="mount"?e.target:e);w.$onsubmit=(e,i,s)=>{e.preventDefault();m.get(i).call(w.$signals?.(s)??e.target,new FormData(e.target),e)};}`;
|
|
24
24
|
var CX_JS = `{var n=t=>typeof t=="string"?t:typeof t=="object"&&t!==null?(Array.isArray(t)?t.map(n).filter(Boolean):Object.entries(t).filter(([,e])=>!!e).map(([e])=>e)).join(" "):"";window.$cx=n;}`;
|
|
25
|
-
var STYLE_JS = `{var f=/^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini)/;var p=new Set;var u=t=>!!t&&(t.constructor===Object||t.constructor===void 0),
|
|
25
|
+
var STYLE_JS = `{var f=/^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini)/;var p=new Set;var u=t=>!!t&&(t.constructor===Object||t.constructor===void 0),g=t=>t.replace(/[a-z][A-Z]/g,n=>n.charAt(0)+"-"+n.charAt(1).toLowerCase());var d=t=>{let n=0;for(let e=0;e<t.length;e++)n=(n<<5)-n+t.charCodeAt(e)|0;return n>>>0};var h=(t,n)=>{let{inline:e,css:o}=b(n);if(o){let r="data-css-",s=d((e??"")+o.join("")),i=r+s.toString(36),l="["+i+"]";p.has(s)||(p.add(s),document.head.appendChild(document.createElement("style")).textContent=(e?l+"{"+e+"}":"")+o.map(a=>a===null?l:a).join("")),t.getAttributeNames().forEach(a=>a.startsWith(r)&&t.removeAttribute(a)),t.setAttribute(i,"")}else e&&t.setAttribute("style",e)},b=t=>{let n,e=[],o=new y;for(let[r,s]of Object.entries(t))switch(r.charCodeAt(0)){case 58:u(s)&&e.push(r.startsWith("::view-")?"":null,r+c(s));break;case 64:u(s)&&(r.startsWith("@keyframes ")?e.push(r+"{"+Object.entries(s).map(([i,l])=>u(l)?i+c(l):"").join("")+"}"):r.startsWith("@view-")?e.push(r+c(s)):e.push(r+"{",null,c(s)+"}"));break;case 38:u(s)&&e.push(null,r.slice(1)+c(s));break;default:n??={},n[r]=s}return n&&(o.inline=c(n).slice(1,-1)),e.length>0&&(o.css=e),o},c=t=>{let n="";for(let[e,o]of Object.entries(t)){let r=typeof o;if(r==="string"||r==="number"){let s=g(e),i=r==="number"?f.test(e)?""+o:o+"px":""+o;n+=(n?";":"")+s+":"+(s==="content"?JSON.stringify(i):i)}}return"{"+n+"}"},y=(()=>{function t(){}return t.prototype=Object.create(null),t})();window.$applyStyle=h;}`;
|
|
26
26
|
var RENDER_ATTR_JS = `{var s=(l,n,r)=>{let e=l.parentElement;return e.tagName==="M-GROUP"&&(e=e.previousElementSibling),()=>{let t=r();n==="value"?e.value=String(t):n==="checked"?e.checked=!!t:typeof t=="boolean"?e.toggleAttribute(n,t):t==null?e.removeAttribute(n):typeof t=="object"?n==="class"?e.setAttribute(n,$cx(t)):n==="style"?$applyStyle(e,t):e.setAttribute(n,JSON.stringify(t)):e.setAttribute(n,String(t))}};window.$renderAttr=s;}`;
|
|
27
27
|
var RENDER_TOGGLE_JS = `{var i=(e,s)=>{let t,l=()=>e.replaceChildren(...s()?t:[]);return()=>{if(!t){let n=e.firstElementChild;n&&n.tagName==="TEMPLATE"&&n.hasAttribute("m-slot")?t=[...n.content.childNodes]:t=[...e.childNodes]}e.hasAttribute("vt")&&document.startViewTransition?document.startViewTransition(l):l()}};window.$renderToggle=i;}`;
|
|
28
28
|
var RENDER_SWITCH_JS = `{var a=(l,u)=>{let s,r=l.getAttribute("value"),t,i,o=e=>t.get(e)??t.set(e,[]).get(e),d=()=>l.replaceChildren(...t.has(s)?t.get(s):i);return()=>{if(!t){t=new Map,i=[];for(let e of l.childNodes)if(e.nodeType===1&&e.tagName==="TEMPLATE"&&e.hasAttribute("m-slot")){for(let n of e.content.childNodes)n.nodeType===1&&n.hasAttribute("slot")?o(n.getAttribute("slot")).push(n):i.push(n);e.remove()}else r?o(r).push(e):i.push(e)}s=""+u(),l.hasAttribute("vt")&&document.startViewTransition?document.startViewTransition(d):d()}};window.$renderSwitch=a;}`;
|
|
29
29
|
var SIGNALS_JS = `{let h;const a=window,b=document,y=new Map,E=new Map,k=new Map,v=new Map,$=new Map,m=new Map,l=n=>y.get(n)??y.set(n,V(n)).get(n),F=()=>Object.create(null),p=(n,e)=>n.getAttribute(e),V=n=>{const e=F(),t=(o,c)=>{e[o]=c},s=new Map,r=(o,c)=>{let u=s.get(o);return u||(u=new Set,s.set(o,u)),u.add(c),()=>{u.delete(c),u.size===0&&s.delete(o)}},i=new Proxy(F(),{get:(o,c)=>b.querySelector("[data-ref='"+n+":"+c+"']")});return new Proxy(e,{get:(o,c,u)=>{switch(c){case"$init":return t;case"$watch":return r;case"app":return l(0);case"refs":return i;default:return h?.(n,c),Reflect.get(o,c,u)}},set:(o,c,u,g)=>{if(u!==Reflect.get(o,c,g)){const f=s.get(c);return f&&queueMicrotask(()=>f.forEach(d=>d())),Reflect.set(o,c,u,g)}return!1}})},M=(n,e,t)=>{switch(e){case"toggle":return $renderToggle(n,t);case"switch":return $renderSwitch(n,t);case"html":return()=>n.innerHTML=""+t()}if(e&&e.length>2&&e.startsWith("[")&&e.endsWith("]"))return $renderAttr(n,e.slice(1,-1),t);const s=n.parentElement,r=()=>n.textContent=""+t();if(b.startViewTransition&&s.hasAttribute("data-vt")){const i=s.getAttribute("data-vt");return i&&(s.style.viewTransitionName=i),()=>b.startViewTransition(r)}return r},S=n=>{const e=n.indexOf(":");return e>0?[Number(n.slice(0,e)),n.slice(e+1)]:null},q=(n,e,t,s)=>{const r=n.get(t);if(r!==void 0){s(r);return}const i=e.get(t);i?i.push(s):e.set(t,[s])},N=(n,e)=>{const t=a.$fmap?.get(n);if(t){e(t);return}const s=m.get(n);s?s.push(e):m.set(n,[e])};if(typeof a.$F=="function"){const n=a.$F;a.$F=(e,t)=>{n(e,t);const s=m.get(e);s&&(m.delete(e),s.forEach(r=>r(t)))}}const T=n=>typeof n=="function"&&n(),A=(n,e)=>customElements.define(n,class extends HTMLElement{disposes=[];connectedCallback(){e(this)}disconnectedCallback(){this.disposes.forEach(t=>t()),this.disposes.length=0}});A("m-signal",n=>{const e=Number(p(n,"scope")),t=l(e),s=p(n,"key");if(s)n.disposes.push(t.$watch(s,M(n,p(n,"mode"),()=>t[s])));else{const r=Number(p(n,"computed")),i=e+":"+r;q(E,v,i,o=>{N(r,c=>{const u=M(n,p(n,"mode"),c.bind(t));o.forEach(g=>{const[f,d]=S(g);n.disposes.push(l(f).$watch(d,u))})})})}}),A("m-effect",n=>{const{disposes:e}=n,t=Number(p(n,"scope"));q(k,$,t,s=>{const r=s.length,i=new Array(r);e.push(()=>{i.forEach(T),i.length=0});for(let o=0;o<r;o++)N(s[o],c=>{const u=[],g=l(t),f=()=>{T(i[o]),i[o]=c.call(g)};h=(d,w)=>u.push([d,w]),f(),h=void 0;for(const[d,w]of u)e.push(l(d).$watch(w,f))})})}),a.$S=(n,e)=>{const[t,s]=S(n);l(t).$init(s,e)},a.$C=(n,e,t)=>{const s=n+":"+e;E.set(s,t);const r=v.get(s);r&&(v.delete(s),r.forEach(i=>i(t)))},a.$E=(n,...e)=>{k.set(n,e);const t=$.get(n);t&&($.delete(n),t.forEach(s=>s(e)))},a.$patch=(n,...e)=>{for(const[t,...s]of e){let r=s.pop(),i=n;for(const o of s)i=i[o];i[r]=t}return n},a.$signals=n=>n!==void 0?l(n):void 0;}`;
|
|
30
30
|
var SUSPENSE_JS = `{const i=new Map,o=e=>e.getAttribute("chunk-id"),l=(e,t)=>customElements.define(e,class extends HTMLElement{connectedCallback(){t(this)}});l("m-portal",e=>{i.set(o(e),e)}),l("m-chunk",e=>{setTimeout(()=>{const t=o(e),n=i.get(t),s=e.firstChild?.content.childNodes;n&&(e.hasAttribute("next")?s&&n.before(...s):(e.hasAttribute("done")?n.remove():s&&n.replaceWith(...s),i.delete(t)),e.remove())})});}`;
|
|
31
31
|
var COMPONENT_JS = `{const e=document,a=(t,s)=>t.getAttribute(s);customElements.define("m-component",class extends HTMLElement{static observedAttributes=["name","props"];#t;#s;#r;#h;#i;#e=new Map;#a=!0;async#l(){if(!this.#t){this.#n("");return}const t=this.#s||"{}",s=this.#t+t,i={"x-component":this.#t,"x-props":t,"x-flags":$FLAGS},n=new AbortController;if(this.#h?.abort(),this.#h=n,this.#e.has(s)){this.#n(this.#e.get(s));return}this.#r?.length&&this.#n(this.#r);const r=await fetch(location.href,{headers:i,signal:n.signal});if(!r.ok)throw this.#n(""),new Error("Failed to fetch component '"+this.#t+"'");const[h,o]=await r.json();this.#e.set(s,h),this.#n(h),o&&(e.body.appendChild(e.createElement("script")).textContent=o)}#n(t){const s=()=>typeof t=="string"?this.innerHTML=t:this.replaceChildren(...t);this.hasAttribute("vt")&&e.startViewTransition&&!this.#a?e.startViewTransition(s):s(),this.#a=!1}get name(){return this.#t??null}set name(t){t&&t!==this.#t&&(this.#t=t,this.#o())}get props(){return this.#s?JSON.parse(this.#s):void 0}set props(t){const s=typeof t=="string"?t:JSON.stringify(t);s&&s!==this.#s&&(this.#s=s,this.#o())}attributeChangedCallback(t,s,i){this.#t&&i&&(t==="name"?this.name=i:t==="props"&&(this.props=i))}connectedCallback(){setTimeout(()=>{if(!this.#r){const t=a(this,"props");this.#t=a(this,"name"),this.#s=t?.startsWith("base64,")?atob(t.slice(7)):void 0,this.#r=[...this.childNodes]}this.#l()})}disconnectedCallback(){this.#e.clear(),this.#h?.abort(),this.#h=void 0,this.#i&&clearTimeout(this.#i),this.#i=void 0}#o(){this.#i&&clearTimeout(this.#i),this.#i=setTimeout(()=>{this.#i=void 0,this.#l()},50)}refresh(){this.#t&&this.#e.delete(this.#t+(this.#s||"{}")),this.#o()}});}`;
|
|
32
|
-
var ROUTER_JS = `{const n=document,a=location,
|
|
33
|
-
var FORM_JS = `{const d=window.document,
|
|
32
|
+
var ROUTER_JS = `{const n=document,a=location,l=({origin:t,pathname:s})=>t===a.origin&&s===a.pathname;customElements.define("m-router",class extends HTMLElement{#s;#t=new Map;#e;#r=!0;#i;#n;async#c(t){const s=new AbortController,i={"x-route":"true","x-flags":$FLAGS};this.#s?.abort(),this.#s=s;const e=await fetch(t,{headers:i,signal:s.signal});if(e.status===404)return null;if(!e.ok)throw this.replaceChildren(),new Error("Failed to fetch route: "+e.status+" "+e.statusText);return e.json()}#a(t){const s=()=>typeof t=="string"?this.innerHTML=t:this.replaceChildren(...t);this.hasAttribute("vt")&&n.startViewTransition&&!this.#r?n.startViewTransition(s):s(),this.#r=!1}#o(){n.querySelectorAll("nav a").forEach(t=>{const{href:s,classList:i}=t,e=t.closest("nav")?.getAttribute("data-active-class")??"active";l(new URL(s))?i.add(e):i.remove(e)})}async#l(t,s){const i=this.#c(t).then(e=>{if(e){const[r,o]=e;return this.#t.set(t,r),this.#a(r),o}else this.#t.delete(t),this.#a(this.#e??[]),typeof $signals<"u"&&($signals(0).url=new URL(t))});this.#t.has(t)?this.#a(this.#t.get(t)):await i,history[s?.replace?"replaceState":"pushState"]({},"",t),this.#o(),window.scrollTo(0,0),i.then(e=>{e&&(n.body.appendChild(n.createElement("script")).textContent=e)})}navigate(t,s){const i=new URL(t,a.href);if(i.origin!==a.origin||t.startsWith("#")){a.href=t;return}l(i)||this.#l(t,s)}connectedCallback(){setTimeout(()=>{if(!this.#e)if(this.hasAttribute("fallback"))this.removeAttribute("fallback"),this.#e=[...this.childNodes];else{this.#e=[];for(const t of this.childNodes)if(t.nodeType===1&&t.tagName==="TEMPLATE"&&t.hasAttribute("m-fallback")){this.#e.push(...t.content.childNodes),t.remove();break}}}),this.#i=t=>{if(t.defaultPrevented||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey||!(t.target instanceof HTMLAnchorElement))return;const s=t.target.getAttribute("href");if(!s||s.startsWith("#"))return;const{download:i,href:e,rel:r,target:o}=t.target;i||r==="external"||o==="_blank"||!e.startsWith(a.origin)||(t.preventDefault(),this.navigate(e))},this.#n=()=>this.#l(a.href),addEventListener("popstate",this.#n),n.addEventListener("click",this.#i),setTimeout(()=>this.#o()),globalThis.$router=this}disconnectedCallback(){removeEventListener("popstate",this.#n),n.removeEventListener("click",this.#i),delete globalThis.$router,this.#s?.abort(),this.#s=void 0,this.#t.clear(),this.#i=void 0,this.#n=void 0}});}`;
|
|
33
|
+
var FORM_JS = `{const d=window.document,c=(n,e)=>n.getAttribute(e),u=(n,e)=>n.appendChild(e);customElements.define("m-invalid",class extends HTMLElement{connectedCallback(){const n=c(this,"for"),e=this.closest("form"),m=this.textContent;if(n&&e&&m)for(const i of n.split(",")){const s=e.elements.namedItem(i.trim());if(s){const l=()=>{s.removeEventListener("input",l),s.setCustomValidity("")};s.addEventListener("input",l),s.setCustomValidity(m),s.focus()}}this.remove()}}),window.$onrfs=async n=>{n.preventDefault();const e=n.target;if(!e.checkValidity())return;const m=new FormData(e),i=[...e.elements];for(const l of i)l._disabled=l.disabled,l.disabled=!0;const s=await fetch(location.href,{method:"POST",headers:{"x-route-form":"true","x-flags":$FLAGS},body:m});if(s.ok){const[l,p]=await s.json(),E=d.createElement("template"),b=new Map;e.querySelectorAll("m-formslot").forEach(t=>{t.innerHTML=""}),E.innerHTML=l;for(const t of i)t.disabled=t._disabled,delete t._disabled;for(const t of E.content.childNodes){if(t.nodeType===1){const o=t,r=c(o,"formslot"),a=r?'m-formslot[name="'+r+'"]':"m-formslot",f=r?e.querySelector(a)??d.querySelector(a):e.querySelector(a);if(f){f.innerHTML="",b.set(o,f);continue}}u(e,t)}for(const[t,o]of b){const r=c(o,"onupdate"),a=c(o,"scope");switch(c(o,"mode")){case"insertbefore":o.before(t);break;case"insertafter":o.after(t);break;default:u(o,t)}r&&$fmap.get(Number(r))?.call($signals?.(Number(a))??o,{type:"update",target:o})}setTimeout(()=>{i.some(t=>!t.validity.valid)||e.reset()},0),p&&(u(d.body,d.createElement("script")).textContent=p+";document.currentScript.remove();")}};}`;
|
|
34
34
|
|
|
35
35
|
// runtime/utils.ts
|
|
36
36
|
var regexpIsNonDimensional = /^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini)/;
|
|
@@ -176,7 +176,7 @@ var $vnode = /* @__PURE__ */ Symbol.for("jsx.vnode");
|
|
|
176
176
|
var $setup = /* @__PURE__ */ Symbol.for("mono.setup");
|
|
177
177
|
|
|
178
178
|
// version.ts
|
|
179
|
-
var VERSION = "0.9.
|
|
179
|
+
var VERSION = "0.9.13";
|
|
180
180
|
|
|
181
181
|
// render.ts
|
|
182
182
|
var FunctionIdGenerator = class extends Map {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mono-jsx",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.13",
|
|
4
4
|
"description": "`<html>` as a `Response`.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./index.mjs",
|
|
@@ -23,21 +23,6 @@
|
|
|
23
23
|
"types": "./types/jsx-runtime.d.ts",
|
|
24
24
|
"node": "./jsx-runtime.mjs",
|
|
25
25
|
"import": "./jsx-runtime.mjs"
|
|
26
|
-
},
|
|
27
|
-
"./dom": {
|
|
28
|
-
"types": "./types/dom/index.d.ts",
|
|
29
|
-
"node": "./dom/index.mjs",
|
|
30
|
-
"import": "./dom/index.mjs"
|
|
31
|
-
},
|
|
32
|
-
"./dom/jsx-runtime": {
|
|
33
|
-
"types": "./types/dom/jsx-runtime.d.ts",
|
|
34
|
-
"node": "./dom/jsx-runtime.mjs",
|
|
35
|
-
"import": "./dom/jsx-runtime.mjs"
|
|
36
|
-
},
|
|
37
|
-
"./dom/jsx-dev-runtime": {
|
|
38
|
-
"types": "./types/dom/jsx-runtime.d.ts",
|
|
39
|
-
"node": "./dom/jsx-runtime.mjs",
|
|
40
|
-
"import": "./dom/jsx-runtime.mjs"
|
|
41
26
|
}
|
|
42
27
|
},
|
|
43
28
|
"scripts": {
|
|
@@ -45,9 +30,7 @@
|
|
|
45
30
|
},
|
|
46
31
|
"files": [
|
|
47
32
|
"./*.mjs",
|
|
48
|
-
"./
|
|
49
|
-
"./types/*.d.ts",
|
|
50
|
-
"./types/dom/*.d.ts"
|
|
33
|
+
"./types/*.d.ts"
|
|
51
34
|
],
|
|
52
35
|
"license": "MIT",
|
|
53
36
|
"repository": {
|
package/setup.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// setup.ts
|
|
2
2
|
import { lstat, readFile, writeFile } from "node:fs/promises";
|
|
3
|
-
import { argv } from "node:process";
|
|
4
3
|
var serverTSX = `// mono-jsx SSR example
|
|
5
4
|
// Docs: https://github.com/ije/mono-jsx
|
|
6
5
|
|
|
@@ -58,24 +57,22 @@ export default {
|
|
|
58
57
|
async function install() {
|
|
59
58
|
if (globalThis.Deno) {
|
|
60
59
|
await new Deno.Command("deno", {
|
|
61
|
-
args: ["
|
|
60
|
+
args: ["add", "npm:mono-jsx"]
|
|
62
61
|
}).spawn().status;
|
|
63
62
|
} else {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
});
|
|
63
|
+
let npm = "npm";
|
|
64
|
+
if ("Bun" in globalThis || await exists("bun.lock")) {
|
|
65
|
+
npm = "bun";
|
|
66
|
+
} else if (await exists("pnpm-lock.yaml")) {
|
|
67
|
+
npm = "pnpm";
|
|
68
|
+
}
|
|
69
|
+
const { spawnSync } = await import("node:child_process");
|
|
70
|
+
spawnSync(npm, ["add", "mono-jsx"]);
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
73
|
async function setup() {
|
|
77
|
-
|
|
78
|
-
if (!
|
|
74
|
+
await install();
|
|
75
|
+
if (!await exists("server.tsx")) {
|
|
79
76
|
await writeFile("server.tsx", serverTSX);
|
|
80
77
|
}
|
|
81
78
|
if (globalThis.Deno && await exists("deno.jsonc")) {
|
|
@@ -102,9 +99,8 @@ async function setup() {
|
|
|
102
99
|
tsConfig = JSON.parse(data);
|
|
103
100
|
} catch {
|
|
104
101
|
}
|
|
105
|
-
const jsxImportSource = csr ? "mono-jsx/dom" : "mono-jsx";
|
|
106
102
|
const compilerOptions = tsConfig.compilerOptions ?? (tsConfig.compilerOptions = {});
|
|
107
|
-
if (compilerOptions.jsx === "react-jsx" && compilerOptions.jsxImportSource ===
|
|
103
|
+
if (compilerOptions.jsx === "react-jsx" && compilerOptions.jsxImportSource === "mono-jsx") {
|
|
108
104
|
console.log("%cmono-jsx already setup.", "color:grey");
|
|
109
105
|
return;
|
|
110
106
|
}
|
|
@@ -116,9 +112,8 @@ async function setup() {
|
|
|
116
112
|
compilerOptions.noEmit ??= true;
|
|
117
113
|
}
|
|
118
114
|
compilerOptions.jsx = "react-jsx";
|
|
119
|
-
compilerOptions.jsxImportSource =
|
|
115
|
+
compilerOptions.jsxImportSource = "mono-jsx";
|
|
120
116
|
await writeFile(tsConfigFilename, JSON.stringify(tsConfig, null, 2));
|
|
121
|
-
await install();
|
|
122
117
|
console.log("\u2705 mono-jsx setup complete.");
|
|
123
118
|
}
|
|
124
119
|
async function exists(path) {
|
package/dom/index.mjs
DELETED
package/dom/jsx-runtime.mjs
DELETED
|
@@ -1,785 +0,0 @@
|
|
|
1
|
-
// jsx.ts
|
|
2
|
-
var customElements = /* @__PURE__ */ new Map();
|
|
3
|
-
var JSX = {
|
|
4
|
-
customElements: {
|
|
5
|
-
define(tagName, fc) {
|
|
6
|
-
customElements.set(tagName, fc);
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
// runtime/utils.ts
|
|
12
|
-
var regexpIsNonDimensional = /^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini)/;
|
|
13
|
-
var isString = (v) => typeof v === "string";
|
|
14
|
-
var isFunction = (v) => typeof v === "function";
|
|
15
|
-
var isPlainObject = (v) => !!v && (v.constructor === Object || v.constructor === void 0);
|
|
16
|
-
var toHyphenCase = (k) => k.replace(/[a-z][A-Z]/g, (m) => m.charAt(0) + "-" + m.charAt(1).toLowerCase());
|
|
17
|
-
var hashCode = (str) => {
|
|
18
|
-
let hash = 0;
|
|
19
|
-
for (let i = 0; i < str.length; i++) {
|
|
20
|
-
hash = (hash << 5) - hash + str.charCodeAt(i) | 0;
|
|
21
|
-
}
|
|
22
|
-
return hash >>> 0;
|
|
23
|
-
};
|
|
24
|
-
var NullPrototypeObject = /* @__PURE__ */ (() => {
|
|
25
|
-
function ONP() {
|
|
26
|
-
}
|
|
27
|
-
ONP.prototype = /* @__PURE__ */ Object.create(null);
|
|
28
|
-
return ONP;
|
|
29
|
-
})();
|
|
30
|
-
var domEscapeHTML = (text) => {
|
|
31
|
-
const div = document.createElement("div");
|
|
32
|
-
div.textContent = text;
|
|
33
|
-
return div.innerHTML;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// symbols.ts
|
|
37
|
-
var $fragment = /* @__PURE__ */ Symbol.for("jsx.fragment");
|
|
38
|
-
var $html = /* @__PURE__ */ Symbol.for("jsx.html");
|
|
39
|
-
var $vnode = /* @__PURE__ */ Symbol.for("jsx.vnode");
|
|
40
|
-
|
|
41
|
-
// dom/render.ts
|
|
42
|
-
var Reactive = class {
|
|
43
|
-
reactive(effect, abortSignal) {
|
|
44
|
-
const update = () => effect(this.get());
|
|
45
|
-
update();
|
|
46
|
-
this.watch(update, abortSignal);
|
|
47
|
-
}
|
|
48
|
-
map(callback) {
|
|
49
|
-
return new ReactiveList(this, callback);
|
|
50
|
-
}
|
|
51
|
-
toString() {
|
|
52
|
-
return "" + this.get();
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
var Signal = class extends Reactive {
|
|
56
|
-
#scope;
|
|
57
|
-
#key;
|
|
58
|
-
#isAtom;
|
|
59
|
-
constructor(scope, key, isAtom = false) {
|
|
60
|
-
super();
|
|
61
|
-
this.#scope = scope;
|
|
62
|
-
this.#key = key;
|
|
63
|
-
this.#isAtom = isAtom;
|
|
64
|
-
}
|
|
65
|
-
get() {
|
|
66
|
-
if (this.#isAtom) {
|
|
67
|
-
$depsMark?.add(this);
|
|
68
|
-
}
|
|
69
|
-
return this.#scope[$get](this.#key);
|
|
70
|
-
}
|
|
71
|
-
set(value) {
|
|
72
|
-
if (isFunction(value)) {
|
|
73
|
-
value = value(this.get());
|
|
74
|
-
}
|
|
75
|
-
this.#scope[this.#key] = value;
|
|
76
|
-
}
|
|
77
|
-
watch(callback, abortSignal) {
|
|
78
|
-
onAbort(abortSignal, this.#scope[$watch](this.#key, callback));
|
|
79
|
-
}
|
|
80
|
-
ref(callback) {
|
|
81
|
-
if (callback) {
|
|
82
|
-
return new Computed(this.#scope, () => callback(this.get()));
|
|
83
|
-
}
|
|
84
|
-
return this;
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
var Computed = class extends Reactive {
|
|
88
|
-
#scope;
|
|
89
|
-
#compute;
|
|
90
|
-
#deps;
|
|
91
|
-
constructor(scope, compute) {
|
|
92
|
-
super();
|
|
93
|
-
this.#scope = scope;
|
|
94
|
-
this.#compute = compute;
|
|
95
|
-
}
|
|
96
|
-
get() {
|
|
97
|
-
const shouldMark = !this.#deps && !$depsMark;
|
|
98
|
-
if (shouldMark) {
|
|
99
|
-
$depsMark = /* @__PURE__ */ new Set();
|
|
100
|
-
}
|
|
101
|
-
const value = this.#compute.call(this.#scope);
|
|
102
|
-
if (shouldMark) {
|
|
103
|
-
this.#deps = $depsMark;
|
|
104
|
-
$depsMark = void 0;
|
|
105
|
-
}
|
|
106
|
-
return value;
|
|
107
|
-
}
|
|
108
|
-
watch(callback, abortSignal) {
|
|
109
|
-
this.#deps?.forEach((dep) => dep.watch(callback, abortSignal));
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
var ReactiveList = class {
|
|
113
|
-
constructor(reactive, callback) {
|
|
114
|
-
this.reactive = reactive;
|
|
115
|
-
this.callback = callback;
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
var Ref = class {
|
|
119
|
-
constructor(refs, name) {
|
|
120
|
-
this.refs = refs;
|
|
121
|
-
this.name = name;
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
var InsertMark = class {
|
|
125
|
-
#root;
|
|
126
|
-
#anchor;
|
|
127
|
-
constructor(root, signal) {
|
|
128
|
-
const anchor = createTextNode();
|
|
129
|
-
root.appendChild(anchor);
|
|
130
|
-
onAbort(signal, anchor.remove.bind(anchor));
|
|
131
|
-
this.#root = root;
|
|
132
|
-
this.#anchor = anchor;
|
|
133
|
-
}
|
|
134
|
-
setText(text) {
|
|
135
|
-
this.#anchor.textContent = text;
|
|
136
|
-
}
|
|
137
|
-
insert(...nodes) {
|
|
138
|
-
const parent = this.#anchor.parentElement ?? this.#root;
|
|
139
|
-
for (const node of nodes) {
|
|
140
|
-
parent.insertBefore(node, this.#anchor);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
insertHTML(html2) {
|
|
144
|
-
let temp = createElement("template");
|
|
145
|
-
let childNodes;
|
|
146
|
-
temp.innerHTML = html2;
|
|
147
|
-
childNodes = [...temp.content.childNodes];
|
|
148
|
-
this.insert(...childNodes);
|
|
149
|
-
return () => childNodes.forEach((node) => node.remove());
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
var document2 = globalThis.document;
|
|
153
|
-
var $get = /* @__PURE__ */ Symbol();
|
|
154
|
-
var $watch = /* @__PURE__ */ Symbol();
|
|
155
|
-
var $expr = /* @__PURE__ */ Symbol();
|
|
156
|
-
var $slots = /* @__PURE__ */ Symbol();
|
|
157
|
-
var globalScopes = /* @__PURE__ */ new Set();
|
|
158
|
-
var isVNode = (v) => Array.isArray(v) && v.length === 3 && v[2] === $vnode;
|
|
159
|
-
var createTextNode = (text = "") => document2.createTextNode(text);
|
|
160
|
-
var createElement = (tag) => document2.createElement(tag);
|
|
161
|
-
var onAbort = (signal, callback) => signal?.addEventListener("abort", callback);
|
|
162
|
-
var setAttribute = (el, name, value) => {
|
|
163
|
-
switch (typeof value) {
|
|
164
|
-
case "boolean":
|
|
165
|
-
el.toggleAttribute(name, value);
|
|
166
|
-
break;
|
|
167
|
-
case "number":
|
|
168
|
-
case "string":
|
|
169
|
-
el.setAttribute(name, String(value));
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
var call$expr = (scope, ok) => {
|
|
174
|
-
scope[$expr](ok);
|
|
175
|
-
globalScopes.forEach((s) => s[$expr](ok));
|
|
176
|
-
};
|
|
177
|
-
var $depsMark;
|
|
178
|
-
var createScope = (slots, abortSignal) => {
|
|
179
|
-
let exprMode = false;
|
|
180
|
-
let watchHandlers = /* @__PURE__ */ new Map();
|
|
181
|
-
let refElements = /* @__PURE__ */ new Map();
|
|
182
|
-
let signals = /* @__PURE__ */ new Map();
|
|
183
|
-
let refs = new Proxy(new NullPrototypeObject(), {
|
|
184
|
-
get(_, key) {
|
|
185
|
-
if (!exprMode || $depsMark) {
|
|
186
|
-
return refElements.get(key);
|
|
187
|
-
}
|
|
188
|
-
return new Ref(refElements, key);
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
let scope = new Proxy(new NullPrototypeObject(), {
|
|
192
|
-
get(target, key, receiver) {
|
|
193
|
-
switch (key) {
|
|
194
|
-
case $get:
|
|
195
|
-
return (key2) => target[key2];
|
|
196
|
-
case $watch:
|
|
197
|
-
return (key2, effect) => {
|
|
198
|
-
let handlers = watchHandlers.get(key2);
|
|
199
|
-
if (!handlers) {
|
|
200
|
-
handlers = /* @__PURE__ */ new Set();
|
|
201
|
-
watchHandlers.set(key2, handlers);
|
|
202
|
-
}
|
|
203
|
-
handlers.add(effect);
|
|
204
|
-
return () => handlers.delete(effect);
|
|
205
|
-
};
|
|
206
|
-
case $expr:
|
|
207
|
-
return (ok) => exprMode = ok;
|
|
208
|
-
case $slots:
|
|
209
|
-
return slots;
|
|
210
|
-
case "init":
|
|
211
|
-
return (init) => {
|
|
212
|
-
Object.assign(target, init);
|
|
213
|
-
};
|
|
214
|
-
case "extend":
|
|
215
|
-
return (init) => {
|
|
216
|
-
for (const [key2, { set, get, value }] of Object.entries(Object.getOwnPropertyDescriptors(init))) {
|
|
217
|
-
if (set) {
|
|
218
|
-
throw new TypeError("setter is not allowed");
|
|
219
|
-
}
|
|
220
|
-
if (get) {
|
|
221
|
-
target[key2] = new Computed(receiver, get);
|
|
222
|
-
} else {
|
|
223
|
-
if (key2 === "effect" && isFunction(value)) {
|
|
224
|
-
receiver.effect(value);
|
|
225
|
-
} else {
|
|
226
|
-
target[key2] = value;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
return receiver;
|
|
231
|
-
};
|
|
232
|
-
case "$":
|
|
233
|
-
case "computed":
|
|
234
|
-
return (fn) => new Computed(receiver, fn);
|
|
235
|
-
case "effect":
|
|
236
|
-
return (callback) => {
|
|
237
|
-
queueMicrotask(() => {
|
|
238
|
-
$depsMark = /* @__PURE__ */ new Set();
|
|
239
|
-
let cleanup = callback.call(receiver);
|
|
240
|
-
$depsMark.forEach(
|
|
241
|
-
(dep) => dep.watch(() => {
|
|
242
|
-
cleanup?.();
|
|
243
|
-
cleanup = callback.call(receiver);
|
|
244
|
-
}, abortSignal)
|
|
245
|
-
);
|
|
246
|
-
if (cleanup) {
|
|
247
|
-
onAbort(abortSignal, cleanup);
|
|
248
|
-
}
|
|
249
|
-
$depsMark = void 0;
|
|
250
|
-
});
|
|
251
|
-
};
|
|
252
|
-
case "refs":
|
|
253
|
-
return refs;
|
|
254
|
-
default: {
|
|
255
|
-
const value = Reflect.get(target, key, receiver);
|
|
256
|
-
if (typeof key === "symbol" || isFunction(value)) {
|
|
257
|
-
return value;
|
|
258
|
-
}
|
|
259
|
-
const getRawValue = !exprMode || $depsMark !== void 0;
|
|
260
|
-
if (value instanceof Reactive) {
|
|
261
|
-
if (getRawValue) {
|
|
262
|
-
if (value instanceof Signal) {
|
|
263
|
-
$depsMark?.add(value);
|
|
264
|
-
}
|
|
265
|
-
return value.get();
|
|
266
|
-
}
|
|
267
|
-
return value;
|
|
268
|
-
}
|
|
269
|
-
let signal = signals.get(key);
|
|
270
|
-
if (!signal) {
|
|
271
|
-
signal = new Signal(receiver, key);
|
|
272
|
-
signals.set(key, signal);
|
|
273
|
-
}
|
|
274
|
-
if (getRawValue) {
|
|
275
|
-
$depsMark?.add(signal);
|
|
276
|
-
return value;
|
|
277
|
-
}
|
|
278
|
-
return signal;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
set(target, key, value) {
|
|
283
|
-
if (isString(key)) {
|
|
284
|
-
const prev = target[key];
|
|
285
|
-
if (prev !== value) {
|
|
286
|
-
target[key] = value;
|
|
287
|
-
watchHandlers.get(key)?.forEach((effect) => effect());
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
return true;
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
onAbort(abortSignal, () => {
|
|
294
|
-
watchHandlers.clear();
|
|
295
|
-
refElements.clear();
|
|
296
|
-
signals.clear();
|
|
297
|
-
});
|
|
298
|
-
return scope;
|
|
299
|
-
};
|
|
300
|
-
var atomIndex = 0;
|
|
301
|
-
var atomScope;
|
|
302
|
-
var atom = (value) => {
|
|
303
|
-
if (!atomScope) {
|
|
304
|
-
atomScope = createScope();
|
|
305
|
-
}
|
|
306
|
-
const atomKey = "$" + atomIndex++;
|
|
307
|
-
atomScope[atomKey] = value;
|
|
308
|
-
return new Signal(atomScope, atomKey, true);
|
|
309
|
-
};
|
|
310
|
-
var store = (props) => {
|
|
311
|
-
const scope = createScope().extend(props);
|
|
312
|
-
globalScopes.add(scope);
|
|
313
|
-
return scope;
|
|
314
|
-
};
|
|
315
|
-
var render = (scope, child, root, abortSignal) => {
|
|
316
|
-
switch (typeof child) {
|
|
317
|
-
case "boolean":
|
|
318
|
-
case "undefined":
|
|
319
|
-
case "symbol":
|
|
320
|
-
return;
|
|
321
|
-
case "object":
|
|
322
|
-
if (child === null) {
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
if (child instanceof ReactiveList) {
|
|
326
|
-
let { reactive, callback } = child;
|
|
327
|
-
let insertMark = new InsertMark(root, abortSignal);
|
|
328
|
-
let list = /* @__PURE__ */ new Map();
|
|
329
|
-
let cleanup = () => {
|
|
330
|
-
list.forEach((items) => items.forEach(([ac]) => ac.abort()));
|
|
331
|
-
list.clear();
|
|
332
|
-
};
|
|
333
|
-
reactive.reactive((v) => {
|
|
334
|
-
if (!Array.isArray(v) || isVNode(v)) {
|
|
335
|
-
v = [v];
|
|
336
|
-
}
|
|
337
|
-
let nodes = [];
|
|
338
|
-
let newList = /* @__PURE__ */ new Map();
|
|
339
|
-
v.forEach((item, index) => {
|
|
340
|
-
let render2 = list.get(item)?.shift();
|
|
341
|
-
if (callback.length >= 2 && render2 && render2[2] !== index) {
|
|
342
|
-
render2[0].abort();
|
|
343
|
-
render2 = void 0;
|
|
344
|
-
}
|
|
345
|
-
if (!render2) {
|
|
346
|
-
const ac = new AbortController();
|
|
347
|
-
render2 = [ac, [...renderToFragment(scope, callback(item, index), ac.signal).childNodes], index];
|
|
348
|
-
}
|
|
349
|
-
nodes.push(...render2[1]);
|
|
350
|
-
if (newList.has(item)) {
|
|
351
|
-
newList.get(item).push(render2);
|
|
352
|
-
} else {
|
|
353
|
-
newList.set(item, [render2]);
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
cleanup();
|
|
357
|
-
insertMark.insert(...nodes);
|
|
358
|
-
list = newList;
|
|
359
|
-
}, abortSignal);
|
|
360
|
-
onAbort(abortSignal, cleanup);
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
if (child instanceof Reactive) {
|
|
364
|
-
let ac;
|
|
365
|
-
let insertMark = new InsertMark(root, abortSignal);
|
|
366
|
-
child.reactive((value) => {
|
|
367
|
-
ac?.abort();
|
|
368
|
-
if (Array.isArray(value) || child instanceof ReactiveList || child instanceof Reactive) {
|
|
369
|
-
ac = new AbortController();
|
|
370
|
-
insertMark.insert(...renderToFragment(scope, value, ac.signal).childNodes);
|
|
371
|
-
} else {
|
|
372
|
-
const vtype = typeof value;
|
|
373
|
-
insertMark.setText(
|
|
374
|
-
vtype === "boolean" || vtype === "undefined" || vtype === "symbol" || value === null ? "" : String(value)
|
|
375
|
-
);
|
|
376
|
-
}
|
|
377
|
-
}, abortSignal);
|
|
378
|
-
onAbort(abortSignal, () => ac?.abort());
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
if (isVNode(child)) {
|
|
382
|
-
const [tag, props] = child;
|
|
383
|
-
switch (tag) {
|
|
384
|
-
// fragment element
|
|
385
|
-
case $fragment: {
|
|
386
|
-
const { children } = props;
|
|
387
|
-
if (children !== void 0) {
|
|
388
|
-
renderChildren(scope, children, root, abortSignal);
|
|
389
|
-
}
|
|
390
|
-
break;
|
|
391
|
-
}
|
|
392
|
-
// XSS!
|
|
393
|
-
case $html: {
|
|
394
|
-
const { innerHTML } = props;
|
|
395
|
-
const mark = new InsertMark(root, abortSignal);
|
|
396
|
-
if (innerHTML instanceof Reactive) {
|
|
397
|
-
let cleanup;
|
|
398
|
-
innerHTML.reactive((html2) => {
|
|
399
|
-
cleanup?.();
|
|
400
|
-
cleanup = mark.insertHTML(html2);
|
|
401
|
-
}, abortSignal);
|
|
402
|
-
onAbort(abortSignal, () => cleanup?.());
|
|
403
|
-
} else {
|
|
404
|
-
onAbort(abortSignal, mark.insertHTML(innerHTML));
|
|
405
|
-
}
|
|
406
|
-
break;
|
|
407
|
-
}
|
|
408
|
-
// `<slot>` element
|
|
409
|
-
case "slot": {
|
|
410
|
-
const slots = scope[$slots];
|
|
411
|
-
if (slots) {
|
|
412
|
-
renderChildren(scope, slots, root, abortSignal);
|
|
413
|
-
}
|
|
414
|
-
break;
|
|
415
|
-
}
|
|
416
|
-
// `<show>` and `<hidden>` elements
|
|
417
|
-
case "show":
|
|
418
|
-
case "hidden": {
|
|
419
|
-
let { when = true, children } = props;
|
|
420
|
-
if (children !== void 0) {
|
|
421
|
-
if (when instanceof Reactive) {
|
|
422
|
-
let mark = new InsertMark(root, abortSignal);
|
|
423
|
-
let ac;
|
|
424
|
-
when.reactive((value) => {
|
|
425
|
-
ac?.abort();
|
|
426
|
-
if (tag === "show" ? value : !value) {
|
|
427
|
-
ac = new AbortController();
|
|
428
|
-
mark.insert(...renderToFragment(scope, children, ac.signal).childNodes);
|
|
429
|
-
}
|
|
430
|
-
}, abortSignal);
|
|
431
|
-
onAbort(abortSignal, () => ac?.abort());
|
|
432
|
-
} else {
|
|
433
|
-
console.warn("[mono-jsx] <" + tag + "> The `when` prop is not a signal/computed.");
|
|
434
|
-
if (when) {
|
|
435
|
-
renderChildren(scope, children, root, abortSignal);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
break;
|
|
440
|
-
}
|
|
441
|
-
// `<switch>` element
|
|
442
|
-
case "switch": {
|
|
443
|
-
const { value: valueProp, children } = props;
|
|
444
|
-
if (children !== void 0) {
|
|
445
|
-
if (valueProp instanceof Reactive) {
|
|
446
|
-
let mark = new InsertMark(root, abortSignal);
|
|
447
|
-
let ac;
|
|
448
|
-
valueProp.reactive((value) => {
|
|
449
|
-
const slots = children.filter((v) => isVNode(v) && v[1].slot === String(value));
|
|
450
|
-
ac?.abort();
|
|
451
|
-
if (slots.length > 0) {
|
|
452
|
-
ac = new AbortController();
|
|
453
|
-
mark.insert(...renderToFragment(scope, slots, ac.signal).childNodes);
|
|
454
|
-
}
|
|
455
|
-
}, abortSignal);
|
|
456
|
-
onAbort(abortSignal, () => ac?.abort());
|
|
457
|
-
} else {
|
|
458
|
-
renderChildren(
|
|
459
|
-
scope,
|
|
460
|
-
children.filter((v) => isVNode(v) && v[1].slot === String(valueProp)),
|
|
461
|
-
root,
|
|
462
|
-
abortSignal
|
|
463
|
-
);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
break;
|
|
467
|
-
}
|
|
468
|
-
default: {
|
|
469
|
-
if (typeof tag === "function") {
|
|
470
|
-
renderFC(tag, props, root, abortSignal);
|
|
471
|
-
break;
|
|
472
|
-
}
|
|
473
|
-
if (isString(tag)) {
|
|
474
|
-
if (customElements.has(tag)) {
|
|
475
|
-
renderFC(customElements.get(tag), props, root, abortSignal);
|
|
476
|
-
break;
|
|
477
|
-
}
|
|
478
|
-
const { portal, children, ...attrs } = props;
|
|
479
|
-
const el = createElement(tag);
|
|
480
|
-
for (const [attrName, attrValue] of Object.entries(attrs)) {
|
|
481
|
-
switch (attrName) {
|
|
482
|
-
case "class": {
|
|
483
|
-
const updateClassName = (className) => {
|
|
484
|
-
el.className = [className, ...el.classList.values().filter((name) => name.startsWith("css-"))].join(" ");
|
|
485
|
-
};
|
|
486
|
-
if (isString(attrValue)) {
|
|
487
|
-
updateClassName(attrValue);
|
|
488
|
-
} else {
|
|
489
|
-
let mark = /* @__PURE__ */ new Set();
|
|
490
|
-
let update = () => updateClassName(cx(attrValue, mark));
|
|
491
|
-
update();
|
|
492
|
-
for (const reactive of mark) {
|
|
493
|
-
reactive.watch(update, abortSignal);
|
|
494
|
-
}
|
|
495
|
-
mark = void 0;
|
|
496
|
-
}
|
|
497
|
-
break;
|
|
498
|
-
}
|
|
499
|
-
case "style": {
|
|
500
|
-
if (isString(attrValue)) {
|
|
501
|
-
el.style.cssText = attrValue;
|
|
502
|
-
} else {
|
|
503
|
-
let mark = /* @__PURE__ */ new Set();
|
|
504
|
-
let update = () => applyStyle(el, attrValue, mark);
|
|
505
|
-
update();
|
|
506
|
-
for (const reactive of mark) {
|
|
507
|
-
reactive.watch(update, abortSignal);
|
|
508
|
-
}
|
|
509
|
-
mark = void 0;
|
|
510
|
-
}
|
|
511
|
-
break;
|
|
512
|
-
}
|
|
513
|
-
case "ref":
|
|
514
|
-
if (isFunction(attrValue)) {
|
|
515
|
-
const ret = attrValue(el);
|
|
516
|
-
if (isFunction(ret)) {
|
|
517
|
-
onAbort(abortSignal, ret);
|
|
518
|
-
}
|
|
519
|
-
} else if (attrValue instanceof Ref) {
|
|
520
|
-
attrValue.refs.set(attrValue.name, el);
|
|
521
|
-
}
|
|
522
|
-
break;
|
|
523
|
-
case "slot":
|
|
524
|
-
break;
|
|
525
|
-
case "$checked":
|
|
526
|
-
case "$value":
|
|
527
|
-
if (attrValue instanceof Signal) {
|
|
528
|
-
const name = attrName.slice(1);
|
|
529
|
-
const isValue = name.charAt(0) === "v";
|
|
530
|
-
attrValue.reactive((value) => {
|
|
531
|
-
el[name] = isValue ? String(value) : !!value;
|
|
532
|
-
}, abortSignal);
|
|
533
|
-
el.addEventListener("input", () => attrValue.set(el[name]));
|
|
534
|
-
} else {
|
|
535
|
-
setAttribute(el, attrName.slice(1), attrValue);
|
|
536
|
-
}
|
|
537
|
-
break;
|
|
538
|
-
case "viewTransition":
|
|
539
|
-
break;
|
|
540
|
-
case "action":
|
|
541
|
-
if (isFunction(attrValue) && tag === "form") {
|
|
542
|
-
el.addEventListener("submit", (evt) => {
|
|
543
|
-
evt.preventDefault();
|
|
544
|
-
attrValue(new FormData(evt.target), evt);
|
|
545
|
-
});
|
|
546
|
-
} else {
|
|
547
|
-
setAttribute(el, attrName, attrValue);
|
|
548
|
-
}
|
|
549
|
-
break;
|
|
550
|
-
default:
|
|
551
|
-
if (attrName.startsWith("on") && isFunction(attrValue)) {
|
|
552
|
-
el.addEventListener(attrName.slice(2).toLowerCase(), attrValue);
|
|
553
|
-
} else if (attrValue instanceof Reactive) {
|
|
554
|
-
attrValue.reactive((value) => setAttribute(el, attrName, value), abortSignal);
|
|
555
|
-
} else {
|
|
556
|
-
setAttribute(el, attrName, attrValue);
|
|
557
|
-
}
|
|
558
|
-
break;
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
onAbort(abortSignal, el.remove.bind(el));
|
|
562
|
-
(portal instanceof HTMLElement ? portal : root).appendChild(el);
|
|
563
|
-
if (children !== void 0) {
|
|
564
|
-
renderChildren(scope, children, el, abortSignal);
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
if (Array.isArray(child)) {
|
|
572
|
-
renderChildren(scope, child, root, abortSignal);
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
const textNode = createTextNode(String(child));
|
|
577
|
-
root.appendChild(textNode);
|
|
578
|
-
onAbort(abortSignal, textNode.remove.bind(textNode));
|
|
579
|
-
};
|
|
580
|
-
var renderChildren = (scope, children, root, aboutSignal) => {
|
|
581
|
-
if (Array.isArray(children) && !isVNode(children)) {
|
|
582
|
-
for (const child of children) {
|
|
583
|
-
render(scope, child, root, aboutSignal);
|
|
584
|
-
}
|
|
585
|
-
} else {
|
|
586
|
-
render(scope, children, root, aboutSignal);
|
|
587
|
-
}
|
|
588
|
-
};
|
|
589
|
-
var renderFC = (fc, props, root, abortSignal) => {
|
|
590
|
-
let el;
|
|
591
|
-
let scope = createScope(props.children, abortSignal);
|
|
592
|
-
let catchFn = props.catch;
|
|
593
|
-
call$expr(scope, true);
|
|
594
|
-
try {
|
|
595
|
-
el = fc.call(scope, props);
|
|
596
|
-
} catch (err) {
|
|
597
|
-
if (!catchFn) {
|
|
598
|
-
throw err;
|
|
599
|
-
}
|
|
600
|
-
el = catchFn(err);
|
|
601
|
-
catchFn = void 0;
|
|
602
|
-
}
|
|
603
|
-
if (el instanceof Promise) {
|
|
604
|
-
let pendingNodes;
|
|
605
|
-
if (isVNode(props.pending)) {
|
|
606
|
-
pendingNodes = [...renderToFragment(scope, props.pending, abortSignal).childNodes];
|
|
607
|
-
}
|
|
608
|
-
if (!pendingNodes?.length) {
|
|
609
|
-
pendingNodes = [createTextNode()];
|
|
610
|
-
}
|
|
611
|
-
root.append(...pendingNodes);
|
|
612
|
-
el.then((nodes) => {
|
|
613
|
-
call$expr(scope, false);
|
|
614
|
-
pendingNodes[0].replaceWith(...renderToFragment(scope, nodes, abortSignal).childNodes);
|
|
615
|
-
}).catch((err) => {
|
|
616
|
-
if (!catchFn) {
|
|
617
|
-
throw err;
|
|
618
|
-
}
|
|
619
|
-
pendingNodes[0].replaceWith(...renderToFragment(scope, catchFn(err), abortSignal).childNodes);
|
|
620
|
-
}).finally(() => {
|
|
621
|
-
call$expr(scope, false);
|
|
622
|
-
pendingNodes.forEach((node) => node.remove());
|
|
623
|
-
});
|
|
624
|
-
} else {
|
|
625
|
-
call$expr(scope, false);
|
|
626
|
-
if (isPlainObject(el) && !isVNode(el)) {
|
|
627
|
-
if (Symbol.asyncIterator in el) {
|
|
628
|
-
} else if (Symbol.iterator in el) {
|
|
629
|
-
for (const node of el) {
|
|
630
|
-
render(scope, node, root, abortSignal);
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
} else {
|
|
634
|
-
render(scope, el, root, abortSignal);
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
};
|
|
638
|
-
var renderToFragment = (scope, node, aboutSignal) => {
|
|
639
|
-
const fragment = document2.createDocumentFragment();
|
|
640
|
-
renderChildren(scope, node, fragment, aboutSignal);
|
|
641
|
-
return fragment;
|
|
642
|
-
};
|
|
643
|
-
var $ = (value, mark) => {
|
|
644
|
-
if (value instanceof Reactive) {
|
|
645
|
-
mark?.add(value);
|
|
646
|
-
value = value.get();
|
|
647
|
-
}
|
|
648
|
-
return value;
|
|
649
|
-
};
|
|
650
|
-
var cx = (className, mark) => {
|
|
651
|
-
className = $(className, mark);
|
|
652
|
-
if (isString(className)) {
|
|
653
|
-
return className;
|
|
654
|
-
}
|
|
655
|
-
if (typeof className === "object" && className !== null) {
|
|
656
|
-
return (Array.isArray(className) ? className.map((cn) => cx(cn, mark)).filter(Boolean) : Object.entries(className).filter(([, v]) => !!$(v, mark)).map(([k]) => k)).join(" ");
|
|
657
|
-
}
|
|
658
|
-
return "";
|
|
659
|
-
};
|
|
660
|
-
var applyStyle = (el, style, mark) => {
|
|
661
|
-
style = $(style, mark);
|
|
662
|
-
if (isPlainObject(style)) {
|
|
663
|
-
let { classList } = el;
|
|
664
|
-
let inline;
|
|
665
|
-
let css = [];
|
|
666
|
-
classList.remove(...classList.values().filter((key) => key.startsWith("css-")));
|
|
667
|
-
for (let [k, v] of Object.entries(style)) {
|
|
668
|
-
v = $(v, mark);
|
|
669
|
-
switch (k.charCodeAt(0)) {
|
|
670
|
-
case /* ':' */
|
|
671
|
-
58:
|
|
672
|
-
if (isPlainObject(v)) {
|
|
673
|
-
css.push(k.startsWith("::view-") ? "" : null, k + renderStyle(v, mark));
|
|
674
|
-
}
|
|
675
|
-
break;
|
|
676
|
-
case /* '@' */
|
|
677
|
-
64:
|
|
678
|
-
if (isPlainObject(v)) {
|
|
679
|
-
if (k.startsWith("@keyframes ")) {
|
|
680
|
-
css.push(k + "{" + Object.entries(v).map(([k2, v2]) => isPlainObject(v2) ? k2 + renderStyle(v2, mark) : "").join("") + "}");
|
|
681
|
-
} else if (k.startsWith("@view-")) {
|
|
682
|
-
css.push(k + renderStyle(v, mark));
|
|
683
|
-
} else {
|
|
684
|
-
css.push(k + "{", null, renderStyle(v, mark) + "}");
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
break;
|
|
688
|
-
case /* '&' */
|
|
689
|
-
38:
|
|
690
|
-
if (isPlainObject(v)) {
|
|
691
|
-
css.push(null, k.slice(1) + renderStyle(v, mark));
|
|
692
|
-
}
|
|
693
|
-
break;
|
|
694
|
-
default:
|
|
695
|
-
inline ??= {};
|
|
696
|
-
inline[k] = v;
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
if (css.length > 0) {
|
|
700
|
-
if (inline) {
|
|
701
|
-
css.unshift(null, renderStyle(inline));
|
|
702
|
-
}
|
|
703
|
-
classList.add(createStyleElement(css));
|
|
704
|
-
} else if (inline) {
|
|
705
|
-
el.style.cssText = renderStyle(inline).slice(1, -1);
|
|
706
|
-
}
|
|
707
|
-
} else if (isString(style)) {
|
|
708
|
-
el.style.cssText = style;
|
|
709
|
-
}
|
|
710
|
-
};
|
|
711
|
-
var renderStyle = (style, mark) => {
|
|
712
|
-
let css = "";
|
|
713
|
-
let vt;
|
|
714
|
-
let cssKey;
|
|
715
|
-
let cssValue;
|
|
716
|
-
for (let [k, v] of Object.entries(style)) {
|
|
717
|
-
v = $(v, mark);
|
|
718
|
-
vt = typeof v;
|
|
719
|
-
if (vt === "string" || vt === "number") {
|
|
720
|
-
cssKey = toHyphenCase(k);
|
|
721
|
-
cssValue = vt === "number" ? regexpIsNonDimensional.test(k) ? "" + v : v + "px" : "" + v;
|
|
722
|
-
css += (css ? ";" : "") + cssKey + ":" + (cssKey === "content" ? JSON.stringify(cssValue) : cssValue) + ";";
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
return "{" + css + "}";
|
|
726
|
-
};
|
|
727
|
-
var createStyleElement = (css) => {
|
|
728
|
-
const hash = hashCode(css.join("")).toString(36);
|
|
729
|
-
const className = "css-" + hash;
|
|
730
|
-
if (!document2.getElementById(className)) {
|
|
731
|
-
const styleEl = document2.head.appendChild(createElement("style"));
|
|
732
|
-
styleEl.id = className;
|
|
733
|
-
styleEl.textContent = css.map((v) => v === null ? "." + className : v).join("");
|
|
734
|
-
}
|
|
735
|
-
return className;
|
|
736
|
-
};
|
|
737
|
-
|
|
738
|
-
// dom/jsx-runtime.ts
|
|
739
|
-
var Fragment = $fragment;
|
|
740
|
-
var jsx = (tag, props = new NullPrototypeObject(), key) => {
|
|
741
|
-
const vnode = [tag, props, $vnode];
|
|
742
|
-
if (key !== void 0) {
|
|
743
|
-
props.key = key;
|
|
744
|
-
}
|
|
745
|
-
return vnode;
|
|
746
|
-
};
|
|
747
|
-
var jsxEscape = (value) => {
|
|
748
|
-
switch (typeof value) {
|
|
749
|
-
case "bigint":
|
|
750
|
-
case "number":
|
|
751
|
-
return String(value);
|
|
752
|
-
case "string":
|
|
753
|
-
return domEscapeHTML(value);
|
|
754
|
-
default:
|
|
755
|
-
return "";
|
|
756
|
-
}
|
|
757
|
-
};
|
|
758
|
-
var html = (template, ...values) => [
|
|
759
|
-
$html,
|
|
760
|
-
{
|
|
761
|
-
innerHTML: isString(template) || template instanceof Reactive ? template : String.raw(template, ...values.map(jsxEscape))
|
|
762
|
-
},
|
|
763
|
-
$vnode
|
|
764
|
-
];
|
|
765
|
-
HTMLElement.prototype.mount = function(node, aboutSignal) {
|
|
766
|
-
render(null, node, this, aboutSignal);
|
|
767
|
-
};
|
|
768
|
-
Object.assign(globalThis, {
|
|
769
|
-
JSX,
|
|
770
|
-
html,
|
|
771
|
-
css: html,
|
|
772
|
-
js: html
|
|
773
|
-
});
|
|
774
|
-
export {
|
|
775
|
-
Fragment,
|
|
776
|
-
JSX,
|
|
777
|
-
atom,
|
|
778
|
-
html as css,
|
|
779
|
-
html,
|
|
780
|
-
html as js,
|
|
781
|
-
jsx,
|
|
782
|
-
jsx as jsxDEV,
|
|
783
|
-
jsx as jsxs,
|
|
784
|
-
store
|
|
785
|
-
};
|
package/types/dom/index.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ChildPrimitiveType } from "../jsx.d.ts";
|
|
2
|
-
|
|
3
|
-
export interface Atom<T> {
|
|
4
|
-
get(): T;
|
|
5
|
-
set(value: T | ((prev: T) => T)): void;
|
|
6
|
-
map(callback: (value: T extends (infer V)[] ? V : T, index: number) => ChildPrimitiveType): ChildPrimitiveType[];
|
|
7
|
-
ref(): T;
|
|
8
|
-
ref<V>(callback: (value: T) => V): V;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export const atom: <T>(initValue: T) => Atom<T>;
|
|
12
|
-
export const store: <T extends Record<string, unknown>>(initValue: T) => T;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { ComponentType, VNode } from "../jsx.d.ts";
|
|
2
|
-
|
|
3
|
-
export const html: JSX.Raw;
|
|
4
|
-
export const JSX: typeof globalThis.JSX;
|
|
5
|
-
export const Fragment: (props: {}) => VNode;
|
|
6
|
-
export const jsx: (tag: string | ComponentType, props: Record<string, unknown>, key?: string | number) => VNode;
|
|
7
|
-
|
|
8
|
-
// aliases
|
|
9
|
-
export { html as css, html as js, jsx as jsxDEV, jsx as jsxs };
|
|
10
|
-
|
|
11
|
-
declare global {
|
|
12
|
-
interface FCExtension<FC> {
|
|
13
|
-
/**
|
|
14
|
-
* Creates a new signals object.
|
|
15
|
-
*
|
|
16
|
-
* **⚠ This is a client-side only API.**
|
|
17
|
-
*/
|
|
18
|
-
extend<T extends Record<string, unknown>>(initValue: T): FC & T;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface HTMLElement {
|
|
22
|
-
/**
|
|
23
|
-
* Mounts a VNode to the DOM element.
|
|
24
|
-
*
|
|
25
|
-
* @mono-jsx
|
|
26
|
-
*/
|
|
27
|
-
mount(node: VNode, aboutSignal?: AbortSignal): void;
|
|
28
|
-
}
|
|
29
|
-
}
|