whenmap 0.1.1 → 0.2.1

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/README.md CHANGED
@@ -7,17 +7,17 @@ initalizes the value.
7
7
 
8
8
  [CER]: https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/whenDefined
9
9
 
10
- ## Use
10
+ ## WhenMap API
11
11
 
12
12
  ```javascript
13
13
  import { WhenMap } from 'whenmap'
14
14
 
15
- let whenmap = new WhenMap()
15
+ let when_db = new WhenMap()
16
16
 
17
- let p_ready = whenmap.when('example_key')
17
+ let p_ready = when_db.when('example_key')
18
18
  p_ready.then(v => console.log('Ready!', {v}))
19
19
 
20
- whenmap.set('example_key', example_init())
20
+ when_db.set('example_key', example_init())
21
21
 
22
22
  async function example_init() {
23
23
  // async initialize process
@@ -25,24 +25,91 @@ async function example_init() {
25
25
  }
26
26
  ```
27
27
 
28
- ## WhenMap API
29
- - `whenmap.when(key)` returns a promise for the key. The promise
30
- may or may not be resolved.
28
+ - `when_db.when(key)` returns a promise for the newly tracked key.
29
+ The promise may or may not be resolved.
31
30
 
32
- - `whenmap.get(key)` is an alias for `whenmap.when(key)`
31
+ - `when_db.ref(key, p)` is a observation hook for newly tracked keys.
33
32
 
34
- - `whenmap.set(key, value)` resolves the promise for the specified key, returning `this`.
33
+ - `when_db.get(key)` is an alias for `when_db.when(key)`
35
34
 
36
- - `whenmap.has(key)` returns
35
+ - `when_db.set(key, value)` resolves the promise for the specified key, returning `this`.
36
+
37
+ - `when_db.has(key)` returns
37
38
  `false` for untracked keys,
38
39
  `true` for resolved tracked keys, and
39
40
  `1` for unresolved tracked keys.
40
41
 
41
- - `whenmap.delete(key)` resolves a tracked key as `undefined` before removing it.
42
+ - `when_db.delete(key)` resolves a tracked key as `undefined` before removing it.
42
43
 
43
- - `whenmap.clear()` resolves any outstanding tracked keys as `undefined` before
44
+ - `when_db.clear()` resolves any outstanding tracked keys as `undefined` before
44
45
  clearing all tracked keys.
45
46
 
47
+
48
+ ## aiter_pipe API
49
+
50
+ `aiter_pipe(opt)` returns a connected `[send, recv]` pair where `send` is a
51
+ function and `recv` is an async iterable.
52
+
53
+ - `send(value)` adds value to the internal queue, after awaiting it if a promisable.
54
+ - `opt.on_error(err)` is an optional promise `.catch()` handler.
55
+ - `send.stop()` terminates the async iterable stream from within the `init_arg` closure.
56
+ - `send.ready` is a promise to provide overflow backpressure.
57
+ - `opt.max_size` manages the `send.ready` promise, default of 5
58
+
59
+ - `recv` extends the optional prototype
60
+ - `recv.size` returns the interal queue size
61
+ - `recv` supports async iterable protocol: `for await (let each of when_stream) {}`
62
+ - `recv.next()` returns the next resolved value
63
+ - if `opt.batch`, returns list of all resolved values
64
+ - `recv.return()`
65
+ - `recv.throw()`
66
+ - `recv[Symbol.asyncIterator]()`
67
+
68
+ - an AbortSignal instance is aborted when the stream is stopped.
69
+ - assigned into `recv.signal` and `send.signal`
70
+
71
+ ## WhenAiter API
72
+
73
+ `WhenAiter` is a Promise-like wrapper around `aiter_pipe` to transform callback
74
+ events into async iteratable.
75
+
76
+ ```javascript
77
+ import { WhenAiter } from 'whenmap'
78
+
79
+ // For streaming events
80
+ let when_stream = new WhenAiter(send => {
81
+ document.body.addEventListener(
82
+ 'some_custom_event',
83
+ evt => send(evt.detail),
84
+ {signal: send.signal})
85
+ })
86
+
87
+ for await (let detail of when_stream) {
88
+ console.log('use aiter event stream:', detail)
89
+ }
90
+ ```
91
+
92
+ `WhenAiter` can also transform a collection promises into an async iteratable.
93
+
94
+ ```javascript
95
+ import { WhenAiter } from 'whenmap'
96
+ const sleep = new Promise(done => setTimeout(done, ms, `delay: ${ms}`) )
97
+ // For streaming promises as they are settled
98
+ let misc_promises = [ sleep(100), sleep(20), sleep(50) ]
99
+
100
+ for await (let each of WhenAiter.from(misc_promises)) {
101
+ console.log('stream resolved:', detail)
102
+ }
103
+ ```
104
+
105
+ - `new WhenAiter(init_arg, opt)` returns an async iterable.
106
+ - If `init_arg` is iterable, `send()` is called on each item.
107
+ - other `init_arg(send)` is invoked.
108
+
109
+ - `WhenAiter.from(init_arg, opt)` is an alias for `new WhenAiter`
110
+
111
+
112
+
46
113
  ## Install
47
114
 
48
115
  ```bash
package/esm/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { WhenMap } from './whenmap.js';
2
+ export { WhenAiter, aiter_pipe } from './whenaiter.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1 @@
1
+ export{WhenMap}from"./whenmap.min.js";export{WhenAiter,aiter_pipe}from"./whenaiter.min.js";
@@ -0,0 +1,72 @@
1
+ class WhenAiter {
2
+ static from(init_arg, opt) {
3
+ return new this(init_arg, opt)}
4
+
5
+ constructor(init_arg, opt) {
6
+ let [send, recv_aiter] = aiter_pipe.call(this, opt);
7
+
8
+ if(init_arg)
9
+ init_arg?.call ? init_arg(send)
10
+ : Array.from(init_arg, send)
11
+ .reduce((a,b) => a.then(b), send.ready)
12
+ .then(_ => send.stop());
13
+
14
+ return recv_aiter} }
15
+
16
+
17
+ function aiter_pipe(opt) {
18
+ const q=[], max_size = opt?.max_size ?? 5;
19
+ const pop_result = opt?.batch ? q => q.splice(0) : q => q.shift();
20
+ let abrt = new AbortController();
21
+ let p_underflow, p_overflow;
22
+
23
+ // Sender function closure
24
+ function send(v) {
25
+ if (v?.then) {
26
+ return v.then(send, opt?.on_error)}
27
+
28
+ q.push(v);
29
+ p_underflow = void p_underflow?.resolve();
30
+
31
+ // update overflow promise state
32
+ if (q.length >= max_size) {
33
+ send.ready = (p_overflow ??= Promise.withResolvers()).promise;} }
34
+
35
+ send.signal = abrt.signal;
36
+ send.ready = Promise.resolve();
37
+ send.stop = async () => {
38
+ abrt = void abrt?.abort();
39
+ p_underflow = void p_underflow?.resolve();
40
+ return { done: true }};
41
+
42
+ // Async Iterable Receiver
43
+ let recv_aiter ={
44
+ __proto__: this
45
+ , get size() {return q.length}
46
+ , signal: abrt.signal
47
+
48
+ , [Symbol.asyncIterator]() {return this}
49
+ , return: send.stop
50
+ , throw: send.stop
51
+ , async next() {
52
+ while (1) {
53
+ let r, len=q.length;
54
+ if (len) {// results are available
55
+ r = pop_result(q);
56
+
57
+ if (len <= max_size) {
58
+ // update overflow promise state
59
+ p_overflow = void p_overflow?.resolve();}
60
+ return { value: r, done: false }}
61
+
62
+ if (undefined === abrt) {// async iterable is done
63
+ return { done: true }}
64
+
65
+ // set underflow promise state
66
+ await (p_underflow ??= Promise.withResolvers()).promise;
67
+ } } };// after underflow resolved, loop to try again
68
+
69
+ return [send, recv_aiter]}
70
+
71
+ export { WhenAiter, aiter_pipe };
72
+ //# sourceMappingURL=whenaiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whenaiter.js","sources":["../code/whenaiter.jsy"],"sourcesContent":["\nexport class WhenAiter ::\n static from(init_arg, opt) ::\n return new this(init_arg, opt)\n\n constructor(init_arg, opt) ::\n let [send, recv_aiter] = aiter_pipe.call(this, opt)\n\n if(init_arg)\n init_arg?.call ? init_arg(send)\n : Array.from(init_arg, send)\n .reduce((a,b) => a.then(b), send.ready)\n .then(_ => send.stop())\n\n return recv_aiter\n\n\nexport function aiter_pipe(opt) ::\n const q=[], max_size = opt?.max_size ?? 5\n const pop_result = opt?.batch ? q => q.splice(0) : q => q.shift()\n let abrt = new AbortController()\n let p_underflow, p_overflow\n\n // Sender function closure\n function send(v) ::\n if v?.then ::\n return v.then(send, opt?.on_error)\n\n q.push(v)\n p_underflow = void p_underflow?.resolve()\n\n // update overflow promise state\n if q.length >= max_size ::\n send.ready = (p_overflow ??= Promise.withResolvers()).promise\n\n send.signal = abrt.signal\n send.ready = Promise.resolve()\n send.stop = async () => ::\n abrt = void abrt?.abort()\n p_underflow = void p_underflow?.resolve()\n return { done: true }\n\n // Async Iterable Receiver\n let recv_aiter = @{}\n __proto__: this\n get size() :: return q.length\n signal: abrt.signal\n\n [Symbol.asyncIterator]() :: return this\n return: send.stop\n throw: send.stop\n async next() ::\n while 1 ::\n let r, len=q.length\n if len :: // results are available\n r = pop_result(q)\n\n if len <= max_size ::\n // update overflow promise state\n p_overflow = void p_overflow?.resolve()\n return { value: r, done: false }\n\n if undefined === abrt :: // async iterable is done\n return { done: true }\n\n // set underflow promise state\n await (p_underflow ??= Promise.withResolvers()).promise\n // after underflow resolved, loop to try again\n\n return [send, recv_aiter]\n"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ class e{static from(e,r){return new this(e,r)}constructor(e,t){let[o,s]=r.call(this,t);return e&&(e?.call?e(o):Array.from(e,o).reduce(((e,r)=>e.then(r)),o.ready).then((e=>o.stop()))),s}}function r(e){const r=[],t=e?.max_size??5,o=e?.batch?e=>e.splice(0):e=>e.shift();let s,n,i=new AbortController;function l(o){if(o?.then)return o.then(l,e?.on_error);r.push(o),s=void s?.resolve(),r.length>=t&&(l.ready=(n??=Promise.withResolvers()).promise)}return l.signal=i.signal,l.ready=Promise.resolve(),l.stop=async()=>(i=void i?.abort(),s=void s?.resolve(),{done:!0}),[l,{__proto__:this,get size(){return r.length},signal:i.signal,[Symbol.asyncIterator](){return this},return:l.stop,throw:l.stop,async next(){for(;;){let e,l=r.length;if(l)return e=o(r),l<=t&&(n=void n?.resolve()),{value:e,done:!1};if(void 0===i)return{done:!0};await(s??=Promise.withResolvers()).promise}}}]}export{e as WhenAiter,r as aiter_pipe};
package/esm/whenmap.js CHANGED
@@ -1,9 +1,14 @@
1
- const _when_fns = new WeakMap();
2
- const _as_when_tuples = ([k,v]) => [k, Promise.resolve(v)];
1
+ const _when_fns = /* #__PURE__ */ new WeakMap();
2
+ function _when_resolve(p, val) {
3
+ let fn = _when_fns.get(p);
4
+ _when_fns.delete(p);
5
+ fn?.(val);}
3
6
 
4
7
  class WhenMap extends Map {
5
8
  constructor(entries) {
6
- super(entries &&= Array.from(entries, _as_when_tuples)); }
9
+ super();
10
+ for (let [k,v] of entries||[])
11
+ this.set(k,v);}
7
12
 
8
13
  has(key) {
9
14
  let p = super.get(key);
@@ -16,30 +21,25 @@ class WhenMap extends Map {
16
21
  p = new Promise(fn => f=fn);
17
22
  _when_fns.set(p, f);
18
23
  super.set(key, p);
19
- this.on_ref?.(key, p);}
24
+ this.ref?.(key, p);}
20
25
  return p}
21
26
 
27
+ // ref(key, p) ::
28
+
22
29
  set(key, val) {
23
- // resolve promise
24
- _pop_when(this.when(key))?.(val);
30
+ _when_resolve(this.when(key),val);
25
31
  return this}
26
32
 
27
33
  delete(key) {
28
34
  // resolve outstanding promise, if exists
29
- _pop_when(super.get(key))?.();
35
+ _when_resolve(super.get(key));
30
36
  return super.delete(key)}
31
37
 
32
38
  clear() {
33
39
  // resolve all outstanding promises
34
40
  for (let p of this.values()) {
35
- _pop_when(p)?.();}
41
+ _when_resolve(p);}
36
42
  super.clear();} }
37
43
 
38
-
39
- function _pop_when(p) {
40
- let f = _when_fns.get(p);
41
- _when_fns.delete(p);
42
- return f}
43
-
44
44
  export { WhenMap, WhenMap as default };
45
45
  //# sourceMappingURL=whenmap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whenmap.js","sources":["../code/whenmap.jsy"],"sourcesContent":["const _when_fns = new WeakMap()\nconst _as_when_tuples = ([k,v]) => [k, Promise.resolve(v)]\n\nexport class WhenMap extends Map ::\n constructor(entries) ::\n super @ entries &&= Array.from(entries, _as_when_tuples)\n\n has(key) ::\n let p = super.get(key)\n return p ? _when_fns.has(p) ? 1 : true : false\n\n get get() :: return this.when\n when(key) ::\n let p = super.get(key), f\n if ! p ::\n p = new Promise(fn => f=fn)\n _when_fns.set(p, f)\n super.set(key, p)\n this.on_ref?.(key, p)\n return p\n\n set(key, val) ::\n // resolve promise\n _pop_when(this.when(key))?.(val)\n return this\n\n delete(key) ::\n // resolve outstanding promise, if exists\n _pop_when(super.get(key))?.()\n return super.delete(key)\n\n clear() ::\n // resolve all outstanding promises\n for let p of this.values() ::\n _pop_when(p)?.()\n super.clear()\n\nexport default WhenMap\n\n\nfunction _pop_when(p) ::\n let f = _when_fns.get(p)\n _when_fns.delete(p)\n return f\n\n"],"names":[],"mappings":"AAAA,MAAA,SAAA,GAAA,IAAA,OAAA;AACA,MAAA,eAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,EAAA,OAAA,CAAA,OAAA,CAAA,CAAA,CAAA;;AAEA,MAAA,OAAA,SAAA,GAAA,CAAA;AACE,EAAA,WAAA,CAAA,OAAA,EAAA;IACE,KAAO,CAAA,OAAA,KAAA,KAAA,CAAA,IAAA,CAAA,OAAA,EAAA,eAAA,CAAA,EAAA;;AAET,EAAA,GAAA,CAAA,GAAA,EAAA;AACE,IAAA,IAAA,CAAA,GAAA,KAAA,CAAA,GAAA,CAAA,GAAA;AACA,IAAA,OAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,IAAA,GAAA,KAAA;;EAEF,IAAY,GAAA,GAAA,CAAA,OAAA,IAAA,CAAA,IAAA;AACZ,EAAA,IAAA,CAAA,GAAA,EAAA;AACE,IAAA,IAAA,CAAA,GAAA,KAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA;AACG,IAAA,IAAA,EAAA,CAAA,EAAA;AACD,MAAA,CAAA,GAAA,IAAA,OAAA,CAAA,EAAA,IAAA,CAAA,CAAA,EAAA;AACA,MAAA,SAAA,CAAA,GAAA,CAAA,CAAA,EAAA,CAAA;AACA,MAAA,KAAA,CAAA,GAAA,CAAA,GAAA,EAAA,CAAA;AACA,MAAA,IAAA,CAAA,MAAA,GAAA,GAAA,EAAA,CAAA,EAAA;AACF,IAAA,OAAA,CAAA;;AAEF,EAAA,GAAA,CAAA,GAAA,EAAA,GAAA,EAAA;;AAEE,IAAA,SAAA,CAAA,IAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAA;AACA,IAAA,OAAA,IAAA;;AAEF,EAAA,MAAA,CAAA,GAAA,EAAA;;AAEE,IAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,GAAA,CAAA,CAAA;AACA,IAAA,OAAA,KAAA,CAAA,MAAA,CAAA,GAAA,CAAA;;AAEF,EAAA,KAAA,GAAA;;AAEK,IAAA,KAAA,IAAA,CAAA,IAAA,IAAA,CAAA,MAAA,EAAA,EAAA;AACD,MAAA,SAAA,CAAA,CAAA,CAAA,KAAA;AACF,IAAA,KAAA,CAAA,KAAA,GAAA,CAAA;;;AAKJ,SAAA,SAAA,CAAA,CAAA,EAAA;AACE,EAAA,IAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA;AACA,EAAA,SAAA,CAAA,MAAA,CAAA,CAAA;AACA,EAAA,OAAA,CAAA;;;;"}
1
+ {"version":3,"file":"whenmap.js","sources":["../code/whenmap.jsy"],"sourcesContent":["const _when_fns = /* #__PURE__ */ new WeakMap()\nfunction _when_resolve(p, val) ::\n let fn = _when_fns.get(p)\n _when_fns.delete(p)\n fn?.(val)\n\nexport class WhenMap extends Map ::\n constructor(entries) ::\n super()\n for (let [k,v] of entries||[])\n this.set(k,v)\n\n has(key) ::\n let p = super.get(key)\n return p ? _when_fns.has(p) ? 1 : true : false\n\n get get() :: return this.when\n when(key) ::\n let p = super.get(key), f\n if ! p ::\n p = new Promise(fn => f=fn)\n _when_fns.set(p, f)\n super.set(key, p)\n this.ref?.(key, p)\n return p\n\n // ref(key, p) ::\n\n set(key, val) ::\n _when_resolve(this.when(key),val)\n return this\n\n delete(key) ::\n // resolve outstanding promise, if exists\n _when_resolve(super.get(key))\n return super.delete(key)\n\n clear() ::\n // resolve all outstanding promises\n for let p of this.values() ::\n _when_resolve(p)\n super.clear()\n\nexport default WhenMap\n\n"],"names":[],"mappings":"AAAA,MAAA,SAAA,mBAAiC,IAAA,OAAA;AACjC,SAAA,aAAA,CAAA,CAAA,EAAA,GAAA,EAAA;AACE,EAAA,IAAA,EAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA;AACA,EAAA,SAAA,CAAA,MAAA,CAAA,CAAA;AACA,EAAA,EAAA,GAAA,GAAA,EAAA;;AAEF,MAAA,OAAA,SAAA,GAAA,CAAA;AACE,EAAA,WAAA,CAAA,OAAA,EAAA;AACE,IAAA,KAAA;AACA,IAAA,KAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,OAAA,EAAA,EAAA;AACE,MAAA,IAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,EAAA;;AAEJ,EAAA,GAAA,CAAA,GAAA,EAAA;AACE,IAAA,IAAA,CAAA,GAAA,KAAA,CAAA,GAAA,CAAA,GAAA;AACA,IAAA,OAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,IAAA,GAAA,KAAA;;EAEF,IAAA,GAAA,GAAA,CAAY,OAAA,IAAA,CAAA,IAAA;AACZ,EAAA,IAAA,CAAA,GAAA,EAAA;AACE,IAAA,IAAA,CAAA,GAAA,KAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA;AACG,IAAA,IAAA,EAAA,CAAA,EAAA;AACD,MAAA,CAAA,GAAA,IAAA,OAAA,CAAA,EAAA,IAAA,CAAA,CAAA,EAAA;AACA,MAAA,SAAA,CAAA,GAAA,CAAA,CAAA,EAAA,CAAA;AACA,MAAA,KAAA,CAAA,GAAA,CAAA,GAAA,EAAA,CAAA;AACA,MAAA,IAAA,CAAA,GAAA,GAAA,GAAA,EAAA,CAAA,EAAA;AACF,IAAA,OAAA,CAAA;;;;AAIF,EAAA,GAAA,CAAA,GAAA,EAAA,GAAA,EAAA;AACE,IAAA,aAAA,CAAA,IAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,GAAA;AACA,IAAA,OAAA,IAAA;;AAEF,EAAA,MAAA,CAAA,GAAA,EAAA;;AAEE,IAAA,aAAA,CAAA,KAAA,CAAA,GAAA,CAAA,GAAA,CAAA;AACA,IAAA,OAAA,KAAA,CAAA,MAAA,CAAA,GAAA,CAAA;;AAEF,EAAA,KAAA,GAAA;;AAEK,IAAA,KAAA,IAAA,CAAA,IAAA,IAAA,CAAA,MAAA,EAAA,EAAA;AACD,MAAA,aAAA,CAAA,CAAA,EAAA;AACF,IAAA,KAAA,CAAA,KAAA,GAAA,CAAA;;;;"}
@@ -1 +1 @@
1
- const e=new WeakMap,t=([e,t])=>[e,Promise.resolve(t)];class r extends Map{constructor(e){super(e&&=Array.from(e,t))}has(t){let r=super.get(t);return!!r&&(!e.has(r)||1)}get get(){return this.when}when(t){let r,s=super.get(t);return s||(s=new Promise((e=>r=e)),e.set(s,r),super.set(t,s),this.on_ref?.(t,s)),s}set(e,t){return s(this.when(e))?.(t),this}delete(e){return s(super.get(e))?.(),super.delete(e)}clear(){for(let e of this.values())s(e)?.();super.clear()}}function s(t){let r=e.get(t);return e.delete(t),r}export{r as WhenMap,r as default};
1
+ const e=new WeakMap;function t(t,s){let r=e.get(t);e.delete(t),r?.(s)}class s extends Map{constructor(e){super();for(let[t,s]of e||[])this.set(t,s)}has(t){let s=super.get(t);return!!s&&(!e.has(s)||1)}get get(){return this.when}when(t){let s,r=super.get(t);return r||(r=new Promise((e=>s=e)),e.set(r,s),super.set(t,r),this.ref?.(t,r)),r}set(e,s){return t(this.when(e),s),this}delete(e){return t(super.get(e)),super.delete(e)}clear(){for(let e of this.values())t(e);super.clear()}}export{s as WhenMap,s as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whenmap",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "",
5
5
  "license": "BSD-2-Clause",
6
6
  "author": "Shane Holloway <shane.holloway@ieee.org>",
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "type": "module",
19
19
  "exports": {
20
- ".": "./esm/whenmap.js",
20
+ ".": "./esm/index.js",
21
21
  "./esm": "./esm"
22
22
  },
23
23
  "imports": {
@@ -28,12 +28,12 @@
28
28
  },
29
29
  "devDependencies": {
30
30
  "@rollup/plugin-terser": "^0.4.4",
31
- "chai": "^5.2.0",
32
- "rollup": "^4.36.0",
33
- "rollup-plugin-jsy": "^1.9.2"
31
+ "chai": "^6.2.2",
32
+ "rollup": "^4.54.0",
33
+ "rollup-plugin-jsy": "^1.9.4"
34
34
  },
35
35
  "optionalDependencies": {
36
- "vite": "^6.2.2"
36
+ "vite": "^7.3.0"
37
37
  },
38
38
  "scripts": {
39
39
  "clean": "rm ./esm/* || true",