From e8133db0d005b3b613dff6340944efefc5dc184d Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 16:22:44 +0900 Subject: [PATCH 01/15] wip --- README.md | 2 +- docs/main.js | 4 ++-- docs/mod.js | 2 +- src/$.js | 5 ++--- src/h.js | 11 ++++------- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9f7363a..d43dc93 100644 --- a/README.md +++ b/README.md @@ -110,4 +110,4 @@ function Canvas() { ## License -hstd is [WTFPL licensed](LICENSE). +hstd is [MIT licensed](LICENSE). diff --git a/docs/main.js b/docs/main.js index 6652735..219887d 100644 --- a/docs/main.js +++ b/docs/main.js @@ -105,7 +105,7 @@ export default function() {
- Hstd = HyperStandard is a minimal JavaScript library to build simple, reactive, extensible web interface. + hstd = HyperStandard is a minimal JavaScript library to build simple, reactive, extensible web interface.
@@ -131,7 +131,7 @@ export default function() {

License

- Hstd is ${Link("https://www.wtfpl.net", "WTFPL licensed")}. + hstd is ${Link("https://opensource.org/license/mit", "MIT licensed")}.
`; diff --git a/docs/mod.js b/docs/mod.js index 84cf863..7f21d2b 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var M={},F=function*(t=52){let e=0;for(;e++141)+(n>156)}},I=()=>String.fromCharCode(...F()),w=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[w],$=(t,e)=>t?.constructor===e,S=t=>Object.isFrozen(t)&&Array.isArray(t),P={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},k=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&typeof t=="function"?this.publish():t.toString():e===w},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let n=t[2].get(e);n[1]=!1,delete t[1][n?.[0]]}return this},into([t],e=n=>n){let n=f(e(t));return this.watch(r=>n.$=e(r)),n},until(t,e){return new Promise(n=>{let r=o=>(typeof e=="function"?e(o):o===e)?(this.abort(r),n(this)):0;this.watch(r)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let n=h(e),r=this.into(o=>o.toString(n?e.$:e));return n&&e.watch(o=>r.$=this.$.toString(o)),r},publish(t){let e=Symbol(t[3]);return M[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]}},...Object.keys(P).map(t=>({[t](e,n){let r=h(n),o=P[t],i=this.into(l=>o(l,r?n.$:n));return r&&n.watch(l=>i.$=o(this.$,l)),i}}))),f=(t,[e,n]=[])=>{let r=[],o=new WeakMap,i=Object.assign({name:"$"},n),l=function(u,c,a){return(c||u!==s[0])&&(s[0]=u,r.forEach(m=>o.get(m)?.[1]?m(u):0)),a},s=[t,r,o,x+(n?.name||""),l];return new Proxy(Object.defineProperties(Object(function(...u){let[c]=s;return $(c,Function)?c.apply(null,u):c}),{name:{value:i.name}}),{get(u,c,a){let[m]=s,Y=typeof c;return c==="$"?m:c==="refresh"?l.bind(null,m,!0,a):c==="constructor"||c===w?!0:c===Symbol.hasInstance?()=>!1:k[c]?.bind?.(a,s)||($(m[c],Function)?function(...g){let y=g.map((b,L)=>h(b)?b.watch(N=>(y[L]=N,E.$=a.$[c](...y))).$:b),E=a.into(b=>b[c](...y));return E}:a.into(g=>g[c]))},set(u,c,a){if(c=="$"){let m=e?e(a):a;$(m,Promise)?m.then(l):l(m)}else s[0][c]=h(a)?a.watch(m=>s[0][c]=m).$:a;return!0}})},H=(t,e)=>{let n=I(),r=t.join(n),o=new RegExp(n,"g"),i=e.map((u,c)=>h(u)?u.watch(()=>(i[c]=u.$,s.$=l())).$:u),l=(u=0)=>r.replaceAll(o,()=>i[u++]),s=f(l());return s},W=(t,...e)=>(S(t)&&S(t?.raw)?H:f)(t,e),x;for(;(x=I())in globalThis;);Object.defineProperty(globalThis,x,{value:t=>M[t],configurable:!1,enumerable:!1});var d=(t,e)=>{let n={},r=new Proxy({},{get(l,s){return s===Symbol.toPrimitive?i:s==="$"?i():(n[s]||=f(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=f(l=>{let s={};return Object.keys(l).forEach(u=>s[r[u]]=l[u]),s}),i=()=>o.publish();return r};var j="\0",p=new WeakMap,T=function(t,e,n){j.includes(`\0${t}\0`)||(globalThis.addEventListener(t,r=>p.get(r.target)?.[t]?.forEach(o=>o(r)),{passive:!0}),j+=t+"\0"),p.has(n)||p.set(n,{}),(p.get(n)[t]||=[]).push(e)},z=d(T,t=>"on."+t);var O=Symbol.for("HTML_IDENTIFIER"),A=new WeakMap,B=document.createDocumentFragment(),D={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},_={get(t,e){let n=t[e];return typeof n=="function"&&n.toString().endsWith("() { [native code] }")?n.bind(t):n}},R=(t,e)=>Reflect.ownKeys(e).forEach(G.bind(null,t,e)),G=function(t,e,n){let[r,o]=t,i=e[n],l=typeof n;if(l=="symbol"){let s=globalThis[n.description.slice(0,52)]?.(n);if(!h(s))return;let u=s.$(i,o);if(u?.constructor!==Object)return;R(t,u)}else l=="string"&&(h(i)?(o[n]=i.watch(s=>o[n]=s).$,"\0value\0checked\0".includes(`\0${n}\0`)&&n in o&&T("input",({target:{[n]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):n=="id"&&!(i in r)?r[i]=new Proxy(o,_):o[n]=i)},Z=function([t,e],n,r,o,i){let l=n[i];e[i]?R([r,o],l):o.replaceWith(...l[Symbol.toPrimitive]?.(O)?l:h(l)?l.text():[new Text(l)]),o.removeAttribute(t)},K=function(t,e){let n=t[2](),r={};return n.querySelectorAll(`[${t[0]}]`).forEach(Z.bind(null,t,e,r)),Object.assign(n.childNodes,D,{then(o){return o(r),this}})},q=(t,...e)=>{let n=A.get(t);if(!n){let r=t.join(""),o=0,i;for(;r.includes(i="t"+(BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER))**8n).toString(36)););r=t.join(i);let l=i.length,s=[...r.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:a},index:m})=>m+a),u=[],c=document.createElement("div");B.appendChild(c),c.innerHTML=r.replaceAll(i,(a,m)=>(u[o++]=s.includes(m+l))?i:`
`),A.set(t,n=K.bind(null,[i,u,c.cloneNode.bind(c,!0)]))}return n(e)};var Q=/[A-Z]{1}/g,X={},v=t=>X[t]||="-"+t.toLowerCase(),J={},C=t=>J[t]||=t.replaceAll(Q,v),U=d(function(t,e,{style:n}){let r=C(t);n.setProperty(r,h(e)?e.watch(o=>n.setProperty(r,o)).$:e)},t=>"css-"+C(t));export{W as $,U as css,q as h,z as on,d as prop}; +var M={},N=function*(t=52){let e=0;for(;e++141)+(n>156)}},I=()=>String.fromCharCode(...N()),w=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[w],d=(t,e)=>t?.constructor===e,S=t=>Object.isFrozen(t)&&Array.isArray(t),P={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},k=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&typeof t=="function"?this.publish():t.toString():e===w},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let n=t[2].get(e);n[1]=!1,delete t[1][n?.[0]]}return this},into([t],e=n=>n){let n=f(e(t));return this.watch(r=>n.$=e(r)),n},until(t,e){return new Promise(n=>{let r=o=>(typeof e=="function"?e(o):o===e)?(this.abort(r),n(this)):0;this.watch(r)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let n=h(e),r=this.into(o=>o.toString(n?e.$:e));return n&&e.watch(o=>r.$=this.$.toString(o)),r},publish(t){let e=Symbol(t[3]);return M[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]}},...Object.keys(P).map(t=>({[t](e,n){let r=h(n),o=P[t],i=this.into(c=>o(c,r?n.$:n));return r&&n.watch(c=>i.$=o(this.$,c)),i}}))),f=(t,[e,n]=[])=>{let r=[],o=new WeakMap,i=Object.assign({name:"$"},n),c=function(u,l,m){return(l||u!==s[0])&&(s[0]=u,r.forEach(a=>o.get(a)?.[1]?a(u):0)),m},s=[t,r,o,x+(n?.name||""),c];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=s;return d(l,Function)?l.apply(null,u):l}),{name:{value:i.name}}),{get(u,l,m){let[a]=s;return l==="$"?a:l==="refresh"?c.bind(null,a,!0,m):l==="constructor"||l===w?!0:l===Symbol.hasInstance?()=>!1:k[l]?.bind?.(m,s)||(d(a[l],Function)?function(...y){let $=y.map((b,F)=>h(b)?b.watch(L=>($[F]=L,E.$=m.$[l](...$))).$:b),E=m.into(b=>b[l](...$));return E}:m.into(y=>y[l]))},set(u,l,m){if(l=="$"){let a=e?e(m):m;d(a,Promise)?a.then(c):c(a)}else s[0][l]=h(m)?m.watch(a=>s[0][l]=a).$:m;return!0}})},H=(t,e)=>{let n=I(),r=t.join(n),o=new RegExp(n,"g"),i=e.map((u,l)=>h(u)?u.watch(()=>(i[l]=u.$,s.$=c())).$:u),c=(u=0)=>r.replaceAll(o,()=>i[u++]),s=f(c());return s},W=(t,...e)=>(S(t)&&S(t?.raw)?H:f)(t,e),x;for(;(x=I())in globalThis;);Object.defineProperty(globalThis,x,{value:t=>M[t],configurable:!1,enumerable:!1});var p=(t,e)=>{let n={},r=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(n[s]||=f(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=f(c=>{let s={};return Object.keys(c).forEach(u=>s[r[u]]=c[u]),s}),i=()=>o.publish();return r};var j="\0",g=new WeakMap,T=function(t,e,n){j.includes(`\0${t}\0`)||(globalThis.addEventListener(t,r=>g.get(r.target)?.[t]?.forEach(o=>o(r)),{passive:!0}),j+=t+"\0"),g.has(n)||g.set(n,{}),(g.get(n)[t]||=[]).push(e)},z=p(T,t=>"on."+t);var O=Symbol.for("HTML_IDENTIFIER"),A=new WeakMap,B=document.createDocumentFragment(),D={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},_={get(t,e){let n=t[e];return d(n,Function)?n.bind(t):n}},R=(t,e)=>Reflect.ownKeys(e).forEach(G.bind(null,t,e)),G=function(t,e,n){let[r,o]=t,i=e[n],c=typeof n;if(c=="symbol"){let s=globalThis[n.description.slice(0,52)]?.(n);if(!h(s))return;let u=s.$(i,o);if(u?.constructor!==Object)return;R(t,u)}else c=="string"&&(h(i)?(o[n]=i.watch(s=>o[n]=s).$,"\0value\0checked\0".includes(`\0${n}\0`)&&n in o&&T("input",({target:{[n]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):n=="id"&&!(i in r)?r[i]=new Proxy(o,_):o[n]=i)},Z=function([t,e],n,r,o,i){let c=n[i];e[i]?R([r,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(O)?c:h(c)?c.text():[new Text(c)]),o.removeAttribute(t)},K=function(t,e){let n=t[2](),r={};return n.querySelectorAll(`[${t[0]}]`).forEach(Z.bind(null,t,e,r)),Object.assign(n.childNodes,D,{then(o){return o(r),this}})},q=(t,...e)=>{let n=A.get(t);if(!n){let r=t.join(""),o=0,i="t";for(;r.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););r=t.join(i);let c=i.length,s=[...r.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:m},index:a})=>a+m),u=[],l=document.createElement("div");B.appendChild(l),l.innerHTML=r.replaceAll(i,(m,a)=>(u[o++]=s.includes(a+c))?i:`
`),A.set(t,n=K.bind(null,[i,u,l.cloneNode.bind(l,!0)]))}return n(e)};var Q=/[A-Z]{1}/g,X={},J=t=>X[t]||="-"+t.toLowerCase(),U={},C=t=>U[t]||=t.replaceAll(Q,J),Y=p(function(t,e,{style:n}){let r=C(t);n.setProperty(r,h(e)?e.watch(o=>n.setProperty(r,o)).$:e)},t=>"css-"+C(t));export{W as $,Y as css,q as h,z as on,p as prop}; diff --git a/src/$.js b/src/$.js index bd51562..1b2b727 100644 --- a/src/$.js +++ b/src/$.js @@ -234,8 +234,7 @@ const get(_, prop, reciever) { const - [tmp] = buffer, - typeofProp = typeof prop + [tmp] = buffer ; return ( @@ -369,4 +368,4 @@ Object.defineProperty(globalThis, signature, { * @param { object } options * @returns { object } */ -export { $, isPtr, createPtr }; \ No newline at end of file +export { $, isPtr, createPtr, isConstructedFrom }; \ No newline at end of file diff --git a/src/h.js b/src/h.js index 5dde032..337f719 100644 --- a/src/h.js +++ b/src/h.js @@ -1,4 +1,4 @@ -import { isPtr } from "./$.js"; +import { isPtr, isConstructedFrom } from "./$.js"; import { aEL } from "./on.js"; const @@ -31,10 +31,7 @@ const const targetValue = target[prop]; - return ( - typeof targetValue == "function" && - targetValue.toString().endsWith("() { [native code] }") - ) + return isConstructedFrom(targetValue, Function) ? targetValue.bind(target) : targetValue ; @@ -151,10 +148,10 @@ export const h = (s, ...v) => { let joined = s.join(""), replacementCounter = 0, - tokenBuf + tokenBuf = "t" ; - while(joined.includes(tokenBuf = "t" + (BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)) ** 8n).toString(36))); + while(joined.includes(tokenBuf += BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)).toString(36))); joined = s.join(tokenBuf); From 2201d6fe598288c2192b97a76992dd8d859ebfcb Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 17:40:35 +0900 Subject: [PATCH 02/15] wip --- docs/mod.js | 2 +- src/$.js | 93 ++++++++++++++++++++++++++++++++--------------------- 2 files changed, 58 insertions(+), 37 deletions(-) diff --git a/docs/mod.js b/docs/mod.js index 7f21d2b..7c08344 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var M={},N=function*(t=52){let e=0;for(;e++141)+(n>156)}},I=()=>String.fromCharCode(...N()),w=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[w],d=(t,e)=>t?.constructor===e,S=t=>Object.isFrozen(t)&&Array.isArray(t),P={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},k=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&typeof t=="function"?this.publish():t.toString():e===w},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let n=t[2].get(e);n[1]=!1,delete t[1][n?.[0]]}return this},into([t],e=n=>n){let n=f(e(t));return this.watch(r=>n.$=e(r)),n},until(t,e){return new Promise(n=>{let r=o=>(typeof e=="function"?e(o):o===e)?(this.abort(r),n(this)):0;this.watch(r)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let n=h(e),r=this.into(o=>o.toString(n?e.$:e));return n&&e.watch(o=>r.$=this.$.toString(o)),r},publish(t){let e=Symbol(t[3]);return M[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]}},...Object.keys(P).map(t=>({[t](e,n){let r=h(n),o=P[t],i=this.into(c=>o(c,r?n.$:n));return r&&n.watch(c=>i.$=o(this.$,c)),i}}))),f=(t,[e,n]=[])=>{let r=[],o=new WeakMap,i=Object.assign({name:"$"},n),c=function(u,l,m){return(l||u!==s[0])&&(s[0]=u,r.forEach(a=>o.get(a)?.[1]?a(u):0)),m},s=[t,r,o,x+(n?.name||""),c];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=s;return d(l,Function)?l.apply(null,u):l}),{name:{value:i.name}}),{get(u,l,m){let[a]=s;return l==="$"?a:l==="refresh"?c.bind(null,a,!0,m):l==="constructor"||l===w?!0:l===Symbol.hasInstance?()=>!1:k[l]?.bind?.(m,s)||(d(a[l],Function)?function(...y){let $=y.map((b,F)=>h(b)?b.watch(L=>($[F]=L,E.$=m.$[l](...$))).$:b),E=m.into(b=>b[l](...$));return E}:m.into(y=>y[l]))},set(u,l,m){if(l=="$"){let a=e?e(m):m;d(a,Promise)?a.then(c):c(a)}else s[0][l]=h(m)?m.watch(a=>s[0][l]=a).$:m;return!0}})},H=(t,e)=>{let n=I(),r=t.join(n),o=new RegExp(n,"g"),i=e.map((u,l)=>h(u)?u.watch(()=>(i[l]=u.$,s.$=c())).$:u),c=(u=0)=>r.replaceAll(o,()=>i[u++]),s=f(c());return s},W=(t,...e)=>(S(t)&&S(t?.raw)?H:f)(t,e),x;for(;(x=I())in globalThis;);Object.defineProperty(globalThis,x,{value:t=>M[t],configurable:!1,enumerable:!1});var p=(t,e)=>{let n={},r=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(n[s]||=f(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=f(c=>{let s={};return Object.keys(c).forEach(u=>s[r[u]]=c[u]),s}),i=()=>o.publish();return r};var j="\0",g=new WeakMap,T=function(t,e,n){j.includes(`\0${t}\0`)||(globalThis.addEventListener(t,r=>g.get(r.target)?.[t]?.forEach(o=>o(r)),{passive:!0}),j+=t+"\0"),g.has(n)||g.set(n,{}),(g.get(n)[t]||=[]).push(e)},z=p(T,t=>"on."+t);var O=Symbol.for("HTML_IDENTIFIER"),A=new WeakMap,B=document.createDocumentFragment(),D={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},_={get(t,e){let n=t[e];return d(n,Function)?n.bind(t):n}},R=(t,e)=>Reflect.ownKeys(e).forEach(G.bind(null,t,e)),G=function(t,e,n){let[r,o]=t,i=e[n],c=typeof n;if(c=="symbol"){let s=globalThis[n.description.slice(0,52)]?.(n);if(!h(s))return;let u=s.$(i,o);if(u?.constructor!==Object)return;R(t,u)}else c=="string"&&(h(i)?(o[n]=i.watch(s=>o[n]=s).$,"\0value\0checked\0".includes(`\0${n}\0`)&&n in o&&T("input",({target:{[n]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):n=="id"&&!(i in r)?r[i]=new Proxy(o,_):o[n]=i)},Z=function([t,e],n,r,o,i){let c=n[i];e[i]?R([r,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(O)?c:h(c)?c.text():[new Text(c)]),o.removeAttribute(t)},K=function(t,e){let n=t[2](),r={};return n.querySelectorAll(`[${t[0]}]`).forEach(Z.bind(null,t,e,r)),Object.assign(n.childNodes,D,{then(o){return o(r),this}})},q=(t,...e)=>{let n=A.get(t);if(!n){let r=t.join(""),o=0,i="t";for(;r.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););r=t.join(i);let c=i.length,s=[...r.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:m},index:a})=>a+m),u=[],l=document.createElement("div");B.appendChild(l),l.innerHTML=r.replaceAll(i,(m,a)=>(u[o++]=s.includes(a+c))?i:`
`),A.set(t,n=K.bind(null,[i,u,l.cloneNode.bind(l,!0)]))}return n(e)};var Q=/[A-Z]{1}/g,X={},J=t=>X[t]||="-"+t.toLowerCase(),U={},C=t=>U[t]||=t.replaceAll(Q,J),Y=p(function(t,e,{style:n}){let r=C(t);n.setProperty(r,h(e)?e.watch(o=>n.setProperty(r,o)).$:e)},t=>"css-"+C(t));export{W as $,Y as css,q as h,z as on,p as prop}; +var j=()=>String.fromCharCode(...H()),O={},H=function*(t=52){let e=0;for(;e++141)+(n>156)}},x;for(;(x=j())in globalThis;);Object.defineProperty(globalThis,x,{value:t=>O[t],configurable:!1,enumerable:!1});var{Promise:T,Function:p}=globalThis,E=Symbol.for("PTR_IDENTIFIER"),a=t=>t?.[E],f=(t,e)=>t?.constructor===e,M=t=>Object.isFrozen(t)&&f(t,Array),I={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},_=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,p)?this.publish():t.toString():e===E},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let n=t[2].get(e);n[1]=!1,delete t[1][n?.[0]]}return this},into([t],e=n=>n){let n=o=>{let i=e(o);return f(i,T)?(i.then(c=>r.$=c),void 0):r.$=i},r=b();return n(t),this.watch(n),r},until(t,e){return new T(n=>{let r=o=>(f(e,p)?e(o):o===e)?(this.abort(r),n(this)):0;this.watch(r)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let n=a(e),r=this.into(o=>o.toString(n?e.$:e));return n&&e.watch(o=>r.$=this.$.toString(o)),r},publish(t){let e=Symbol(t[3]);return O[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let n=b(this.$),r;return this.watch(o=>{clearTimeout(r),r=setTimeout(()=>n.$=o,a(e)?e.$:e)}),n}},...Object.keys(I).map(t=>({[t](e,n){let r=a(n),o=I[t],i=this.into(c=>o(c,r?n.$:n));return r&&n.watch(c=>i.$=o(this.$,c)),i}}))),b=(t,[e,n]=[])=>{let r=[],o=new WeakMap,i=Object.assign({name:"$"},n),c=function(u,l,m){return(l||u!==s[0])&&(s[0]=u,r.forEach(h=>o.get(h)?.[1]?h(u):0)),m},s=[t,r,o,x+(n?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=s;return f(l,p)?l.apply(null,u):l}),{name:{value:i.name}}),{get(u,l,m){let[h]=s;return l==="$"?h:l==="refresh"?c.bind(null,h,!0,m):l==="constructor"||l===E?!0:l===Symbol.hasInstance?()=>!1:_[l]?.bind?.(m,s)||(f(h[l],p)?function(...y){let w=y.map((d,N)=>a(d)?d.watch(k=>(w[N]=k,P.$=m.$[l](...w))).$:d),P=m.into(d=>d[l](...w));return P}:m.into(y=>y[l]))},set(u,l,m){if(l=="$"){let h=e?e(m):m;f(h,T)?h.then(c):c(h)}else s[0][l]=a(m)?m.watch(h=>s[0][l]=h).$:m;return!0}})},B=(t,e)=>{let n=j(),r=t.join(n),o=new RegExp(n,"g"),i=e.map((u,l)=>a(u)?u.watch(()=>(i[l]=u.$,s.$=c())).$:u),c=(u=0)=>r.replaceAll(o,()=>i[u++]),s=b(c());return s},W=b(globalThis),z=new Proxy((t,...e)=>(M(t)&&M(t?.raw)?B:b)(t,e),{get:(t,e)=>W[e]});var g=(t,e)=>{let n={},r=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(n[s]||=b(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=b(c=>{let s={};return Object.keys(c).forEach(u=>s[r[u]]=c[u]),s}),i=()=>o.publish();return r};var R="\0",$=new WeakMap,S=function(t,e,n){R.includes(`\0${t}\0`)||(globalThis.addEventListener(t,r=>$.get(r.target)?.[t]?.forEach(o=>o(r)),{passive:!0}),R+=t+"\0"),$.has(n)||$.set(n,{}),($.get(n)[t]||=[]).push(e)},D=g(S,t=>"on."+t);var C=Symbol.for("HTML_IDENTIFIER"),A=new WeakMap,G=document.createDocumentFragment(),Z={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===C},toString(){return this[Symbol.toPrimitive]("string")}},K={get(t,e){let n=t[e];return f(n,Function)?n.bind(t):n}},F=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,n){let[r,o]=t,i=e[n],c=typeof n;if(c=="symbol"){let s=globalThis[n.description.slice(0,52)]?.(n);if(!a(s))return;let u=s.$(i,o);if(u?.constructor!==Object)return;F(t,u)}else c=="string"&&(a(i)?(o[n]=i.watch(s=>o[n]=s).$,"\0value\0checked\0".includes(`\0${n}\0`)&&n in o&&S("input",({target:{[n]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):n=="id"&&!(i in r)?r[i]=new Proxy(o,K):o[n]=i)},Q=function([t,e],n,r,o,i){let c=n[i];e[i]?F([r,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(C)?c:a(c)?c.text():[new Text(c)]),o.removeAttribute(t)},X=function(t,e){let n=t[2](),r={};return n.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,r)),Object.assign(n.childNodes,Z,{then(o){return o(r),this}})},J=(t,...e)=>{let n=A.get(t);if(!n){let r=t.join(""),o=0,i="t";for(;r.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););r=t.join(i);let c=i.length,s=[...r.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:m},index:h})=>h+m),u=[],l=document.createElement("div");G.appendChild(l),l.innerHTML=r.replaceAll(i,(m,h)=>(u[o++]=s.includes(h+c))?i:`
`),A.set(t,n=X.bind(null,[i,u,l.cloneNode.bind(l,!0)]))}return n(e)};var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),tt=g(function(t,e,{style:n}){let r=L(t);n.setProperty(r,a(e)?e.watch(o=>n.setProperty(r,o)).$:e)},t=>"css-"+L(t));export{z as $,tt as css,J as h,D as on,g as prop}; diff --git a/src/$.js b/src/$.js index 1b2b727..80bfcca 100644 --- a/src/$.js +++ b/src/$.js @@ -1,5 +1,7 @@ const + createSignature = () => String.fromCharCode(...resolverSignatureGenCB()), + publishedPtr = {}, resolverSignatureGenCB = function*(length = 52) { @@ -8,9 +10,22 @@ const let buf = Math.floor(Math.random() * 31) yield 0x7f + buf + (buf > 0x8d) + (buf > 0x9c) }; - }, + } +; - createSignature = () => String.fromCharCode(...resolverSignatureGenCB()), +let signature; + +while((signature = createSignature()) in globalThis); + +Object.defineProperty(globalThis, signature, { + value: (symbol) => publishedPtr[symbol], + configurable: !1, + enumerable: !1 +}); + +const + + { Promise, Function } = globalThis, PTR_IDENTIFIER = Symbol.for("PTR_IDENTIFIER"), @@ -18,7 +33,7 @@ const isConstructedFrom = (object, proto) => object?.constructor === proto, - isFrozenArray = (arr) => Object.isFrozen(arr) && Array.isArray(arr), + isFrozenArray = (arr) => Object.isFrozen(arr) && isConstructedFrom(arr, Array), logicOps = { or: (a, b) => a || b, @@ -44,7 +59,7 @@ const return ( typeof hint === "string" - ? hint === "string" && typeof value == "function" + ? hint === "string" && isConstructedFrom(value, Function) ? this.publish() : value.toString() : hint === PTR_IDENTIFIER @@ -79,9 +94,19 @@ const into([value], transformerFn = $ => $) { - const newPtr = createPtr(transformerFn(value)) + const + binder = value => { + const tmp = transformerFn(value); + return isConstructedFrom(tmp, Promise) + ? (tmp.then($ => newPtr.$ = $), undefined) + : newPtr.$ = tmp; + }, + newPtr = createPtr() + ; + + binder(value); - this.watch($ => newPtr.$ = transformerFn($)); + this.watch(binder); return newPtr; }, @@ -90,7 +115,7 @@ const return new Promise(r => { - const watcherFn = $ => (typeof value == "function" ? value($) : $ === value) + const watcherFn = $ => (isConstructedFrom(value, Function) ? value($) : $ === value) ? (this.abort(watcherFn), r(this)) : 0 ; @@ -100,15 +125,6 @@ const }) }, - // refresh(buffer) { - // buffer[4]?.(0, true, this); - // return this; - // }, - - // sync(buffer, ...ptrs) { - // ptrs.forEach(ptr => isPtr(ptr) ? ptr.watch($ => this.$ = this.$) : 0) - // }, - switch() { this.$ = !this.$; @@ -168,7 +184,21 @@ const return [text] - } + }, + + timeout(_, delay) { + + const ptr = createPtr(this.$); + let timeoutIdBuf; + + this.watch($ => { + clearTimeout(timeoutIdBuf); + timeoutIdBuf = setTimeout(() => ptr.$ = $, isPtr(delay) ? delay.$ : delay) + }) + + return ptr; + + }, }, ...Object.keys(logicOps).map(op => ({ @@ -214,8 +244,7 @@ const value, watchers, watcherInfo, - signature + (options?.name || ""), - execWatcher + signature + (options?.name || "") ] ; @@ -238,12 +267,7 @@ const ; return ( - - // typeofProp == "string" - - // string - - /**? */ prop === "$" ? tmp + prop === "$" ? tmp : prop === "refresh" ? execWatcher.bind(null, tmp, !0, reciever) : prop === "constructor" ? !0 @@ -348,18 +372,15 @@ const // }, - $ = (x, ...y) => (isFrozenArray(x) && isFrozenArray(x?.raw) ? createTemp : createPtr)(x, y) -; + globalPtr = createPtr(globalThis), -let signature; - -while((signature = createSignature()) in globalThis); - -Object.defineProperty(globalThis, signature, { - value: (symbol) => publishedPtr[symbol], - configurable: !1, - enumerable: !1 -}); + $ = new Proxy( + (x, ...y) => (isFrozenArray(x) && isFrozenArray(x?.raw) ? createTemp : createPtr)(x, y), + { + get: (_, prop) => globalPtr[prop] + } + ) +; /** * From 17db552a5aefeb383b38d112caa0e9e249e7b5be Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 17:40:46 +0900 Subject: [PATCH 03/15] 0.1.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab50944..dac8fad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "libh", - "version": "0.0.108", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "libh", - "version": "0.0.108", + "version": "0.1.2", "license": "WTFPL" } } diff --git a/package.json b/package.json index 206336c..6d39623 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hstd", - "version": "0.1.1", + "version": "0.1.2", "description": "simple library to build reactive, extensive, reusable web interface.", "type": "module", "main": "./src/mod.js", From f8fd40b146d567fe4d3585735f4a4b11329f701f Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 20:10:13 +0900 Subject: [PATCH 04/15] wip --- docs/mod.js | 2 +- src/$.js | 399 +++++------------------------------------ src/core/checker.js | 7 + src/core/listen.js | 32 ++++ src/core/pointer.js | 346 +++++++++++++++++++++++++++++++++++ src/{ => core}/prop.js | 8 +- src/css.js | 6 +- src/h.js | 13 +- src/mod.js | 9 +- src/on.js | 36 +--- 10 files changed, 455 insertions(+), 403 deletions(-) create mode 100644 src/core/checker.js create mode 100644 src/core/listen.js create mode 100644 src/core/pointer.js rename src/{ => core}/prop.js (62%) diff --git a/docs/mod.js b/docs/mod.js index 7c08344..f1774b8 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var j=()=>String.fromCharCode(...H()),O={},H=function*(t=52){let e=0;for(;e++141)+(n>156)}},x;for(;(x=j())in globalThis;);Object.defineProperty(globalThis,x,{value:t=>O[t],configurable:!1,enumerable:!1});var{Promise:T,Function:p}=globalThis,E=Symbol.for("PTR_IDENTIFIER"),a=t=>t?.[E],f=(t,e)=>t?.constructor===e,M=t=>Object.isFrozen(t)&&f(t,Array),I={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},_=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,p)?this.publish():t.toString():e===E},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let n=t[2].get(e);n[1]=!1,delete t[1][n?.[0]]}return this},into([t],e=n=>n){let n=o=>{let i=e(o);return f(i,T)?(i.then(c=>r.$=c),void 0):r.$=i},r=b();return n(t),this.watch(n),r},until(t,e){return new T(n=>{let r=o=>(f(e,p)?e(o):o===e)?(this.abort(r),n(this)):0;this.watch(r)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let n=a(e),r=this.into(o=>o.toString(n?e.$:e));return n&&e.watch(o=>r.$=this.$.toString(o)),r},publish(t){let e=Symbol(t[3]);return O[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let n=b(this.$),r;return this.watch(o=>{clearTimeout(r),r=setTimeout(()=>n.$=o,a(e)?e.$:e)}),n}},...Object.keys(I).map(t=>({[t](e,n){let r=a(n),o=I[t],i=this.into(c=>o(c,r?n.$:n));return r&&n.watch(c=>i.$=o(this.$,c)),i}}))),b=(t,[e,n]=[])=>{let r=[],o=new WeakMap,i=Object.assign({name:"$"},n),c=function(u,l,m){return(l||u!==s[0])&&(s[0]=u,r.forEach(h=>o.get(h)?.[1]?h(u):0)),m},s=[t,r,o,x+(n?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=s;return f(l,p)?l.apply(null,u):l}),{name:{value:i.name}}),{get(u,l,m){let[h]=s;return l==="$"?h:l==="refresh"?c.bind(null,h,!0,m):l==="constructor"||l===E?!0:l===Symbol.hasInstance?()=>!1:_[l]?.bind?.(m,s)||(f(h[l],p)?function(...y){let w=y.map((d,N)=>a(d)?d.watch(k=>(w[N]=k,P.$=m.$[l](...w))).$:d),P=m.into(d=>d[l](...w));return P}:m.into(y=>y[l]))},set(u,l,m){if(l=="$"){let h=e?e(m):m;f(h,T)?h.then(c):c(h)}else s[0][l]=a(m)?m.watch(h=>s[0][l]=h).$:m;return!0}})},B=(t,e)=>{let n=j(),r=t.join(n),o=new RegExp(n,"g"),i=e.map((u,l)=>a(u)?u.watch(()=>(i[l]=u.$,s.$=c())).$:u),c=(u=0)=>r.replaceAll(o,()=>i[u++]),s=b(c());return s},W=b(globalThis),z=new Proxy((t,...e)=>(M(t)&&M(t?.raw)?B:b)(t,e),{get:(t,e)=>W[e]});var g=(t,e)=>{let n={},r=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(n[s]||=b(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=b(c=>{let s={};return Object.keys(c).forEach(u=>s[r[u]]=c[u]),s}),i=()=>o.publish();return r};var R="\0",$=new WeakMap,S=function(t,e,n){R.includes(`\0${t}\0`)||(globalThis.addEventListener(t,r=>$.get(r.target)?.[t]?.forEach(o=>o(r)),{passive:!0}),R+=t+"\0"),$.has(n)||$.set(n,{}),($.get(n)[t]||=[]).push(e)},D=g(S,t=>"on."+t);var C=Symbol.for("HTML_IDENTIFIER"),A=new WeakMap,G=document.createDocumentFragment(),Z={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===C},toString(){return this[Symbol.toPrimitive]("string")}},K={get(t,e){let n=t[e];return f(n,Function)?n.bind(t):n}},F=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,n){let[r,o]=t,i=e[n],c=typeof n;if(c=="symbol"){let s=globalThis[n.description.slice(0,52)]?.(n);if(!a(s))return;let u=s.$(i,o);if(u?.constructor!==Object)return;F(t,u)}else c=="string"&&(a(i)?(o[n]=i.watch(s=>o[n]=s).$,"\0value\0checked\0".includes(`\0${n}\0`)&&n in o&&S("input",({target:{[n]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):n=="id"&&!(i in r)?r[i]=new Proxy(o,K):o[n]=i)},Q=function([t,e],n,r,o,i){let c=n[i];e[i]?F([r,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(C)?c:a(c)?c.text():[new Text(c)]),o.removeAttribute(t)},X=function(t,e){let n=t[2](),r={};return n.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,r)),Object.assign(n.childNodes,Z,{then(o){return o(r),this}})},J=(t,...e)=>{let n=A.get(t);if(!n){let r=t.join(""),o=0,i="t";for(;r.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););r=t.join(i);let c=i.length,s=[...r.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:m},index:h})=>h+m),u=[],l=document.createElement("div");G.appendChild(l),l.innerHTML=r.replaceAll(i,(m,h)=>(u[o++]=s.includes(h+c))?i:`
`),A.set(t,n=X.bind(null,[i,u,l.cloneNode.bind(l,!0)]))}return n(e)};var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),tt=g(function(t,e,{style:n}){let r=L(t);n.setProperty(r,a(e)?e.watch(o=>n.setProperty(r,o)).$:e)},t=>"css-"+L(t));export{z as $,tt as css,J as h,D as on,g as prop}; +var C="\0",p=new WeakMap,d=function(t,e,r){C.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>p.get(n.target)?.[t]?.forEach(o=>o(n)),{passive:!0}),C+=t+"\0"),p.has(r)||p.set(r,{}),(p.get(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:w}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[S],E=()=>String.fromCharCode(...z()),j={},z=function*(t=52){let e=0;for(;e++141)+(r>156)}},R={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},_=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,w)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let i=e(o);return f(i,P)?(i.then(c=>n.$=c),void 0):n.$=i},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,w)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=h(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return j[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,h(e)?e.$:e)}),r}},...Object.keys(R).map(t=>({[t](e,r){let n=h(r),o=R[t],i=this.into(c=>o(c,n?r.$:r));return n&&r.watch(c=>i.$=o(this.$,c)),i}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,i=Object.assign({name:"$",writable:!0},r),c=function(m,l,u){return(l||m!==s[0])&&(s[0]=m,n.forEach(a=>o.get(a)?.[1]?a(m):0)),u},s=[t,n,o,M+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...m){let[l]=s;return f(l,w)?l.apply(null,m):l}),{name:{value:i.name}}),{get(m,l,u){let[a]=s;return l==="$"?a:l==="refresh"?c.bind(null,a,!0,u):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:_[l]?.bind?.(u,s)||(f(a[l],w)?function(...y){let T=y.map((g,L)=>h(g)?g.watch(W=>(T[L]=W,I.$=u.$[l](...T))).$:g),I=u.into(g=>g[l](...T));return I}:u.into(y=>y[l]))},set(m,l,u){if(i.writable)if(l=="$"){let a=e?e(u):u;f(a,P)?a.then(c):c(a)}else s[0][l]=h(u)?u.watch(a=>s[0][l]=a).$:u;return!0}})},M;for(;(M=E())in globalThis;);Object.defineProperty(globalThis,M,{value:t=>j[t],configurable:!1,enumerable:!1});var k=(t,e)=>{let r=E(),n=t.join(r),o=new RegExp(r,"g"),i=e.map((m,l)=>h(m)?m.watch(()=>(i[l]=m.$,s.$=c())).$:m),c=(m=0)=>n.replaceAll(o,()=>i[m++]),s=b(c());return s},A={},B="\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0",st=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{let r=A[e];return r||B.includes(`\0${r}\0`)&&(r=A[e]=b(globalThis[e],void 0,{writable:!1}),d(window,"resize",()=>r.$=globalThis[e])),r||D[e]}}),D=b(globalThis);var F=Symbol.for("HTML_IDENTIFIER"),O=new WeakMap,G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===F},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,i=e[r],c=typeof r;if(c=="symbol"){let s=globalThis[r.description.slice(0,52)]?.(r);if(!h(s))return;let m=s.$(i,o);if(m?.constructor!==Object)return;H(t,m)}else c=="string"&&(h(i)?(o[r]=i.watch(s=>o[r]=s).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&d("input",({target:{[r]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):r=="id"&&!(i in n)?n[i]=new Proxy(o,Z):o[r]=i)},Q=function([t,e],r,n,o,i){let c=r[i];e[i]?H([n,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(F)?c:h(c)?c.text():[new Text(c)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},at=(t,...e)=>{let r=O.get(t);if(!r){let n=t.join(""),o=0,i="t";for(;n.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););n=t.join(i);let c=i.length,s=[...n.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:u},index:a})=>a+u),m=[],l=document.createElement("div");G.appendChild(l),l.innerHTML=n.replaceAll(i,(u,a)=>(m[o++]=s.includes(a+c))?i:`
`),O.set(t,r=X.bind(null,[i,m,l.cloneNode.bind(l,!0)]))}return r(e)};var $=(t,e)=>{let r={},n=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(r[s]||=b(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=b(c=>{let s={};return Reflect.ownKeys(c).forEach(m=>s[n[m]]=c[m]),s}),i=()=>o.publish();return n};var pt=$(d,t=>"on."+t);var v=/[A-Z]{1}/g,J={},U=t=>J[t]||="-"+t.toLowerCase(),Y={},N=t=>Y[t]||=t.replaceAll(v,U),Tt=$(function(t,e,{style:r}){let n=N(t);r.setProperty(n,h(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+N(t));export{st as $,Tt as css,at as h,pt as on}; diff --git a/src/$.js b/src/$.js index 80bfcca..2a347d8 100644 --- a/src/$.js +++ b/src/$.js @@ -1,348 +1,11 @@ -const - - createSignature = () => String.fromCharCode(...resolverSignatureGenCB()), - - publishedPtr = {}, - - resolverSignatureGenCB = function*(length = 52) { - let c = 0; - while(c++ < length) { - let buf = Math.floor(Math.random() * 31) - yield 0x7f + buf + (buf > 0x8d) + (buf > 0x9c) - }; - } -; +import { listen } from "./core/listen.js"; -let signature; +import { createPointer, createSignature, isPointer } from "./core/pointer.js"; -while((signature = createSignature()) in globalThis); - -Object.defineProperty(globalThis, signature, { - value: (symbol) => publishedPtr[symbol], - configurable: !1, - enumerable: !1 -}); +import { isFrozenArray } from "./core/checker.js"; const - { Promise, Function } = globalThis, - - PTR_IDENTIFIER = Symbol.for("PTR_IDENTIFIER"), - - isPtr = (ptr) => ptr?.[PTR_IDENTIFIER], - - isConstructedFrom = (object, proto) => object?.constructor === proto, - - isFrozenArray = (arr) => Object.isFrozen(arr) && isConstructedFrom(arr, Array), - - logicOps = { - or: (a, b) => a || b, - and: (a, b) => a && b, - xor: (a, b) => a ^ b, - - sum: (a, b) => a + b, - sub: (a, b) => a - b, - mul: (a, b) => a * b, - div: (a, b) => a / b, - mod: (a, b) => a % b, - - // rsh: (a, b) => a >> b, - // ursh: (a, b) => a >>> b, - // lsh: (a, b) => a << b, - }, - - opTemp = Object.assign( - - { - - [Symbol.toPrimitive]([value], hint) { - - return ( - typeof hint === "string" - ? hint === "string" && isConstructedFrom(value, Function) - ? this.publish() - : value.toString() - : hint === PTR_IDENTIFIER - ); - - }, - - watch(buffer, watcherFn) { - - if(watcherFn) { - buffer[2].set(watcherFn, [ - buffer[1].push(watcherFn) - 1, - !0 - ]) - }; - - return this; - - }, - - abort(buffer, watcherFn) { - - if(watcherFn) { - const info = buffer[2].get(watcherFn); - info[1] = !1; - delete buffer[1][info?.[0]]; - }; - - return this; - - }, - - into([value], transformerFn = $ => $) { - - const - binder = value => { - const tmp = transformerFn(value); - return isConstructedFrom(tmp, Promise) - ? (tmp.then($ => newPtr.$ = $), undefined) - : newPtr.$ = tmp; - }, - newPtr = createPtr() - ; - - binder(value); - - this.watch(binder); - - return newPtr; - }, - - until(_, value) { - - return new Promise(r => { - - const watcherFn = $ => (isConstructedFrom(value, Function) ? value($) : $ === value) - ? (this.abort(watcherFn), r(this)) - : 0 - ; - - this.watch(watcherFn); - - }) - }, - - switch() { - - this.$ = !this.$; - - return this; - - }, - - not() { - - return this.into($ => !$) - - }, - - bool() { - - return this.into($ => !!$) - - }, - - tick() { - - let bool = false; - - return this.into(() => bool = !bool) - - }, - - toString(_, base) { - - const - isPtrCache = isPtr(base), - ptr = this.into($ => $.toString(isPtrCache ? base.$ : base)) - ; - - isPtrCache ? base.watch($ => ptr.$ = this.$.toString($)) : 0; - - return ptr; - - }, - - publish(buffer) { - - const symbol = Symbol(buffer[3]); - - publishedPtr[symbol] = this; - - return symbol; - - }, - - text() { - - const text = new Text(this.$); - - this.watch($ => text.textContent = $); - - return [text] - - }, - - timeout(_, delay) { - - const ptr = createPtr(this.$); - let timeoutIdBuf; - - this.watch($ => { - clearTimeout(timeoutIdBuf); - timeoutIdBuf = setTimeout(() => ptr.$ = $, isPtr(delay) ? delay.$ : delay) - }) - - return ptr; - - }, - }, - - ...Object.keys(logicOps).map(op => ({ - - [op](_, value) { - - const - isPtrCache = isPtr(value), - boolOp = logicOps[op], - ptr = this.into($ => boolOp($, isPtrCache ? value.$ : value)) - ; - - isPtrCache ? value.watch($ => ptr.$ = boolOp(this.$, $)) : 0; - - return ptr; - - } - - })), - - // ...Object.keys(Math).filter(x => typeof Math[x] == "function").map(x => ({ - // [x](buffer, args) { - // - // } - // })) - - ), - - createPtr = (value, [setter, options] = []) => { - - const - watchers = [], - watcherInfo = new WeakMap(), - formattedOptions = Object.assign({ name: "$" }, options), - execWatcher = function (value, force, ptr) { - (force || (value !== buffer[0])) - ? (buffer[0] = value, watchers.forEach(fn => watcherInfo.get(fn)?.[1] ? fn(value) : 0)) - : 0 - ; - return ptr; - }, - buffer = [ - value, - watchers, - watcherInfo, - signature + (options?.name || "") - ] - ; - - return new Proxy( - - Object.defineProperties(Object(function(...args) { - - const [tmp] = buffer; - - return isConstructedFrom(tmp, Function) ? tmp.apply(null, args) : tmp; - - }), { name: { value: formattedOptions.name } }), - - { - - get(_, prop, reciever) { - - const - [tmp] = buffer - ; - - return ( - prop === "$" ? tmp - : prop === "refresh" ? execWatcher.bind(null, tmp, !0, reciever) - : prop === "constructor" ? !0 - - - : prop === PTR_IDENTIFIER ? !0 - : prop === Symbol.hasInstance ? () => !1 - - : ( - opTemp[prop]?.bind?.(reciever, buffer) || ( - - isConstructedFrom(tmp[prop], Function) - - ? function(...args) { - - const - argMap = args.map((arg, i) => ( - - isPtr(arg) - - ? arg.watch($ => ( - argMap[i] = $, - ptrBuf.$ = reciever.$[prop](...argMap) - )).$ - - : arg - )), - - ptrBuf = reciever.into($ => $[prop](...argMap)) - ; - - return ptrBuf - - } - - : reciever.into($ => $[prop]) - - ) - ) - - // symbol - - - // : ("" - - // ) - ); - - }, - - set(_, prop, newValue) { - - if(prop == "$") { - - const tmp = setter ? setter(newValue) : newValue; - - isConstructedFrom(tmp, Promise) ? tmp.then(execWatcher) : execWatcher(tmp) - - } else { - - buffer[0][prop] = ( - isPtr(newValue) - ? newValue.watch($ => buffer[0][prop] = $).$ - : newValue - ) - } - - return !0; - - } - - } - - ) - }, - createTemp = (s, v) => { const @@ -350,38 +13,68 @@ const temp = s.join(code), tempMatcherRegex = new RegExp(code, "g"), vMap = v.map((vt, i) => ( - isPtr(vt) + isPointer(vt) ? vt.watch(() => (vMap[i] = vt.$, ptr.$ = refreshTemp())).$ : vt )), refreshTemp = (x = 0) => temp.replaceAll(tempMatcherRegex, () => vMap[x++]), - ptr = createPtr(refreshTemp()) + ptr = createPointer(refreshTemp()) ; return ptr; }, - // createEffect = (watcher, ...ptrs) => { - // const tmp = createPtr(watcher()); + globalPropPtrCache = {}, - // ptrs.forEach((ptr) => ptr.watch(() => tmp.$ = watcher())); + globalPropCaptureTarget = "\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0", - // return tmp; + $ = new Proxy( + (x, ...y) => (isFrozenArray(x) && isFrozenArray(x?.raw) ? createTemp : createPointer)(x, y), + { + get: (_, prop) => { - // }, + let tmp = globalPropPtrCache[prop]; - globalPtr = createPtr(globalThis), + if(!tmp) { - $ = new Proxy( - (x, ...y) => (isFrozenArray(x) && isFrozenArray(x?.raw) ? createTemp : createPtr)(x, y), - { - get: (_, prop) => globalPtr[prop] + if(globalPropCaptureTarget.includes(`\0${tmp}\0`)) { + + tmp = globalPropPtrCache[prop] = createPointer(globalThis[prop], void 0, { writable: false }); + + listen( + window, + "resize", + () => tmp.$ = globalThis[prop] + ) + + }; + } + + return tmp || globalPtr[prop]; + + } } ) ; +// [ + +// ["innerWidth\0innerHeight\0outerWidth\0outerHeight", "resize"] + +// ].forEach((props, eventType) => { + +// aEL( +// globalThis, +// eventType, +// () => props.forEach(prop => globalPropPtrCache[prop].$ = globalThis[prop]) +// ) + +// }); + +const globalPtr = createPointer(globalThis); + /** * * @param { number | string | any[] } value @@ -389,4 +82,4 @@ const * @param { object } options * @returns { object } */ -export { $, isPtr, createPtr, isConstructedFrom }; \ No newline at end of file +export { $ }; \ No newline at end of file diff --git a/src/core/checker.js b/src/core/checker.js new file mode 100644 index 0000000..3bc8dea --- /dev/null +++ b/src/core/checker.js @@ -0,0 +1,7 @@ +export const + + isConstructedFrom = (object, proto) => object?.constructor === proto, + + isFrozenArray = (arr) => Object.isFrozen(arr) && isConstructedFrom(arr, Array) + +; \ No newline at end of file diff --git a/src/core/listen.js b/src/core/listen.js new file mode 100644 index 0000000..a0f185e --- /dev/null +++ b/src/core/listen.js @@ -0,0 +1,32 @@ +let registeredEvent = "\0"; + +const + + targetMap = new WeakMap(), + + /** + * @param { string } eventName + * @param { Function } callbackFn + * @param { HTMLElement } ref + * + * @returns { void } + */ + listen = function (eventName, callbackFn, ref) { + + if(!registeredEvent.includes(`\0${eventName}\0`)) { + globalThis.addEventListener( + eventName, + e => targetMap.get(e.target)?.[eventName]?.forEach(x => x(e)), + { passive: !0 } + ); + registeredEvent += eventName + "\0"; + }; + + if(!targetMap.has(ref)) targetMap.set(ref, {}); + + (targetMap.get(ref)[eventName] ||= []).push(callbackFn); + + } +; + +export { listen }; \ No newline at end of file diff --git a/src/core/pointer.js b/src/core/pointer.js new file mode 100644 index 0000000..12e3190 --- /dev/null +++ b/src/core/pointer.js @@ -0,0 +1,346 @@ +import { isConstructedFrom } from "./checker.js"; + +const + + { Promise, Function } = globalThis, + + PTR_IDENTIFIER = Symbol.for("PTR_IDENTIFIER"), + + isPointer = (ptr) => ptr?.[PTR_IDENTIFIER], + + createSignature = () => String.fromCharCode(...resolverSignatureGenCB()), + + publishedPtr = {}, + + resolverSignatureGenCB = function*(length = 52) { + let c = 0; + while(c++ < length) { + let buf = Math.floor(Math.random() * 31) + yield 0x7f + buf + (buf > 0x8d) + (buf > 0x9c) + }; + }, + + logicOps = { + or: (a, b) => a || b, + and: (a, b) => a && b, + xor: (a, b) => a ^ b, + + sum: (a, b) => a + b, + sub: (a, b) => a - b, + mul: (a, b) => a * b, + div: (a, b) => a / b, + mod: (a, b) => a % b, + + // rsh: (a, b) => a >> b, + // ursh: (a, b) => a >>> b, + // lsh: (a, b) => a << b, + }, + + opTemp = Object.assign( + + { + + [Symbol.toPrimitive]([value], hint) { + + return ( + typeof hint === "string" + ? hint === "string" && isConstructedFrom(value, Function) + ? this.publish() + : value.toString() + : hint === PTR_IDENTIFIER + ); + + }, + + watch(buffer, watcherFn) { + + if(watcherFn) { + buffer[2].set(watcherFn, [ + buffer[1].push(watcherFn) - 1, + !0 + ]) + }; + + return this; + + }, + + abort(buffer, watcherFn) { + + if(watcherFn) { + const info = buffer[2].get(watcherFn); + info[1] = !1; + delete buffer[1][info?.[0]]; + }; + + return this; + + }, + + into([value], transformerFn = $ => $) { + + const + binder = value => { + const tmp = transformerFn(value); + return isConstructedFrom(tmp, Promise) + ? (tmp.then($ => newPtr.$ = $), undefined) + : newPtr.$ = tmp; + }, + newPtr = createPointer() + ; + + binder(value); + + this.watch(binder); + + return newPtr; + }, + + until(_, value) { + + return new Promise(r => { + + const watcherFn = $ => (isConstructedFrom(value, Function) ? value($) : $ === value) + ? (this.abort(watcherFn), r(this)) + : 0 + ; + + this.watch(watcherFn); + + }) + }, + + switch() { + + this.$ = !this.$; + + return this; + + }, + + not() { + + return this.into($ => !$) + + }, + + bool() { + + return this.into($ => !!$) + + }, + + isit(ifTrue, ifFalse) { + + return this.into($ => $ ? ifTrue : ifFalse); + + }, + + tick() { + + let bool = false; + + return this.into(() => bool = !bool) + + }, + + toString(_, base) { + + const + isPtrCache = isPointer(base), + ptr = this.into($ => $.toString(isPtrCache ? base.$ : base)) + ; + + isPtrCache ? base.watch($ => ptr.$ = this.$.toString($)) : 0; + + return ptr; + + }, + + publish(buffer) { + + const symbol = Symbol(buffer[3]); + + publishedPtr[symbol] = this; + + return symbol; + + }, + + text() { + + const text = new Text(this.$); + + this.watch($ => text.textContent = $); + + return [text] + + }, + + timeout(_, delay) { + + const ptr = createPointer(this.$); + let timeoutIdBuf; + + this.watch($ => { + clearTimeout(timeoutIdBuf); + timeoutIdBuf = setTimeout(() => ptr.$ = $, isPointer(delay) ? delay.$ : delay) + }) + + return ptr; + + }, + }, + + ...Object.keys(logicOps).map(op => ({ + + [op](_, value) { + + const + isPtrCache = isPointer(value), + boolOp = logicOps[op], + ptr = this.into($ => boolOp($, isPtrCache ? value.$ : value)) + ; + + isPtrCache ? value.watch($ => ptr.$ = boolOp(this.$, $)) : 0; + + return ptr; + + } + + })), + + // ...Object.keys(Math).filter(x => typeof Math[x] == "function").map(x => ({ + // [x](buffer, args) { + // + // } + // })) + + ), + + createPointer = (value, [setter, options] = []) => { + + const + watchers = [], + watcherInfo = new WeakMap(), + formattedOptions = Object.assign({ name: "$", writable: true }, options), + execWatcher = function (value, force, ptr) { + (force || (value !== buffer[0])) + ? (buffer[0] = value, watchers.forEach(fn => watcherInfo.get(fn)?.[1] ? fn(value) : 0)) + : 0 + ; + return ptr; + }, + buffer = [ + value, + watchers, + watcherInfo, + signature + (options?.name || "") + ] + ; + + return new Proxy( + + Object.defineProperties(Object(function(...args) { + + const [tmp] = buffer; + + return isConstructedFrom(tmp, Function) ? tmp.apply(null, args) : tmp; + + }), { name: { value: formattedOptions.name } }), + + { + + get(_, prop, reciever) { + + const + [tmp] = buffer + ; + + return ( + prop === "$" ? tmp + : prop === "refresh" ? execWatcher.bind(null, tmp, !0, reciever) + : prop === "constructor" ? !0 + + + : prop === PTR_IDENTIFIER ? !0 + : prop === Symbol.hasInstance ? () => !1 + + : ( + opTemp[prop]?.bind?.(reciever, buffer) || ( + + isConstructedFrom(tmp[prop], Function) + + ? function(...args) { + + const + argMap = args.map((arg, i) => ( + + isPointer(arg) + + ? arg.watch($ => ( + argMap[i] = $, + ptrBuf.$ = reciever.$[prop](...argMap) + )).$ + + : arg + )), + + ptrBuf = reciever.into($ => $[prop](...argMap)) + ; + + return ptrBuf + + } + + : reciever.into($ => $[prop]) + + ) + ) + ); + + }, + + set(_, prop, newValue) { + + if(formattedOptions.writable) { + + if(prop == "$") { + + const tmp = setter ? setter(newValue) : newValue; + + isConstructedFrom(tmp, Promise) ? tmp.then(execWatcher) : execWatcher(tmp) + + } else { + + buffer[0][prop] = ( + isPointer(newValue) + ? newValue.watch($ => buffer[0][prop] = $).$ + : newValue + ) + } + } + + + return !0; + + } + + } + + ) + } +; + +let signature; + +while((signature = createSignature()) in globalThis); + +Object.defineProperty(globalThis, signature, { + value: (symbol) => publishedPtr[symbol], + configurable: !1, + enumerable: !1 +}); + + +export { createPointer, createSignature, isPointer } \ No newline at end of file diff --git a/src/prop.js b/src/core/prop.js similarity index 62% rename from src/prop.js rename to src/core/prop.js index e59831d..0a76f74 100644 --- a/src/prop.js +++ b/src/core/prop.js @@ -1,4 +1,4 @@ -import { createPtr } from "./$.js" +import { createPointer } from "./pointer.js" /** * @@ -16,16 +16,16 @@ export const prop = (callback, nameFn) => { return ( prop === Symbol.toPrimitive ? publisher : prop === "$" ? publisher() - : (cache[prop] ||= createPtr(callback.bind(null, prop), undefined, { name: nameFn ? nameFn(prop) : "" })).publish() + : (cache[prop] ||= createPointer(callback.bind(null, prop), undefined, { name: nameFn ? nameFn(prop) : "" })).publish() ) } }), - bundled = createPtr((value) => { + bundled = createPointer((value) => { const buf = {}; - Object.keys(value).forEach((prop) => buf[proxy[prop]] = value[prop]); + Reflect.ownKeys(value).forEach((prop) => buf[proxy[prop]] = value[prop]); return buf; diff --git a/src/css.js b/src/css.js index da71abc..9b97df2 100644 --- a/src/css.js +++ b/src/css.js @@ -1,5 +1,5 @@ -import { isPtr } from "./$.js" -import { prop } from "./prop.js"; +import { isPointer } from "./core/pointer.js" +import { prop } from "./core/prop.js"; const @@ -23,7 +23,7 @@ const formedStylePropBuf, - isPtr(styleValue) + isPointer(styleValue) ? styleValue.watch($ => styleDec.setProperty(formedStylePropBuf, $)).$ : styleValue ) diff --git a/src/h.js b/src/h.js index 337f719..6138fd9 100644 --- a/src/h.js +++ b/src/h.js @@ -1,5 +1,6 @@ -import { isPtr, isConstructedFrom } from "./$.js"; -import { aEL } from "./on.js"; +import { isPointer } from "./core/pointer.js"; +import { isConstructedFrom } from "./core/checker.js"; +import { listen } from "./core/listen.js"; const @@ -52,7 +53,7 @@ const if(attrPropType == "symbol") { const attrPtr = globalThis[attrProp.description.slice(0, 52)]?.(attrProp); - if(!isPtr(attrPtr)) return; + if(!isPointer(attrPtr)) return; const buf = attrPtr.$(attrValue, ref); if(buf?.constructor !== Object) return; @@ -61,11 +62,11 @@ const } else if(attrPropType == "string") { - if(isPtr(attrValue)) { + if(isPointer(attrValue)) { ref[attrProp] = attrValue.watch($ => ref[attrProp] = $).$; - if("\0value\0checked\0".includes(`\0${attrProp}\0`) && attrProp in ref) aEL( + if("\0value\0checked\0".includes(`\0${attrProp}\0`) && attrProp in ref) listen( "input", ({ target: { [attrProp]: value } }) => attrValue.$ = ( "number\0range".includes(ref.type) @@ -99,7 +100,7 @@ const ref.replaceWith(...( vBody[Symbol.toPrimitive]?.(HTML_IDENTIFIER) ? vBody - : isPtr(vBody) ? vBody.text() + : isPointer(vBody) ? vBody.text() : [new Text(vBody)] )); diff --git a/src/mod.js b/src/mod.js index 2e73485..f77d220 100644 --- a/src/mod.js +++ b/src/mod.js @@ -1,5 +1,4 @@ -export { $ } from "./$.js" -export { h } from "./h.js" -export { on } from "./on.js" -export { css } from "./css.js" -export { prop } from "./prop.js" \ No newline at end of file +export * from "./$.js" +export * from "./h.js" +export * from "./on.js" +export * from "./css.js" \ No newline at end of file diff --git a/src/on.js b/src/on.js index 1c7b339..39b2eae 100644 --- a/src/on.js +++ b/src/on.js @@ -1,42 +1,16 @@ -import { prop } from "./prop.js"; - -let registeredEvent = "\0"; +import { listen } from "./core/listen.js"; +import { prop } from "./core/prop.js"; const - targetMap = new WeakMap(), - - /** - * @param { string } eventName - * @param { Function } callbackFn - * @param { HTMLElement } ref - * - * @returns { void } - */ - aEL = function (eventName, callbackFn, ref) { - - if(!registeredEvent.includes(`\0${eventName}\0`)) { - globalThis.addEventListener( - eventName, - e => targetMap.get(e.target)?.[eventName]?.forEach(x => x(e)), - { passive: !0 } - ); - registeredEvent += eventName + "\0"; - }; - - if(!targetMap.has(ref)) targetMap.set(ref, {}); - - (targetMap.get(ref)[eventName] ||= []).push(callbackFn); - - }, - on = prop( - aEL, + listen, prop => "on." + prop ) + ; -export { on, aEL } \ No newline at end of file +export { on } \ No newline at end of file From 042fd515317c1c0f79bc40f75ab86d7ef57aabe1 Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 20:10:13 +0900 Subject: [PATCH 05/15] 0.1.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index dac8fad..36f7ec4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "libh", - "version": "0.1.2", + "version": "0.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "libh", - "version": "0.1.2", + "version": "0.1.3", "license": "WTFPL" } } diff --git a/package.json b/package.json index 6d39623..f3fb6af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hstd", - "version": "0.1.2", + "version": "0.1.3", "description": "simple library to build reactive, extensive, reusable web interface.", "type": "module", "main": "./src/mod.js", From 2e602426026f45026adad8e6e75aa53ee513abbe Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 20:29:49 +0900 Subject: [PATCH 06/15] wip --- docs/mod.js | 2 +- src/$.js | 35 +++++++++-------------------------- 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/docs/mod.js b/docs/mod.js index f1774b8..b1811d5 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var C="\0",p=new WeakMap,d=function(t,e,r){C.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>p.get(n.target)?.[t]?.forEach(o=>o(n)),{passive:!0}),C+=t+"\0"),p.has(r)||p.set(r,{}),(p.get(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:w}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[S],E=()=>String.fromCharCode(...z()),j={},z=function*(t=52){let e=0;for(;e++141)+(r>156)}},R={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},_=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,w)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let i=e(o);return f(i,P)?(i.then(c=>n.$=c),void 0):n.$=i},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,w)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=h(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return j[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,h(e)?e.$:e)}),r}},...Object.keys(R).map(t=>({[t](e,r){let n=h(r),o=R[t],i=this.into(c=>o(c,n?r.$:r));return n&&r.watch(c=>i.$=o(this.$,c)),i}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,i=Object.assign({name:"$",writable:!0},r),c=function(m,l,u){return(l||m!==s[0])&&(s[0]=m,n.forEach(a=>o.get(a)?.[1]?a(m):0)),u},s=[t,n,o,M+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...m){let[l]=s;return f(l,w)?l.apply(null,m):l}),{name:{value:i.name}}),{get(m,l,u){let[a]=s;return l==="$"?a:l==="refresh"?c.bind(null,a,!0,u):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:_[l]?.bind?.(u,s)||(f(a[l],w)?function(...y){let T=y.map((g,L)=>h(g)?g.watch(W=>(T[L]=W,I.$=u.$[l](...T))).$:g),I=u.into(g=>g[l](...T));return I}:u.into(y=>y[l]))},set(m,l,u){if(i.writable)if(l=="$"){let a=e?e(u):u;f(a,P)?a.then(c):c(a)}else s[0][l]=h(u)?u.watch(a=>s[0][l]=a).$:u;return!0}})},M;for(;(M=E())in globalThis;);Object.defineProperty(globalThis,M,{value:t=>j[t],configurable:!1,enumerable:!1});var k=(t,e)=>{let r=E(),n=t.join(r),o=new RegExp(r,"g"),i=e.map((m,l)=>h(m)?m.watch(()=>(i[l]=m.$,s.$=c())).$:m),c=(m=0)=>n.replaceAll(o,()=>i[m++]),s=b(c());return s},A={},B="\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0",st=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{let r=A[e];return r||B.includes(`\0${r}\0`)&&(r=A[e]=b(globalThis[e],void 0,{writable:!1}),d(window,"resize",()=>r.$=globalThis[e])),r||D[e]}}),D=b(globalThis);var F=Symbol.for("HTML_IDENTIFIER"),O=new WeakMap,G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===F},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,i=e[r],c=typeof r;if(c=="symbol"){let s=globalThis[r.description.slice(0,52)]?.(r);if(!h(s))return;let m=s.$(i,o);if(m?.constructor!==Object)return;H(t,m)}else c=="string"&&(h(i)?(o[r]=i.watch(s=>o[r]=s).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&d("input",({target:{[r]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):r=="id"&&!(i in n)?n[i]=new Proxy(o,Z):o[r]=i)},Q=function([t,e],r,n,o,i){let c=r[i];e[i]?H([n,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(F)?c:h(c)?c.text():[new Text(c)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},at=(t,...e)=>{let r=O.get(t);if(!r){let n=t.join(""),o=0,i="t";for(;n.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););n=t.join(i);let c=i.length,s=[...n.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:u},index:a})=>a+u),m=[],l=document.createElement("div");G.appendChild(l),l.innerHTML=n.replaceAll(i,(u,a)=>(m[o++]=s.includes(a+c))?i:`
`),O.set(t,r=X.bind(null,[i,m,l.cloneNode.bind(l,!0)]))}return r(e)};var $=(t,e)=>{let r={},n=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(r[s]||=b(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=b(c=>{let s={};return Reflect.ownKeys(c).forEach(m=>s[n[m]]=c[m]),s}),i=()=>o.publish();return n};var pt=$(d,t=>"on."+t);var v=/[A-Z]{1}/g,J={},U=t=>J[t]||="-"+t.toLowerCase(),Y={},N=t=>Y[t]||=t.replaceAll(v,U),Tt=$(function(t,e,{style:r}){let n=N(t);r.setProperty(n,h(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+N(t));export{st as $,Tt as css,at as h,pt as on}; +var C="\0",p=new WeakMap,g=function(t,e,r){C.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>p.get(n.target)?.[t]?.forEach(o=>o(n)),{passive:!0}),C+=t+"\0"),p.has(r)||p.set(r,{}),(p.get(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:$}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[S],E=()=>String.fromCharCode(...z()),j={},z=function*(t=52){let e=0;for(;e++141)+(r>156)}},R={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},_=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,$)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let i=e(o);return f(i,P)?(i.then(c=>n.$=c),void 0):n.$=i},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,$)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=h(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return j[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,h(e)?e.$:e)}),r}},...Object.keys(R).map(t=>({[t](e,r){let n=h(r),o=R[t],i=this.into(c=>o(c,n?r.$:r));return n&&r.watch(c=>i.$=o(this.$,c)),i}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,i=Object.assign({name:"$",writable:!0},r),c=function(m,l,u){return(l||m!==s[0])&&(s[0]=m,n.forEach(a=>o.get(a)?.[1]?a(m):0)),u},s=[t,n,o,M+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...m){let[l]=s;return f(l,$)?l.apply(null,m):l}),{name:{value:i.name}}),{get(m,l,u){let[a]=s;return l==="$"?a:l==="refresh"?c.bind(null,a,!0,u):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:_[l]?.bind?.(u,s)||(f(a[l],$)?function(...y){let T=y.map((d,L)=>h(d)?d.watch(W=>(T[L]=W,I.$=u.$[l](...T))).$:d),I=u.into(d=>d[l](...T));return I}:u.into(y=>y[l]))},set(m,l,u){if(i.writable)if(l=="$"){let a=e?e(u):u;f(a,P)?a.then(c):c(a)}else s[0][l]=h(u)?u.watch(a=>s[0][l]=a).$:u;return!0}})},M;for(;(M=E())in globalThis;);Object.defineProperty(globalThis,M,{value:t=>j[t],configurable:!1,enumerable:!1});var k=(t,e)=>{let r=E(),n=t.join(r),o=new RegExp(r,"g"),i=e.map((m,l)=>h(m)?m.watch(()=>(i[l]=m.$,s.$=c())).$:m),c=(m=0)=>n.replaceAll(o,()=>i[m++]),s=b(c());return s},A={},B="\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0",st=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{let r=A[e];return!r&&B.includes(`\0${e}\0`)&&(r=A[e]=b(globalThis[e]),g("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var F=Symbol.for("HTML_IDENTIFIER"),O=new WeakMap,G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===F},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,i=e[r],c=typeof r;if(c=="symbol"){let s=globalThis[r.description.slice(0,52)]?.(r);if(!h(s))return;let m=s.$(i,o);if(m?.constructor!==Object)return;H(t,m)}else c=="string"&&(h(i)?(o[r]=i.watch(s=>o[r]=s).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&g("input",({target:{[r]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):r=="id"&&!(i in n)?n[i]=new Proxy(o,Z):o[r]=i)},Q=function([t,e],r,n,o,i){let c=r[i];e[i]?H([n,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(F)?c:h(c)?c.text():[new Text(c)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},at=(t,...e)=>{let r=O.get(t);if(!r){let n=t.join(""),o=0,i="t";for(;n.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););n=t.join(i);let c=i.length,s=[...n.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:u},index:a})=>a+u),m=[],l=document.createElement("div");G.appendChild(l),l.innerHTML=n.replaceAll(i,(u,a)=>(m[o++]=s.includes(a+c))?i:`
`),O.set(t,r=X.bind(null,[i,m,l.cloneNode.bind(l,!0)]))}return r(e)};var w=(t,e)=>{let r={},n=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(r[s]||=b(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=b(c=>{let s={};return Reflect.ownKeys(c).forEach(m=>s[n[m]]=c[m]),s}),i=()=>o.publish();return n};var pt=w(g,t=>"on."+t);var J=/[A-Z]{1}/g,U={},Y=t=>U[t]||="-"+t.toLowerCase(),v={},N=t=>v[t]||=t.replaceAll(J,Y),Tt=w(function(t,e,{style:r}){let n=N(t);r.setProperty(n,h(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+N(t));export{st as $,Tt as css,at as h,pt as on}; diff --git a/src/$.js b/src/$.js index 2a347d8..a245784 100644 --- a/src/$.js +++ b/src/$.js @@ -1,9 +1,8 @@ import { listen } from "./core/listen.js"; - import { createPointer, createSignature, isPointer } from "./core/pointer.js"; - import { isFrozenArray } from "./core/checker.js"; + const createTemp = (s, v) => { @@ -30,6 +29,7 @@ const globalPropCaptureTarget = "\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0", + $ = new Proxy( (x, ...y) => (isFrozenArray(x) && isFrozenArray(x?.raw) ? createTemp : createPointer)(x, y), { @@ -37,19 +37,16 @@ const let tmp = globalPropPtrCache[prop]; - if(!tmp) { - - if(globalPropCaptureTarget.includes(`\0${tmp}\0`)) { + if(!tmp && globalPropCaptureTarget.includes(`\0${prop}\0`)) { - tmp = globalPropPtrCache[prop] = createPointer(globalThis[prop], void 0, { writable: false }); + tmp = globalPropPtrCache[prop] = createPointer(globalThis[prop]); - listen( - window, - "resize", - () => tmp.$ = globalThis[prop] - ) + listen( + "resize", + ({ target }) => tmp.$ = target[prop], + globalThis, + ); - }; } return tmp || globalPtr[prop]; @@ -59,20 +56,6 @@ const ) ; -// [ - -// ["innerWidth\0innerHeight\0outerWidth\0outerHeight", "resize"] - -// ].forEach((props, eventType) => { - -// aEL( -// globalThis, -// eventType, -// () => props.forEach(prop => globalPropPtrCache[prop].$ = globalThis[prop]) -// ) - -// }); - const globalPtr = createPointer(globalThis); /** From df276b48fa069e63c88da49ed6c25aa84b1c8f97 Mon Sep 17 00:00:00 2001 From: ihasq Date: Sat, 12 Apr 2025 20:29:49 +0900 Subject: [PATCH 07/15] 0.1.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36f7ec4..331160f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "libh", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "libh", - "version": "0.1.3", + "version": "0.1.4", "license": "WTFPL" } } diff --git a/package.json b/package.json index f3fb6af..9bde0a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hstd", - "version": "0.1.3", + "version": "0.1.4", "description": "simple library to build reactive, extensive, reusable web interface.", "type": "module", "main": "./src/mod.js", From b9b2440eb96bbf215f61ff6c0207007b2254b105 Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 00:33:07 +0900 Subject: [PATCH 08/15] wip --- src/$.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/$.js b/src/$.js index a245784..5d520bf 100644 --- a/src/$.js +++ b/src/$.js @@ -35,6 +35,8 @@ const { get: (_, prop) => { + if(prop === Symbol.hasInstance) return isPointer; + let tmp = globalPropPtrCache[prop]; if(!tmp && globalPropCaptureTarget.includes(`\0${prop}\0`)) { From 09780f0c405f7f1cc7a6ae71a3ccd50093d0fe1e Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:00:07 +0900 Subject: [PATCH 09/15] wip --- docs/mod.js | 2 +- src/$.js | 17 ++++++++++++----- src/core/cache.js | 15 +++++++++++++++ src/h.js | 37 ++++++++++++++++--------------------- 4 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 src/core/cache.js diff --git a/docs/mod.js b/docs/mod.js index b1811d5..d239f8c 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var C="\0",p=new WeakMap,g=function(t,e,r){C.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>p.get(n.target)?.[t]?.forEach(o=>o(n)),{passive:!0}),C+=t+"\0"),p.has(r)||p.set(r,{}),(p.get(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:$}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),h=t=>t?.[S],E=()=>String.fromCharCode(...z()),j={},z=function*(t=52){let e=0;for(;e++141)+(r>156)}},R={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},_=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,$)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let i=e(o);return f(i,P)?(i.then(c=>n.$=c),void 0):n.$=i},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,$)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=h(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return j[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,h(e)?e.$:e)}),r}},...Object.keys(R).map(t=>({[t](e,r){let n=h(r),o=R[t],i=this.into(c=>o(c,n?r.$:r));return n&&r.watch(c=>i.$=o(this.$,c)),i}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,i=Object.assign({name:"$",writable:!0},r),c=function(m,l,u){return(l||m!==s[0])&&(s[0]=m,n.forEach(a=>o.get(a)?.[1]?a(m):0)),u},s=[t,n,o,M+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...m){let[l]=s;return f(l,$)?l.apply(null,m):l}),{name:{value:i.name}}),{get(m,l,u){let[a]=s;return l==="$"?a:l==="refresh"?c.bind(null,a,!0,u):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:_[l]?.bind?.(u,s)||(f(a[l],$)?function(...y){let T=y.map((d,L)=>h(d)?d.watch(W=>(T[L]=W,I.$=u.$[l](...T))).$:d),I=u.into(d=>d[l](...T));return I}:u.into(y=>y[l]))},set(m,l,u){if(i.writable)if(l=="$"){let a=e?e(u):u;f(a,P)?a.then(c):c(a)}else s[0][l]=h(u)?u.watch(a=>s[0][l]=a).$:u;return!0}})},M;for(;(M=E())in globalThis;);Object.defineProperty(globalThis,M,{value:t=>j[t],configurable:!1,enumerable:!1});var k=(t,e)=>{let r=E(),n=t.join(r),o=new RegExp(r,"g"),i=e.map((m,l)=>h(m)?m.watch(()=>(i[l]=m.$,s.$=c())).$:m),c=(m=0)=>n.replaceAll(o,()=>i[m++]),s=b(c());return s},A={},B="\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0",st=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{let r=A[e];return!r&&B.includes(`\0${e}\0`)&&(r=A[e]=b(globalThis[e]),g("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var F=Symbol.for("HTML_IDENTIFIER"),O=new WeakMap,G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===F},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,i=e[r],c=typeof r;if(c=="symbol"){let s=globalThis[r.description.slice(0,52)]?.(r);if(!h(s))return;let m=s.$(i,o);if(m?.constructor!==Object)return;H(t,m)}else c=="string"&&(h(i)?(o[r]=i.watch(s=>o[r]=s).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&g("input",({target:{[r]:s}})=>i.$="number\0range".includes(o.type)?Number(s):s,o)):r=="id"&&!(i in n)?n[i]=new Proxy(o,Z):o[r]=i)},Q=function([t,e],r,n,o,i){let c=r[i];e[i]?H([n,o],c):o.replaceWith(...c[Symbol.toPrimitive]?.(F)?c:h(c)?c.text():[new Text(c)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},at=(t,...e)=>{let r=O.get(t);if(!r){let n=t.join(""),o=0,i="t";for(;n.includes(i+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););n=t.join(i);let c=i.length,s=[...n.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${i}`,"g"))].map(({0:{length:u},index:a})=>a+u),m=[],l=document.createElement("div");G.appendChild(l),l.innerHTML=n.replaceAll(i,(u,a)=>(m[o++]=s.includes(a+c))?i:`
`),O.set(t,r=X.bind(null,[i,m,l.cloneNode.bind(l,!0)]))}return r(e)};var w=(t,e)=>{let r={},n=new Proxy({},{get(c,s){return s===Symbol.toPrimitive?i:s==="$"?i():(r[s]||=b(t.bind(null,s),void 0,{name:e?e(s):""})).publish()}}),o=b(c=>{let s={};return Reflect.ownKeys(c).forEach(m=>s[n[m]]=c[m]),s}),i=()=>o.publish();return n};var pt=w(g,t=>"on."+t);var J=/[A-Z]{1}/g,U={},Y=t=>U[t]||="-"+t.toLowerCase(),v={},N=t=>v[t]||=t.replaceAll(J,Y),Tt=w(function(t,e,{style:r}){let n=N(t);r.setProperty(n,h(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+N(t));export{st as $,Tt as css,at as h,pt as on}; +var R="\0",p=new WeakMap,g=function(t,e,r){R.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>p.get(n.target)?.[t]?.forEach(o=>o(n)),{passive:!0}),R+=t+"\0"),p.has(r)||p.set(r,{}),(p.get(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,P=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:S,Function:T}=globalThis,E=Symbol.for("PTR_IDENTIFIER"),a=t=>t?.[E],C=()=>String.fromCharCode(...z()),A={},z=function*(t=52){let e=0;for(;e++141)+(r>156)}},j={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},B=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,T)?this.publish():t.toString():e===E},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let c=e(o);return f(c,S)?(c.then(s=>n.$=s),void 0):n.$=c},n=b();return r(t),this.watch(r),n},until(t,e){return new S(r=>{let n=o=>(f(e,T)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=a(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return A[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,a(e)?e.$:e)}),r}},...Object.keys(j).map(t=>({[t](e,r){let n=a(r),o=j[t],c=this.into(s=>o(s,n?r.$:r));return n&&r.watch(s=>c.$=o(this.$,s)),c}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,c=Object.assign({name:"$",writable:!0},r),s=function(u,l,m){return(l||u!==i[0])&&(i[0]=u,n.forEach(h=>o.get(h)?.[1]?h(u):0)),m},i=[t,n,o,M+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=i;return f(l,T)?l.apply(null,u):l}),{name:{value:c.name}}),{get(u,l,m){let[h]=i;return l==="$"?h:l==="refresh"?s.bind(null,h,!0,m):l==="constructor"||l===E?!0:l===Symbol.hasInstance?()=>!1:B[l]?.bind?.(m,i)||(f(h[l],T)?function(...w){let x=w.map((d,N)=>a(d)?d.watch(W=>(x[N]=W,I.$=m.$[l](...x))).$:d),I=m.into(d=>d[l](...x));return I}:m.into(w=>w[l]))},set(u,l,m){if(c.writable)if(l=="$"){let h=e?e(m):m;f(h,S)?h.then(s):s(h)}else i[0][l]=a(m)?m.watch(h=>i[0][l]=h).$:m;return!0}})},M;for(;(M=C())in globalThis;);Object.defineProperty(globalThis,M,{value:t=>A[t],configurable:!1,enumerable:!1});var $=t=>{let e=new WeakMap;return r=>{let n=e.get(r);return n||e.set(r,n=t(r)),n}};var _=$(t=>{let e=C();return[t.join(e),new RegExp(e,"g")]}),k=(t,e)=>{let[r,n]=_(t),o=e.map((i,u)=>a(i)?i.watch(()=>(o[u]=i.$,s.$=c())).$:i),c=(i=0)=>r.replaceAll(n,()=>o[i++]),s=b(c());return s},F={};var ut=new Proxy((t,...e)=>(P(t)&&P(t?.raw)?k:b)(t,e),{get:(t,e)=>{if(e===Symbol.hasInstance)return a;let r=F[e];return!r&&!f(globalThis[e],Function)&&(r=F[e]=b(globalThis[e]),g("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var O=Symbol.for("HTML_IDENTIFIER"),G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,c=e[r],s=typeof r;if(s=="symbol"){let i=globalThis[r.description.slice(0,52)]?.(r);if(!a(i))return;let u=i.$(c,o);if(u?.constructor!==Object)return;H(t,u)}else s=="string"&&(a(c)?(o[r]=c.watch(i=>o[r]=i).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&g("input",({target:{[r]:i}})=>c.$="number\0range".includes(o.type)?Number(i):i,o)):r=="id"&&!(c in n)?n[c]=new Proxy(o,Z):o[r]=c)},Q=function([t,e],r,n,o,c){let s=r[c];e[c]?H([n,o],s):o.replaceWith(...s[Symbol.toPrimitive]?.(O)?s:a(s)?s.text():[new Text(s)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},J=$(t=>{let e=t.join(""),r=0,n="t";for(;e.includes(n+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););e=t.join(n);let o=n.length,c=[...e.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${n}`,"g"))].map(({0:{length:u},index:l})=>l+u),s=[],i=document.createElement("div");return G.appendChild(i),i.innerHTML=e.replaceAll(n,(u,l)=>(s[r++]=c.includes(l+o))?n:`
`),X.bind(null,[n,s,i.cloneNode.bind(i,!0)])}),gt=(t,...e)=>J(t)(e);var y=(t,e)=>{let r={},n=new Proxy({},{get(s,i){return i===Symbol.toPrimitive?c:i==="$"?c():(r[i]||=b(t.bind(null,i),void 0,{name:e?e(i):""})).publish()}}),o=b(s=>{let i={};return Reflect.ownKeys(s).forEach(u=>i[n[u]]=s[u]),i}),c=()=>o.publish();return n};var wt=y(g,t=>"on."+t);var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),Et=y(function(t,e,{style:r}){let n=L(t);r.setProperty(n,a(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+L(t));export{ut as $,Et as css,gt as h,wt as on}; diff --git a/src/$.js b/src/$.js index 5d520bf..854424c 100644 --- a/src/$.js +++ b/src/$.js @@ -1,16 +1,20 @@ import { listen } from "./core/listen.js"; import { createPointer, createSignature, isPointer } from "./core/pointer.js"; -import { isFrozenArray } from "./core/checker.js"; +import { isFrozenArray, isConstructedFrom } from "./core/checker.js"; +import { createCache } from "./core/cache.js"; const + getTempCache = createCache((s) => { + const code = createSignature(); + return [s.join(code), new RegExp(code, "g")] + }), + createTemp = (s, v) => { const - code = createSignature(), - temp = s.join(code), - tempMatcherRegex = new RegExp(code, "g"), + [temp, tempMatcherRegex] = getTempCache(s), vMap = v.map((vt, i) => ( isPointer(vt) ? vt.watch(() => (vMap[i] = vt.$, ptr.$ = refreshTemp())).$ @@ -29,6 +33,9 @@ const globalPropCaptureTarget = "\0innerWidth\0innerHeight\0outerWidth\0outerHeight\0", + // valueFetcherRAFCallback = () => { + + // } $ = new Proxy( (x, ...y) => (isFrozenArray(x) && isFrozenArray(x?.raw) ? createTemp : createPointer)(x, y), @@ -39,7 +46,7 @@ const let tmp = globalPropPtrCache[prop]; - if(!tmp && globalPropCaptureTarget.includes(`\0${prop}\0`)) { + if(!tmp && !isConstructedFrom(globalThis[prop], Function)) { tmp = globalPropPtrCache[prop] = createPointer(globalThis[prop]); diff --git a/src/core/cache.js b/src/core/cache.js new file mode 100644 index 0000000..a25378f --- /dev/null +++ b/src/core/cache.js @@ -0,0 +1,15 @@ +export const createCache = (setter) => { + + const cacheMap = new WeakMap(); + + return (template) => { + + let resultBuf = cacheMap.get(template); + + if(!resultBuf) cacheMap.set(template, resultBuf = setter(template)); + + return resultBuf; + + } + +} \ No newline at end of file diff --git a/src/h.js b/src/h.js index 6138fd9..9606b20 100644 --- a/src/h.js +++ b/src/h.js @@ -1,13 +1,12 @@ import { isPointer } from "./core/pointer.js"; import { isConstructedFrom } from "./core/checker.js"; import { listen } from "./core/listen.js"; +import { createCache } from "./core/cache.js"; const HTML_IDENTIFIER = Symbol.for("HTML_IDENTIFIER"), - elementTempMap = new WeakMap(), - df = document.createDocumentFragment(), fragmentTemp = { @@ -100,7 +99,7 @@ const ref.replaceWith(...( vBody[Symbol.toPrimitive]?.(HTML_IDENTIFIER) ? vBody - : isPointer(vBody) ? vBody.text() + : isPointer(vBody) ? vBody.text() : [new Text(vBody)] )); @@ -130,21 +129,9 @@ const } ); - } -; - -/** - * @param { TemplateStringsArray } s - * @param { (string | number | { [key: (string | symbol)]: any })[] } v - * - * @returns { NodeList } - */ - -export const h = (s, ...v) => { - - let createElementTemp = elementTempMap.get(s); + }, - if(!createElementTemp) { + getHTMLTempCache = createCache((s) => { let joined = s.join(""), @@ -174,8 +161,16 @@ export const h = (s, ...v) => { : `
` ); - elementTempMap.set(s, createElementTemp = elementTempBase.bind(null, [tokenBuf, placeholder, node.cloneNode.bind(node, !0)])) - }; + return elementTempBase.bind(null, [tokenBuf, placeholder, node.cloneNode.bind(node, !0)]); + + }) +; + +/** + * @param { TemplateStringsArray } s + * @param { (string | number | { [key: (string | symbol)]: any })[] } v + * + * @returns { NodeList } + */ - return createElementTemp(v) -}; \ No newline at end of file +export const h = (s, ...v) => getHTMLTempCache(s)(v); \ No newline at end of file From 2c668a16e53b7bea0be1133f637d757c28c19bed Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:00:07 +0900 Subject: [PATCH 10/15] 0.1.5 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 331160f..7cf7e20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "libh", - "version": "0.1.4", + "version": "0.1.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "libh", - "version": "0.1.4", + "version": "0.1.5", "license": "WTFPL" } } diff --git a/package.json b/package.json index 9bde0a1..13b3903 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hstd", - "version": "0.1.4", + "version": "0.1.5", "description": "simple library to build reactive, extensive, reusable web interface.", "type": "module", "main": "./src/mod.js", From ea46b1450013b34ed5322f8280f857380e499b62 Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:23:09 +0900 Subject: [PATCH 11/15] wip --- docs/mod.js | 2 +- src/$.js | 7 +++++-- src/core/listen.js | 13 ++++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/mod.js b/docs/mod.js index d239f8c..e6e7a26 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var R="\0",p=new WeakMap,g=function(t,e,r){R.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>p.get(n.target)?.[t]?.forEach(o=>o(n)),{passive:!0}),R+=t+"\0"),p.has(r)||p.set(r,{}),(p.get(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,P=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:S,Function:T}=globalThis,E=Symbol.for("PTR_IDENTIFIER"),a=t=>t?.[E],C=()=>String.fromCharCode(...z()),A={},z=function*(t=52){let e=0;for(;e++141)+(r>156)}},j={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},B=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,T)?this.publish():t.toString():e===E},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let c=e(o);return f(c,S)?(c.then(s=>n.$=s),void 0):n.$=c},n=b();return r(t),this.watch(r),n},until(t,e){return new S(r=>{let n=o=>(f(e,T)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=a(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return A[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,a(e)?e.$:e)}),r}},...Object.keys(j).map(t=>({[t](e,r){let n=a(r),o=j[t],c=this.into(s=>o(s,n?r.$:r));return n&&r.watch(s=>c.$=o(this.$,s)),c}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,c=Object.assign({name:"$",writable:!0},r),s=function(u,l,m){return(l||u!==i[0])&&(i[0]=u,n.forEach(h=>o.get(h)?.[1]?h(u):0)),m},i=[t,n,o,M+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=i;return f(l,T)?l.apply(null,u):l}),{name:{value:c.name}}),{get(u,l,m){let[h]=i;return l==="$"?h:l==="refresh"?s.bind(null,h,!0,m):l==="constructor"||l===E?!0:l===Symbol.hasInstance?()=>!1:B[l]?.bind?.(m,i)||(f(h[l],T)?function(...w){let x=w.map((d,N)=>a(d)?d.watch(W=>(x[N]=W,I.$=m.$[l](...x))).$:d),I=m.into(d=>d[l](...x));return I}:m.into(w=>w[l]))},set(u,l,m){if(c.writable)if(l=="$"){let h=e?e(m):m;f(h,S)?h.then(s):s(h)}else i[0][l]=a(m)?m.watch(h=>i[0][l]=h).$:m;return!0}})},M;for(;(M=C())in globalThis;);Object.defineProperty(globalThis,M,{value:t=>A[t],configurable:!1,enumerable:!1});var $=t=>{let e=new WeakMap;return r=>{let n=e.get(r);return n||e.set(r,n=t(r)),n}};var _=$(t=>{let e=C();return[t.join(e),new RegExp(e,"g")]}),k=(t,e)=>{let[r,n]=_(t),o=e.map((i,u)=>a(i)?i.watch(()=>(o[u]=i.$,s.$=c())).$:i),c=(i=0)=>r.replaceAll(n,()=>o[i++]),s=b(c());return s},F={};var ut=new Proxy((t,...e)=>(P(t)&&P(t?.raw)?k:b)(t,e),{get:(t,e)=>{if(e===Symbol.hasInstance)return a;let r=F[e];return!r&&!f(globalThis[e],Function)&&(r=F[e]=b(globalThis[e]),g("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var O=Symbol.for("HTML_IDENTIFIER"),G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,c=e[r],s=typeof r;if(s=="symbol"){let i=globalThis[r.description.slice(0,52)]?.(r);if(!a(i))return;let u=i.$(c,o);if(u?.constructor!==Object)return;H(t,u)}else s=="string"&&(a(c)?(o[r]=c.watch(i=>o[r]=i).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&g("input",({target:{[r]:i}})=>c.$="number\0range".includes(o.type)?Number(i):i,o)):r=="id"&&!(c in n)?n[c]=new Proxy(o,Z):o[r]=c)},Q=function([t,e],r,n,o,c){let s=r[c];e[c]?H([n,o],s):o.replaceWith(...s[Symbol.toPrimitive]?.(O)?s:a(s)?s.text():[new Text(s)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},J=$(t=>{let e=t.join(""),r=0,n="t";for(;e.includes(n+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););e=t.join(n);let o=n.length,c=[...e.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${n}`,"g"))].map(({0:{length:u},index:l})=>l+u),s=[],i=document.createElement("div");return G.appendChild(i),i.innerHTML=e.replaceAll(n,(u,l)=>(s[r++]=c.includes(l+o))?n:`
`),X.bind(null,[n,s,i.cloneNode.bind(i,!0)])}),gt=(t,...e)=>J(t)(e);var y=(t,e)=>{let r={},n=new Proxy({},{get(s,i){return i===Symbol.toPrimitive?c:i==="$"?c():(r[i]||=b(t.bind(null,i),void 0,{name:e?e(i):""})).publish()}}),o=b(s=>{let i={};return Reflect.ownKeys(s).forEach(u=>i[n[u]]=s[u]),i}),c=()=>o.publish();return n};var wt=y(g,t=>"on."+t);var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),Et=y(function(t,e,{style:r}){let n=L(t);r.setProperty(n,a(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+L(t));export{ut as $,Et as css,gt as h,wt as on}; +var g=t=>{let e=new WeakMap;return r=>{let n=e.get(r);return n||e.set(r,n=t(r)),n}};var M="\0",R=g(()=>({})),d=function(t,e,r){M.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>R(n.target)[t]?.forEach?.(o=>o(n)),{passive:!0}),M+=t+"\0"),(R(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:T}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),m=t=>t?.[S],C=()=>String.fromCharCode(...B()),A={},B=function*(t=52){let e=0;for(;e++141)+(r>156)}},j={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},W=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,T)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let c=e(o);return f(c,P)?(c.then(s=>n.$=s),void 0):n.$=c},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,T)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=m(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return A[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,m(e)?e.$:e)}),r}},...Object.keys(j).map(t=>({[t](e,r){let n=m(r),o=j[t],c=this.into(s=>o(s,n?r.$:r));return n&&r.watch(s=>c.$=o(this.$,s)),c}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,c=Object.assign({name:"$",writable:!0},r),s=function(u,l,a){return(l||u!==i[0])&&(i[0]=u,n.forEach(h=>o.get(h)?.[1]?h(u):0)),a},i=[t,n,o,E+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=i;return f(l,T)?l.apply(null,u):l}),{name:{value:c.name}}),{get(u,l,a){let[h]=i;return l==="$"?h:l==="refresh"?s.bind(null,h,!0,a):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:W[l]?.bind?.(a,i)||(f(h[l],T)?function(...y){let w=y.map((p,N)=>m(p)?p.watch(z=>(w[N]=z,I.$=a.$[l](...w))).$:p),I=a.into(p=>p[l](...w));return I}:a.into(y=>y[l]))},set(u,l,a){if(c.writable)if(l=="$"){let h=e?e(a):a;f(h,P)?h.then(s):s(h)}else i[0][l]=m(a)?a.watch(h=>i[0][l]=h).$:a;return!0}})},E;for(;(E=C())in globalThis;);Object.defineProperty(globalThis,E,{value:t=>A[t],configurable:!1,enumerable:!1});var _=g(t=>{let e=C();return[t.join(e),new RegExp(e,"g")]}),k=(t,e)=>{let[r,n]=_(t),o=e.map((i,u)=>m(i)?i.watch(()=>(o[u]=i.$,s.$=c())).$:i),c=(i=0)=>r.replaceAll(n,()=>o[i++]),s=b(c());return s},F={};var mt=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{if(e===Symbol.hasInstance)return m;let r=F[e];return!r&&!f(globalThis[e],Function)&&(r=F[e]=b(globalThis[e]),d("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var O=Symbol.for("HTML_IDENTIFIER"),G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,c=e[r],s=typeof r;if(s=="symbol"){let i=globalThis[r.description.slice(0,52)]?.(r);if(!m(i))return;let u=i.$(c,o);if(u?.constructor!==Object)return;H(t,u)}else s=="string"&&(m(c)?(o[r]=c.watch(i=>o[r]=i).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&d("input",({target:{[r]:i}})=>c.$="number\0range".includes(o.type)?Number(i):i,o)):r=="id"&&!(c in n)?n[c]=new Proxy(o,Z):o[r]=c)},Q=function([t,e],r,n,o,c){let s=r[c];e[c]?H([n,o],s):o.replaceWith(...s[Symbol.toPrimitive]?.(O)?s:m(s)?s.text():[new Text(s)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},J=g(t=>{let e=t.join(""),r=0,n="t";for(;e.includes(n+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););e=t.join(n);let o=n.length,c=[...e.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${n}`,"g"))].map(({0:{length:u},index:l})=>l+u),s=[],i=document.createElement("div");return G.appendChild(i),i.innerHTML=e.replaceAll(n,(u,l)=>(s[r++]=c.includes(l+o))?n:`
`),X.bind(null,[n,s,i.cloneNode.bind(i,!0)])}),dt=(t,...e)=>J(t)(e);var $=(t,e)=>{let r={},n=new Proxy({},{get(s,i){return i===Symbol.toPrimitive?c:i==="$"?c():(r[i]||=b(t.bind(null,i),void 0,{name:e?e(i):""})).publish()}}),o=b(s=>{let i={};return Reflect.ownKeys(s).forEach(u=>i[n[u]]=s[u]),i}),c=()=>o.publish();return n};var xt=$(d,t=>"on."+t);var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),Et=$(function(t,e,{style:r}){let n=L(t);r.setProperty(n,m(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+L(t));export{mt as $,Et as css,dt as h,xt as on}; diff --git a/src/$.js b/src/$.js index 854424c..abacaed 100644 --- a/src/$.js +++ b/src/$.js @@ -6,15 +6,18 @@ import { createCache } from "./core/cache.js"; const - getTempCache = createCache((s) => { + getLiteralTempCache = createCache((s) => { + const code = createSignature(); + return [s.join(code), new RegExp(code, "g")] + }), createTemp = (s, v) => { const - [temp, tempMatcherRegex] = getTempCache(s), + [temp, tempMatcherRegex] = getLiteralTempCache(s), vMap = v.map((vt, i) => ( isPointer(vt) ? vt.watch(() => (vMap[i] = vt.$, ptr.$ = refreshTemp())).$ diff --git a/src/core/listen.js b/src/core/listen.js index a0f185e..abafa4e 100644 --- a/src/core/listen.js +++ b/src/core/listen.js @@ -1,8 +1,10 @@ +import { createCache } from "./cache.js"; + let registeredEvent = "\0"; const - targetMap = new WeakMap(), + targetCache = createCache(() => ({})), /** * @param { string } eventName @@ -14,17 +16,18 @@ const listen = function (eventName, callbackFn, ref) { if(!registeredEvent.includes(`\0${eventName}\0`)) { + globalThis.addEventListener( eventName, - e => targetMap.get(e.target)?.[eventName]?.forEach(x => x(e)), + e => targetCache(e.target)[eventName]?.forEach?.(x => x(e)), { passive: !0 } ); + registeredEvent += eventName + "\0"; - }; - if(!targetMap.has(ref)) targetMap.set(ref, {}); + }; - (targetMap.get(ref)[eventName] ||= []).push(callbackFn); + (targetCache(ref)[eventName] ||= []).push(callbackFn); } ; From 24aa272e585b0cd85a001c158286607a2251d4bb Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:23:09 +0900 Subject: [PATCH 12/15] 0.1.6 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cf7e20..26db4e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "libh", - "version": "0.1.5", + "version": "0.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "libh", - "version": "0.1.5", + "version": "0.1.6", "license": "WTFPL" } } diff --git a/package.json b/package.json index 13b3903..24bff0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hstd", - "version": "0.1.5", + "version": "0.1.6", "description": "simple library to build reactive, extensive, reusable web interface.", "type": "module", "main": "./src/mod.js", From f3bb6d57f3ed51819b3bd2dbc63ec1d2db8f394e Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:32:38 +0900 Subject: [PATCH 13/15] wip --- src/$.js | 5 ++--- src/css.js | 2 +- src/h.js | 4 ++-- src/on.js | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/$.js b/src/$.js index abacaed..c233783 100644 --- a/src/$.js +++ b/src/$.js @@ -1,8 +1,7 @@ import { listen } from "./core/listen.js"; -import { createPointer, createSignature, isPointer } from "./core/pointer.js"; -import { isFrozenArray, isConstructedFrom } from "./core/checker.js"; import { createCache } from "./core/cache.js"; - +import { isFrozenArray, isConstructedFrom } from "./core/checker.js"; +import { createPointer, createSignature, isPointer } from "./core/pointer.js"; const diff --git a/src/css.js b/src/css.js index 9b97df2..70a2701 100644 --- a/src/css.js +++ b/src/css.js @@ -1,5 +1,5 @@ -import { isPointer } from "./core/pointer.js" import { prop } from "./core/prop.js"; +import { isPointer } from "./core/pointer.js" const diff --git a/src/h.js b/src/h.js index 9606b20..d1e8685 100644 --- a/src/h.js +++ b/src/h.js @@ -1,7 +1,7 @@ -import { isPointer } from "./core/pointer.js"; -import { isConstructedFrom } from "./core/checker.js"; import { listen } from "./core/listen.js"; +import { isPointer } from "./core/pointer.js"; import { createCache } from "./core/cache.js"; +import { isConstructedFrom } from "./core/checker.js"; const diff --git a/src/on.js b/src/on.js index 39b2eae..f71a374 100644 --- a/src/on.js +++ b/src/on.js @@ -1,5 +1,5 @@ -import { listen } from "./core/listen.js"; import { prop } from "./core/prop.js"; +import { listen } from "./core/listen.js"; const From c67a2f8dbaa6780af20ad26d3c02dd8577bc277f Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:45:45 +0900 Subject: [PATCH 14/15] wip --- .gitignore | 3 ++- .npmignore | 4 +++- docs/mod.js | 2 +- src/core/cache.js | 14 +++++--------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 24d8869..5064a90 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dev -node_modules \ No newline at end of file +node_modules +deno.lock \ No newline at end of file diff --git a/.npmignore b/.npmignore index b51ba3b..834a949 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,5 @@ dev docs -.gitignore \ No newline at end of file +.gitignore +deno.json +deno.lock \ No newline at end of file diff --git a/docs/mod.js b/docs/mod.js index e6e7a26..541086f 100644 --- a/docs/mod.js +++ b/docs/mod.js @@ -1 +1 @@ -var g=t=>{let e=new WeakMap;return r=>{let n=e.get(r);return n||e.set(r,n=t(r)),n}};var M="\0",R=g(()=>({})),d=function(t,e,r){M.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>R(n.target)[t]?.forEach?.(o=>o(n)),{passive:!0}),M+=t+"\0"),(R(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:T}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),m=t=>t?.[S],C=()=>String.fromCharCode(...B()),A={},B=function*(t=52){let e=0;for(;e++141)+(r>156)}},j={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},W=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,T)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let c=e(o);return f(c,P)?(c.then(s=>n.$=s),void 0):n.$=c},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,T)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=m(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return A[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,m(e)?e.$:e)}),r}},...Object.keys(j).map(t=>({[t](e,r){let n=m(r),o=j[t],c=this.into(s=>o(s,n?r.$:r));return n&&r.watch(s=>c.$=o(this.$,s)),c}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,c=Object.assign({name:"$",writable:!0},r),s=function(u,l,a){return(l||u!==i[0])&&(i[0]=u,n.forEach(h=>o.get(h)?.[1]?h(u):0)),a},i=[t,n,o,E+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=i;return f(l,T)?l.apply(null,u):l}),{name:{value:c.name}}),{get(u,l,a){let[h]=i;return l==="$"?h:l==="refresh"?s.bind(null,h,!0,a):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:W[l]?.bind?.(a,i)||(f(h[l],T)?function(...y){let w=y.map((p,N)=>m(p)?p.watch(z=>(w[N]=z,I.$=a.$[l](...w))).$:p),I=a.into(p=>p[l](...w));return I}:a.into(y=>y[l]))},set(u,l,a){if(c.writable)if(l=="$"){let h=e?e(a):a;f(h,P)?h.then(s):s(h)}else i[0][l]=m(a)?a.watch(h=>i[0][l]=h).$:a;return!0}})},E;for(;(E=C())in globalThis;);Object.defineProperty(globalThis,E,{value:t=>A[t],configurable:!1,enumerable:!1});var _=g(t=>{let e=C();return[t.join(e),new RegExp(e,"g")]}),k=(t,e)=>{let[r,n]=_(t),o=e.map((i,u)=>m(i)?i.watch(()=>(o[u]=i.$,s.$=c())).$:i),c=(i=0)=>r.replaceAll(n,()=>o[i++]),s=b(c());return s},F={};var mt=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{if(e===Symbol.hasInstance)return m;let r=F[e];return!r&&!f(globalThis[e],Function)&&(r=F[e]=b(globalThis[e]),d("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var O=Symbol.for("HTML_IDENTIFIER"),G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,c=e[r],s=typeof r;if(s=="symbol"){let i=globalThis[r.description.slice(0,52)]?.(r);if(!m(i))return;let u=i.$(c,o);if(u?.constructor!==Object)return;H(t,u)}else s=="string"&&(m(c)?(o[r]=c.watch(i=>o[r]=i).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&d("input",({target:{[r]:i}})=>c.$="number\0range".includes(o.type)?Number(i):i,o)):r=="id"&&!(c in n)?n[c]=new Proxy(o,Z):o[r]=c)},Q=function([t,e],r,n,o,c){let s=r[c];e[c]?H([n,o],s):o.replaceWith(...s[Symbol.toPrimitive]?.(O)?s:m(s)?s.text():[new Text(s)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},J=g(t=>{let e=t.join(""),r=0,n="t";for(;e.includes(n+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););e=t.join(n);let o=n.length,c=[...e.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${n}`,"g"))].map(({0:{length:u},index:l})=>l+u),s=[],i=document.createElement("div");return G.appendChild(i),i.innerHTML=e.replaceAll(n,(u,l)=>(s[r++]=c.includes(l+o))?n:`
`),X.bind(null,[n,s,i.cloneNode.bind(i,!0)])}),dt=(t,...e)=>J(t)(e);var $=(t,e)=>{let r={},n=new Proxy({},{get(s,i){return i===Symbol.toPrimitive?c:i==="$"?c():(r[i]||=b(t.bind(null,i),void 0,{name:e?e(i):""})).publish()}}),o=b(s=>{let i={};return Reflect.ownKeys(s).forEach(u=>i[n[u]]=s[u]),i}),c=()=>o.publish();return n};var xt=$(d,t=>"on."+t);var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),Et=$(function(t,e,{style:r}){let n=L(t);r.setProperty(n,m(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+L(t));export{mt as $,Et as css,dt as h,xt as on}; +var g=t=>{let e=new WeakMap,r;return n=>e.has(n)?e.get(n):(e.set(n,r=t(n)),r)};var M="\0",R=g(()=>({})),d=function(t,e,r){M.includes(`\0${t}\0`)||(globalThis.addEventListener(t,n=>R(n.target)[t]?.forEach?.(o=>o(n)),{passive:!0}),M+=t+"\0"),(R(r)[t]||=[]).push(e)};var f=(t,e)=>t?.constructor===e,x=t=>Object.isFrozen(t)&&f(t,Array);var{Promise:P,Function:T}=globalThis,S=Symbol.for("PTR_IDENTIFIER"),a=t=>t?.[S],C=()=>String.fromCharCode(...B()),A={},B=function*(t=52){let e=0;for(;e++141)+(r>156)}},j={or:(t,e)=>t||e,and:(t,e)=>t&&e,xor:(t,e)=>t^e,sum:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>t/e,mod:(t,e)=>t%e},W=Object.assign({[Symbol.toPrimitive]([t],e){return typeof e=="string"?e==="string"&&f(t,T)?this.publish():t.toString():e===S},watch(t,e){return e&&t[2].set(e,[t[1].push(e)-1,!0]),this},abort(t,e){if(e){let r=t[2].get(e);r[1]=!1,delete t[1][r?.[0]]}return this},into([t],e=r=>r){let r=o=>{let c=e(o);return f(c,P)?(c.then(s=>n.$=s),void 0):n.$=c},n=b();return r(t),this.watch(r),n},until(t,e){return new P(r=>{let n=o=>(f(e,T)?e(o):o===e)?(this.abort(n),r(this)):0;this.watch(n)})},switch(){return this.$=!this.$,this},not(){return this.into(t=>!t)},bool(){return this.into(t=>!!t)},isit(t,e){return this.into(r=>r?t:e)},tick(){let t=!1;return this.into(()=>t=!t)},toString(t,e){let r=a(e),n=this.into(o=>o.toString(r?e.$:e));return r&&e.watch(o=>n.$=this.$.toString(o)),n},publish(t){let e=Symbol(t[3]);return A[e]=this,e},text(){let t=new Text(this.$);return this.watch(e=>t.textContent=e),[t]},timeout(t,e){let r=b(this.$),n;return this.watch(o=>{clearTimeout(n),n=setTimeout(()=>r.$=o,a(e)?e.$:e)}),r}},...Object.keys(j).map(t=>({[t](e,r){let n=a(r),o=j[t],c=this.into(s=>o(s,n?r.$:r));return n&&r.watch(s=>c.$=o(this.$,s)),c}}))),b=(t,[e,r]=[])=>{let n=[],o=new WeakMap,c=Object.assign({name:"$",writable:!0},r),s=function(u,l,m){return(l||u!==i[0])&&(i[0]=u,n.forEach(h=>o.get(h)?.[1]?h(u):0)),m},i=[t,n,o,E+(r?.name||"")];return new Proxy(Object.defineProperties(Object(function(...u){let[l]=i;return f(l,T)?l.apply(null,u):l}),{name:{value:c.name}}),{get(u,l,m){let[h]=i;return l==="$"?h:l==="refresh"?s.bind(null,h,!0,m):l==="constructor"||l===S?!0:l===Symbol.hasInstance?()=>!1:W[l]?.bind?.(m,i)||(f(h[l],T)?function(...y){let w=y.map((p,N)=>a(p)?p.watch(z=>(w[N]=z,I.$=m.$[l](...w))).$:p),I=m.into(p=>p[l](...w));return I}:m.into(y=>y[l]))},set(u,l,m){if(c.writable)if(l=="$"){let h=e?e(m):m;f(h,P)?h.then(s):s(h)}else i[0][l]=a(m)?m.watch(h=>i[0][l]=h).$:m;return!0}})},E;for(;(E=C())in globalThis;);Object.defineProperty(globalThis,E,{value:t=>A[t],configurable:!1,enumerable:!1});var _=g(t=>{let e=C();return[t.join(e),new RegExp(e,"g")]}),k=(t,e)=>{let[r,n]=_(t),o=e.map((i,u)=>a(i)?i.watch(()=>(o[u]=i.$,s.$=c())).$:i),c=(i=0)=>r.replaceAll(n,()=>o[i++]),s=b(c());return s},F={};var at=new Proxy((t,...e)=>(x(t)&&x(t?.raw)?k:b)(t,e),{get:(t,e)=>{if(e===Symbol.hasInstance)return a;let r=F[e];return!r&&!f(globalThis[e],Function)&&(r=F[e]=b(globalThis[e]),d("resize",({target:n})=>r.$=n[e],globalThis)),r||D[e]}}),D=b(globalThis);var O=Symbol.for("HTML_IDENTIFIER"),G=document.createDocumentFragment(),K={[Symbol.toPrimitive](t){return typeof t=="string"?[...this[Symbol.iterator]().map(e=>e.outerHTML)].join(""):t===O},toString(){return this[Symbol.toPrimitive]("string")}},Z={get(t,e){let r=t[e];return f(r,Function)?r.bind(t):r}},H=(t,e)=>Reflect.ownKeys(e).forEach(q.bind(null,t,e)),q=function(t,e,r){let[n,o]=t,c=e[r],s=typeof r;if(s=="symbol"){let i=globalThis[r.description.slice(0,52)]?.(r);if(!a(i))return;let u=i.$(c,o);if(u?.constructor!==Object)return;H(t,u)}else s=="string"&&(a(c)?(o[r]=c.watch(i=>o[r]=i).$,"\0value\0checked\0".includes(`\0${r}\0`)&&r in o&&d("input",({target:{[r]:i}})=>c.$="number\0range".includes(o.type)?Number(i):i,o)):r=="id"&&!(c in n)?n[c]=new Proxy(o,Z):o[r]=c)},Q=function([t,e],r,n,o,c){let s=r[c];e[c]?H([n,o],s):o.replaceWith(...s[Symbol.toPrimitive]?.(O)?s:a(s)?s.text():[new Text(s)]),o.removeAttribute(t)},X=function(t,e){let r=t[2](),n={};return r.querySelectorAll(`[${t[0]}]`).forEach(Q.bind(null,t,e,n)),Object.assign(r.childNodes,K,{then(o){return o(n),this}})},J=g(t=>{let e=t.join(""),r=0,n="t";for(;e.includes(n+=BigInt(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)).toString(36)););e=t.join(n);let o=n.length,c=[...e.matchAll(new RegExp(`<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))[\\s].*?${n}`,"g"))].map(({0:{length:u},index:l})=>l+u),s=[],i=document.createElement("div");return G.appendChild(i),i.innerHTML=e.replaceAll(n,(u,l)=>(s[r++]=c.includes(l+o))?n:`
`),X.bind(null,[n,s,i.cloneNode.bind(i,!0)])}),dt=(t,...e)=>J(t)(e);var $=(t,e)=>{let r={},n=new Proxy({},{get(s,i){return i===Symbol.toPrimitive?c:i==="$"?c():(r[i]||=b(t.bind(null,i),void 0,{name:e?e(i):""})).publish()}}),o=b(s=>{let i={};return Reflect.ownKeys(s).forEach(u=>i[n[u]]=s[u]),i}),c=()=>o.publish();return n};var xt=$(d,t=>"on."+t);var U=/[A-Z]{1}/g,Y={},v=t=>Y[t]||="-"+t.toLowerCase(),V={},L=t=>V[t]||=t.replaceAll(U,v),Et=$(function(t,e,{style:r}){let n=L(t);r.setProperty(n,a(e)?e.watch(o=>r.setProperty(n,o)).$:e)},t=>"css-"+L(t));export{at as $,Et as css,dt as h,xt as on}; diff --git a/src/core/cache.js b/src/core/cache.js index a25378f..4f57d9c 100644 --- a/src/core/cache.js +++ b/src/core/cache.js @@ -1,15 +1,11 @@ export const createCache = (setter) => { const cacheMap = new WeakMap(); + let resultBuf; - return (template) => { - - let resultBuf = cacheMap.get(template); - - if(!resultBuf) cacheMap.set(template, resultBuf = setter(template)); - - return resultBuf; - - } + return (template) => (cacheMap.has(template) + ? cacheMap.get(template) + : (cacheMap.set(template, resultBuf = setter(template)), resultBuf) + ); } \ No newline at end of file From 9274b06e0a8bca0ad0034c1d5c180f65512612e3 Mon Sep 17 00:00:00 2001 From: ihasq Date: Sun, 13 Apr 2025 01:45:45 +0900 Subject: [PATCH 15/15] 0.1.7 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 26db4e8..fc97c39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "libh", - "version": "0.1.6", + "version": "0.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "libh", - "version": "0.1.6", + "version": "0.1.7", "license": "WTFPL" } } diff --git a/package.json b/package.json index 24bff0c..f9be916 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hstd", - "version": "0.1.6", + "version": "0.1.7", "description": "simple library to build reactive, extensive, reusable web interface.", "type": "module", "main": "./src/mod.js",