ajo 0.0.23 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs CHANGED
@@ -155,16 +155,19 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
155
155
  }
156
156
  hooks[0]++;
157
157
  }, schedule = (host) => {
158
- if (host.$idleId)
158
+ if (host.$idle)
159
159
  return;
160
160
  if (globalThis.navigator?.scheduling?.isInputPending()) {
161
- if (!host.$idle) {
162
- host.$idle = true;
163
- idleCount++;
164
- }
165
- host.$idleId = requestIdleCallback(() => {
166
- host.$idleId = null;
167
- schedule(host);
161
+ idleQueue.add(host);
162
+ host.$idle = true;
163
+ idleId ??= requestIdleCallback(() => {
164
+ idleId = null;
165
+ const queue = from(idleQueue);
166
+ for (const host2 of queue) {
167
+ idleQueue.delete(host2);
168
+ host2.$idle = false;
169
+ schedule(host2);
170
+ }
168
171
  });
169
172
  return;
170
173
  }
@@ -178,11 +181,9 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
178
181
  runComponent(host);
179
182
  });
180
183
  }, runComponent = (host) => {
181
- if (host.$idleId) {
182
- cancelIdleCallback(host.$idleId);
183
- host.$idleId = null;
184
+ if (host.$idle) {
185
+ idleQueue.delete(host);
184
186
  host.$idle = false;
185
- idleCount--;
186
187
  }
187
188
  current = host;
188
189
  if (current.$hooks)
@@ -193,18 +194,15 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
193
194
  propagate(value, host.parentNode);
194
195
  } finally {
195
196
  current = null;
196
- layoutsQueue.add(host);
197
- if (host.$idle) {
198
- host.$idle = false;
199
- if (--idleCount)
200
- return;
201
- }
202
- layoutsId ??= task(runLayouts);
197
+ layoutQueue.add(host);
198
+ host.$layoutQueued = true;
199
+ layoutId ??= task(runLayouts);
203
200
  }
204
201
  }, runLayouts = () => {
205
- layoutsId = null;
206
- for (const host of layoutsQueue) {
207
- layoutsQueue.delete(host);
202
+ layoutId = null;
203
+ for (const host of layoutQueue) {
204
+ layoutQueue.delete(host);
205
+ host.$layoutQueued = false;
208
206
  try {
209
207
  render(host.$h, host);
210
208
  host.$h = null;
@@ -212,14 +210,16 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
212
210
  propagate(value, host);
213
211
  } finally {
214
212
  runFx(host, "$layout");
215
- effectsQueue.add(host);
216
- effectsId ??= task(runEffects);
213
+ effectQueue.add(host);
214
+ host.$effectQueued = true;
215
+ effectId ??= task(runEffects);
217
216
  }
218
217
  }
219
218
  }, runEffects = () => {
220
- effectsId = null;
221
- for (const host of effectsQueue) {
222
- effectsQueue.delete(host);
219
+ effectId = null;
220
+ for (const host of effectQueue) {
221
+ effectQueue.delete(host);
222
+ host.$effectQueued = false;
223
223
  runFx(host, "$effect");
224
224
  }
225
225
  }, runFx = (host, key) => {
@@ -248,8 +248,18 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
248
248
  host.$ref.current = null;
249
249
  if (!host.$fn)
250
250
  return;
251
- layoutsQueue.delete(host);
252
- effectsQueue.delete(host);
251
+ if (host.$idle) {
252
+ idleQueue.delete(host);
253
+ host.$idle = false;
254
+ }
255
+ if (host.$layoutQueued) {
256
+ layoutQueue.delete(host);
257
+ host.$layoutQueued = false;
258
+ }
259
+ if (host.$effectQueued) {
260
+ effectQueue.delete(host);
261
+ host.$effectQueued = false;
262
+ }
253
263
  for (const key of ["$layout", "$effect"])
254
264
  if (host[key]) {
255
265
  for (const fx of host[key]) {
@@ -270,4 +280,4 @@ const { isArray, from } = Array, { is } = Object, noop = () => {
270
280
  return void fn(value);
271
281
  throw value;
272
282
  };
273
- let idleCount = 0, layoutsQueue = /* @__PURE__ */ new Set(), effectsQueue = /* @__PURE__ */ new Set(), layoutsId = null, effectsId = null, current = null;
283
+ let current = null, layoutQueue = /* @__PURE__ */ new Set(), effectQueue = /* @__PURE__ */ new Set(), idleQueue = /* @__PURE__ */ new Set(), layoutId = null, effectId = null, idleId = null;
package/index.js CHANGED
@@ -197,18 +197,21 @@ const
197
197
 
198
198
  schedule = host => {
199
199
 
200
- if (host.$idleId) return
200
+ if (host.$idle) return
201
201
 
202
202
  if (globalThis.navigator?.scheduling?.isInputPending()) {
203
203
 
204
- if (!host.$idle) {
205
- host.$idle = true
206
- idleCount++
207
- }
204
+ idleQueue.add(host)
205
+ host.$idle = true
208
206
 
209
- host.$idleId = requestIdleCallback(() => {
210
- host.$idleId = null
211
- schedule(host)
207
+ idleId ??= requestIdleCallback(() => {
208
+ idleId = null
209
+ const queue = from(idleQueue)
210
+ for (const host of queue) {
211
+ idleQueue.delete(host)
212
+ host.$idle = false
213
+ schedule(host)
214
+ }
212
215
  })
213
216
 
214
217
  return
@@ -230,11 +233,9 @@ const
230
233
 
231
234
  runComponent = host => {
232
235
 
233
- if (host.$idleId) {
234
- cancelIdleCallback(host.$idleId)
235
- host.$idleId = null
236
+ if (host.$idle) {
237
+ idleQueue.delete(host)
236
238
  host.$idle = false
237
- idleCount--
238
239
  }
239
240
 
240
241
  current = host
@@ -247,24 +248,20 @@ const
247
248
  propagate(value, host.parentNode)
248
249
  } finally {
249
250
  current = null
250
- layoutsQueue.add(host)
251
-
252
- if (host.$idle) {
253
- host.$idle = false
254
- if (--idleCount) return
255
- }
256
-
257
- layoutsId ??= task(runLayouts)
251
+ layoutQueue.add(host)
252
+ host.$layoutQueued = true
253
+ layoutId ??= task(runLayouts)
258
254
  }
259
255
  },
260
256
 
261
257
  runLayouts = () => {
262
258
 
263
- layoutsId = null
259
+ layoutId = null
264
260
 
265
- for (const host of layoutsQueue) {
261
+ for (const host of layoutQueue) {
266
262
 
267
- layoutsQueue.delete(host)
263
+ layoutQueue.delete(host)
264
+ host.$layoutQueued = false
268
265
 
269
266
  try {
270
267
  render(host.$h, host)
@@ -273,18 +270,20 @@ const
273
270
  propagate(value, host)
274
271
  } finally {
275
272
  runFx(host, '$layout')
276
- effectsQueue.add(host)
277
- effectsId ??= task(runEffects)
273
+ effectQueue.add(host)
274
+ host.$effectQueued = true
275
+ effectId ??= task(runEffects)
278
276
  }
279
277
  }
280
278
  },
281
279
 
282
280
  runEffects = () => {
283
281
 
284
- effectsId = null
282
+ effectId = null
285
283
 
286
- for (const host of effectsQueue) {
287
- effectsQueue.delete(host)
284
+ for (const host of effectQueue) {
285
+ effectQueue.delete(host)
286
+ host.$effectQueued = false
288
287
  runFx(host, '$effect')
289
288
  }
290
289
  },
@@ -319,8 +318,20 @@ const
319
318
 
320
319
  if (!host.$fn) return
321
320
 
322
- layoutsQueue.delete(host)
323
- effectsQueue.delete(host)
321
+ if (host.$idle) {
322
+ idleQueue.delete(host)
323
+ host.$idle = false
324
+ }
325
+
326
+ if (host.$layoutQueued) {
327
+ layoutQueue.delete(host)
328
+ host.$layoutQueued = false
329
+ }
330
+
331
+ if (host.$effectQueued) {
332
+ effectQueue.delete(host)
333
+ host.$effectQueued = false
334
+ }
324
335
 
325
336
  for (const key of ['$layout', '$effect']) if (host[key]) {
326
337
 
@@ -346,9 +357,10 @@ const
346
357
  }
347
358
 
348
359
  let
349
- idleCount = 0,
350
- layoutsQueue = new Set,
351
- effectsQueue = new Set,
352
- layoutsId = null,
353
- effectsId = null,
354
- current = null
360
+ current = null,
361
+ layoutQueue = new Set,
362
+ effectQueue = new Set,
363
+ idleQueue = new Set,
364
+ layoutId = null,
365
+ effectId = null,
366
+ idleId = null
package/index.min.js CHANGED
@@ -1 +1 @@
1
- var ajo=(()=>{var k=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var W=(e,n)=>{for(var i in n)k(e,i,{get:n[i],enumerable:!0})},D=(e,n,i,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of P(n))!V.call(e,t)&&t!==i&&k(e,t,{get:()=>n[t],enumerable:!(l=z(n,t))||l.enumerable});return e};var G=e=>D(k({},"__esModule",{value:!0}),e);var se={};W(se,{Fragment:()=>J,component:()=>K,h:()=>q,render:()=>N,useCallback:()=>Z,useCatch:()=>U,useEffect:()=>h,useHost:()=>m,useLayout:()=>_,useMemo:()=>I,useReducer:()=>S,useRef:()=>Y,useState:()=>X});const J=({children:e})=>e,q=(e,n,...i)=>{const{length:l}=i;return i=l==0?null:l==1?i[0]:i,{children:i,...n,nodeName:e}},N=(e,n,i)=>{let l=n.firstChild;for(e of x(e)){let t=l;if(e instanceof Node)t=e;else if(typeof e=="string"){for(;t&&t.nodeType!=3;)t=t.nextSibling;t?t.data!=e&&(t.data=e):t=document.createTextNode(e)}else{const{xmlns:r=i,nodeName:a,key:u,ref:f,memo:C,children:Q,[A]:v,...R}=e;for(;t&&!(t.localName==a&&d(t.$key??=u,u));)t=t.nextSibling;t??=re(r,a,u),te(f)&&(f.current=t,t.$ref=f),(C==null||w(t.$deps,t.$deps=C))&&(ae(R,t),o(v)?v(t):N(Q,t,r))}t==l?l=l.nextSibling:ue(n,t,l)}for(;l;){const t=l.nextSibling;H(l),n.removeChild(l),l=t}},K=e=>({nodeName:n,as:i,props:l,key:t,ref:r,memo:a,...u})=>q(i??e?.as??"c-host",{...e?.props,...l,key:t,ref:r,memo:a,[A]:f=>{f.$fn=o(e)?e:ne,f.$args={...e?.args,...u},j(f)}}),S=(e,n)=>{const i=m(),l=p(),[t,r]=l;return t==r.length&&(r[t]=[o(n)?n():n,a=>{const u=r[t][0],f=o(a)?a(u):a;d(u,r[t][0]=o(e)?e(u,f):f)||oe(i)}]),r[l[0]++]},I=(e,n)=>{const i=p(),[l,t]=i;return(l==t.length||n==null||w(n,t[l][1]))&&(t[l]=[e(),n]),t[i[0]++][0]},U=e=>{const n=m(),[i,l]=S(),t=p(),[r,a]=t;return a[t[0]++]=e,n.$catch??=u=>{o(a[r])&&a[r](u),l(u)},[i,()=>l()]},m=()=>c,X=e=>S(null,e),Y=e=>I(()=>({current:e}),[]),Z=(e,n)=>I(()=>e,n),_=(e,n)=>E(e,n,"$layout"),h=(e,n)=>E(e,n,"$effect"),{isArray:s,from:ee}=Array,{is:d}=Object,ne=()=>{},A=Symbol(),te=e=>e&&typeof e=="object",o=e=>typeof e=="function",w=(e,n)=>s(e)&&s(n)?e.some((i,l)=>!d(i,n[l])):!d(e,n),le=e=>ee(e).reduce(ie,{}),ie=(e,{name:n,value:i})=>(e[n]=i,e),F=globalThis.queueMicrotask??(e=>e()),T=globalThis.requestAnimationFrame??F,re=(e,n,i)=>{const l=e?document.createElementNS(e,n):document.createElement(n);return l.$key=i,l},x=function*(e,n={data:""},i=!0){let l;for(e of s(e)?e:[e])e==null||typeof e=="boolean"||(typeof e.nodeName=="string"?((l=n.data)&&(n.data="",yield l),yield e):o(e.nodeName)?yield*x(e.nodeName(e),n,!1):s(e)?yield*x(e,n,!1):n.data+=e);i&&(l=n.data)&&(yield l)},ae=(e,n)=>{const i=n.$props??=n.hasAttributes()?le(n.attributes):{};for(const l in{...i,...n.$props=e}){let t=e[l];t!==i[l]&&(l.startsWith("set:")?n[l.slice(4)]=t:t==null||t===!1?n.removeAttribute(l):n.setAttribute(l,t===!0?"":t))}},ue=(e,n,i)=>{if(n.contains?.(document.activeElement)){const l=n.nextSibling;for(;i&&i!=n;){const t=i.nextSibling;e.insertBefore(i,l),i=t}}else e.insertBefore(n,i)},p=()=>c.$hooks??=[0,[]],E=(e,n,i)=>{const l=m(),t=p(),[r,a]=t;r==a.length?(l[i]??=new Set).add(a[r]=[null,e,n]):(n==null||w(n,a[r][2]))&&(a[r][1]=e,a[r][2]=n),t[0]++},j=e=>{if(!e.$idleId){if(globalThis.navigator?.scheduling?.isInputPending()){e.$idle||(e.$idle=!0,b++),e.$idleId=requestIdleCallback(()=>{e.$idleId=null,j(e)});return}M(e)}},oe=e=>{e.$queued||(e.$queued=!0,F(()=>{e.$queued=!1,M(e)}))},M=e=>{e.$idleId&&(cancelIdleCallback(e.$idleId),e.$idleId=null,e.$idle=!1,b--),c=e,c.$hooks&&(c.$hooks[0]=0);try{e.$h=e.$fn(e.$args)}catch(n){g(n,e.parentNode)}finally{if(c=null,$.add(e),e.$idle&&(e.$idle=!1,--b))return;L??=T(fe)}},fe=()=>{L=null;for(const e of $){$.delete(e);try{N(e.$h,e),e.$h=null}catch(n){g(n,e)}finally{B(e,"$layout"),y.add(e),O??=T(ce)}}},ce=()=>{O=null;for(const e of y)y.delete(e),B(e,"$effect")},B=(e,n)=>{if(e[n])for(const i of e[n]){const[l,t]=i;if(o(t))try{o(l)&&l(),i[0]=t()}catch(r){i[0]=null,g(r,e.parentNode)}finally{i[1]=null}}},H=e=>{if(e.nodeType==1){for(const n of e.children)H(n);if(e.$ref&&(e.$ref.current=null),!!e.$fn){$.delete(e),y.delete(e);for(const n of["$layout","$effect"])if(e[n])for(const i of e[n]){e[n].delete(i);try{const[l]=i;o(l)&&l()}catch(l){g(l,e.parentNode)}finally{i[0]=i[1]=null}}}}},g=(e,n)=>{for(let i;n;n=n.parentNode)if(o(i=n.$catch))return void i(e);throw e};let b=0,$=new Set,y=new Set,L=null,O=null,c=null;return G(se);})();
1
+ var ajo=(()=>{var x=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var n in t)x(e,n,{get:t[n],enumerable:!0})},J=(e,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of W(t))!D.call(e,l)&&l!==n&&x(e,l,{get:()=>t[l],enumerable:!(u=V(t,l))||u.enumerable});return e};var K=e=>J(x({},"__esModule",{value:!0}),e);var se={};G(se,{Fragment:()=>U,component:()=>X,h:()=>C,render:()=>N,useCallback:()=>h,useCatch:()=>Y,useEffect:()=>te,useHost:()=>p,useLayout:()=>ee,useMemo:()=>Q,useReducer:()=>S,useRef:()=>_,useState:()=>Z});const U=({children:e})=>e,C=(e,t,...n)=>{const{length:u}=n;return n=u==0?null:u==1?n[0]:n,{children:n,...t,nodeName:e}},N=(e,t,n)=>{let u=t.firstChild;for(e of b(e)){let l=u;if(e instanceof Node)l=e;else if(typeof e=="string"){for(;l&&l.nodeType!=3;)l=l.nextSibling;l?l.data!=e&&(l.data=e):l=document.createTextNode(e)}else{const{xmlns:a=n,nodeName:i,key:r,ref:o,memo:q,children:z,[T]:v,...P}=e;for(;l&&!(l.localName==i&&$(l.$key??=r,r));)l=l.nextSibling;l??=ie(a,i,r),ne(o)&&(o.current=l,l.$ref=o),(q==null||w(l.$deps,l.$deps=q))&&(re(P,l),f(v)?v(l):N(z,l,a))}l==u?u=u.nextSibling:fe(t,l,u)}for(;u;){const l=u.nextSibling;L(u),t.removeChild(u),u=l}},X=e=>({nodeName:t,as:n,props:u,key:l,ref:a,memo:i,...r})=>C(n??e?.as??"c-host",{...e?.props,...u,key:l,ref:a,memo:i,[T]:o=>{o.$fn=f(e)?e:le,o.$args={...e?.args,...r},M(o)}}),S=(e,t)=>{const n=p(),u=g(),[l,a]=u;return l==a.length&&(a[l]=[f(t)?t():t,i=>{const r=a[l][0],o=f(i)?i(r):i;$(r,a[l][0]=f(e)?e(r,o):o)||oe(n)}]),a[u[0]++]},Q=(e,t)=>{const n=g(),[u,l]=n;return(u==l.length||t==null||w(t,l[u][1]))&&(l[u]=[e(),t]),l[n[0]++][0]},Y=e=>{const t=p(),[n,u]=S(),l=g(),[a,i]=l;return i[l[0]++]=e,t.$catch??=r=>{f(i[a])&&i[a](r),u(r)},[n,()=>u()]},p=()=>c,Z=e=>S(null,e),_=e=>Q(()=>({current:e}),[]),h=(e,t)=>Q(()=>e,t),ee=(e,t)=>j(e,t,"$layout"),te=(e,t)=>j(e,t,"$effect"),{isArray:s,from:F}=Array,{is:$}=Object,le=()=>{},T=Symbol(),ne=e=>e&&typeof e=="object",f=e=>typeof e=="function",w=(e,t)=>s(e)&&s(t)?e.some((n,u)=>!$(n,t[u])):!$(e,t),ue=e=>F(e).reduce(ae,{}),ae=(e,{name:t,value:n})=>(e[t]=n,e),E=globalThis.queueMicrotask??(e=>e()),I=globalThis.requestAnimationFrame??E,ie=(e,t,n)=>{const u=e?document.createElementNS(e,t):document.createElement(t);return u.$key=n,u},b=function*(e,t={data:""},n=!0){let u;for(e of s(e)?e:[e])e==null||typeof e=="boolean"||(typeof e.nodeName=="string"?((u=t.data)&&(t.data="",yield u),yield e):f(e.nodeName)?yield*b(e.nodeName(e),t,!1):s(e)?yield*b(e,t,!1):t.data+=e);n&&(u=t.data)&&(yield u)},re=(e,t)=>{const n=t.$props??=t.hasAttributes()?ue(t.attributes):{};for(const u in{...n,...t.$props=e}){let l=e[u];l!==n[u]&&(u.startsWith("set:")?t[u.slice(4)]=l:l==null||l===!1?t.removeAttribute(u):t.setAttribute(u,l===!0?"":l))}},fe=(e,t,n)=>{if(t.contains?.(document.activeElement)){const u=t.nextSibling;for(;n&&n!=t;){const l=n.nextSibling;e.insertBefore(n,u),n=l}}else e.insertBefore(t,n)},g=()=>c.$hooks??=[0,[]],j=(e,t,n)=>{const u=p(),l=g(),[a,i]=l;a==i.length?(u[n]??=new Set).add(i[a]=[null,e,t]):(t==null||w(t,i[a][2]))&&(i[a][1]=e,i[a][2]=t),l[0]++},M=e=>{if(!e.$idle){if(globalThis.navigator?.scheduling?.isInputPending()){d.add(e),e.$idle=!0,A??=requestIdleCallback(()=>{A=null;const t=F(d);for(const n of t)d.delete(n),n.$idle=!1,M(n)});return}B(e)}},oe=e=>{e.$queued||(e.$queued=!0,E(()=>{e.$queued=!1,B(e)}))},B=e=>{e.$idle&&(d.delete(e),e.$idle=!1),c=e,c.$hooks&&(c.$hooks[0]=0);try{e.$h=e.$fn(e.$args)}catch(t){k(t,e.parentNode)}finally{c=null,y.add(e),e.$layoutQueued=!0,O??=I(ce)}},ce=()=>{O=null;for(const e of y){y.delete(e),e.$layoutQueued=!1;try{N(e.$h,e),e.$h=null}catch(t){k(t,e)}finally{H(e,"$layout"),m.add(e),e.$effectQueued=!0,R??=I(de)}}},de=()=>{R=null;for(const e of m)m.delete(e),e.$effectQueued=!1,H(e,"$effect")},H=(e,t)=>{if(e[t])for(const n of e[t]){const[u,l]=n;if(f(l))try{f(u)&&u(),n[0]=l()}catch(a){n[0]=null,k(a,e.parentNode)}finally{n[1]=null}}},L=e=>{if(e.nodeType==1){for(const t of e.children)L(t);if(e.$ref&&(e.$ref.current=null),!!e.$fn){e.$idle&&(d.delete(e),e.$idle=!1),e.$layoutQueued&&(y.delete(e),e.$layoutQueued=!1),e.$effectQueued&&(m.delete(e),e.$effectQueued=!1);for(const t of["$layout","$effect"])if(e[t])for(const n of e[t]){e[t].delete(n);try{const[u]=n;f(u)&&u()}catch(u){k(u,e.parentNode)}finally{n[0]=n[1]=null}}}}},k=(e,t)=>{for(let n;t;t=t.parentNode)if(f(n=t.$catch))return void n(e);throw e};let c=null,y=new Set,m=new Set,d=new Set,O=null,R=null,A=null;return K(se);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ajo",
3
- "version": "0.0.23",
3
+ "version": "0.0.24",
4
4
  "description": "ajo is a JavaScript view library for building user interfaces",
5
5
  "type": "module",
6
6
  "module": "index.js",