whenmap 0.0.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/esm/index.js +4 -0
- package/esm/index.js.map +1 -0
- package/esm/index.min.js +1 -0
- package/esm/observe_when.js +74 -0
- package/esm/observe_when.js.map +1 -0
- package/esm/observe_when.min.js +1 -0
- package/esm/whenmap.js +127 -0
- package/esm/whenmap.js.map +1 -0
- package/esm/whenmap.min.js +1 -0
- package/esm/whenmap_proxy.js +10 -0
- package/esm/whenmap_proxy.js.map +1 -0
- package/esm/whenmap_proxy.min.js +1 -0
- package/package.json +51 -0
package/esm/index.js
ADDED
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
package/esm/index.min.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{_whenmap,whenmap}from"./whenmap.min.js";export{whencall,whencall_first,whencall_stream,whenmap_watch,whenstream}from"./observe_when.min.js";export{_whenmap_pxy_,as_whenmap_proxy}from"./whenmap_proxy.min.js";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
function whenmap_watch(when_tgt, opt={}) {
|
|
2
|
+
let { refs, assigns, on_update, signal } = opt;
|
|
3
|
+
return {
|
|
4
|
+
__proto__: null
|
|
5
|
+
, has: key => (_watch(key), when_tgt.has(key))
|
|
6
|
+
, get: key => (_watch(key), when_tgt.get(key))
|
|
7
|
+
, when: key => (_watch(key), when_tgt.when(key))
|
|
8
|
+
, set: (key, value) => (assigns?.add(key), when_tgt.set(key,v))
|
|
9
|
+
, set_when: (key, value) => (assigns?.add(key), when_tgt.set_when(key,v))}
|
|
10
|
+
|
|
11
|
+
function _watch(key) {
|
|
12
|
+
if (on_update && !refs?.has(key)) {
|
|
13
|
+
refs ??= new Set(); // lazy init if not present
|
|
14
|
+
when_tgt.subscribe(key, on_update, signal);}
|
|
15
|
+
|
|
16
|
+
refs?.add(key);} }
|
|
17
|
+
|
|
18
|
+
async function * whenstream(when_db, opt_ctx={}) {
|
|
19
|
+
var _dp_update, _cache = new Map();
|
|
20
|
+
|
|
21
|
+
function on_update(key, value) {
|
|
22
|
+
let prev = _cache.get(key);
|
|
23
|
+
if (prev===undefined && !_cache.has(key)) {
|
|
24
|
+
//First assignment; avoid re-triggering update
|
|
25
|
+
_cache.set(key, value);}
|
|
26
|
+
else if (value !== prev) {
|
|
27
|
+
//Subsequent assignment; do triggering update
|
|
28
|
+
_cache.set(key, value);
|
|
29
|
+
_dp_update.resolve(true); }// trigger composite update
|
|
30
|
+
else ; }//Identical assignment; avoid re-triggering update
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
// wrap when_db in a watch observer
|
|
34
|
+
when_db = whenmap_watch(when_db,{
|
|
35
|
+
__proto__: opt_ctx, on_update} );
|
|
36
|
+
|
|
37
|
+
let when_tgt = opt_ctx.with_whenmap
|
|
38
|
+
? opt_ctx.with_whenmap(when_db) // allow wrapping the when_db; e.g. as a Proxy()
|
|
39
|
+
: when_db; // or passthrough
|
|
40
|
+
|
|
41
|
+
const {signal, pre_tick, tick, post_tick} = opt_ctx;
|
|
42
|
+
while (! signal?.aborted) {
|
|
43
|
+
//some dependency updated
|
|
44
|
+
await _dp_update?.promise
|
|
45
|
+
|
|
46
|
+
// wait throttled; e.g. requestAnimationFrame
|
|
47
|
+
; pre_tick && await pre_tick();
|
|
48
|
+
|
|
49
|
+
//reset watcher
|
|
50
|
+
_dp_update = Promise.withResolvers()
|
|
51
|
+
|
|
52
|
+
; tick && await tick();
|
|
53
|
+
|
|
54
|
+
// return when_tgt because something changed
|
|
55
|
+
yield when_tgt
|
|
56
|
+
|
|
57
|
+
; post_tick && await post_tick();} }
|
|
58
|
+
|
|
59
|
+
async function whencall(when_db, opt_ctx={}) {
|
|
60
|
+
for await (let r of whencall_stream(when_db, opt_ctx)) {} }
|
|
61
|
+
|
|
62
|
+
async function whencall_first(when_db, opt_ctx={}) {
|
|
63
|
+
for await (let r of whencall_stream(when_db, opt_ctx)) {
|
|
64
|
+
return r} }
|
|
65
|
+
|
|
66
|
+
async function * whencall_stream(when_db, opt_ctx={}) {
|
|
67
|
+
const name = opt_ctx.name;
|
|
68
|
+
for await (let db of whenstream(when_db, opt_ctx)) {
|
|
69
|
+
let result = await opt_ctx.update(db, name);
|
|
70
|
+
if (name) {result = when_db.set(name, result);}
|
|
71
|
+
yield result;} }
|
|
72
|
+
|
|
73
|
+
export { whencall, whencall_first, whencall_stream, whenmap_watch, whenstream };
|
|
74
|
+
//# sourceMappingURL=observe_when.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe_when.js","sources":["../code/whenmap_watch.jsy","../code/whenstream.jsy","../code/whencall.jsy"],"sourcesContent":["export function whenmap_watch(when_tgt, opt={}) ::\n let { refs, assigns, on_update, signal } = opt\n return @{}\n __proto__: null\n has: key => (_watch(key), when_tgt.has(key))\n get: key => (_watch(key), when_tgt.get(key))\n when: key => (_watch(key), when_tgt.when(key))\n set: (key, value) => (assigns?.add(key), when_tgt.set(key,v))\n set_when: (key, value) => (assigns?.add(key), when_tgt.set_when(key,v))\n\n function _watch(key) ::\n if on_update && !refs?.has(key) ::\n refs ??= new Set() // lazy init if not present\n when_tgt.subscribe(key, on_update, signal)\n\n refs?.add(key)\n\n","import {whenmap_watch} from './whenmap_watch.jsy'\n\nexport async function * whenstream(when_db, opt_ctx={}) ::\n var _dp_update, _cache = new Map()\n\n function on_update(key, value) ::\n let prev = _cache.get(key)\n if prev===undefined && !_cache.has(key) ::\n //First assignment; avoid re-triggering update\n _cache.set(key, value)\n else if value !== prev ::\n //Subsequent assignment; do triggering update\n _cache.set(key, value)\n _dp_update.resolve(true) // trigger composite update\n else :: //Identical assignment; avoid re-triggering update\n\n\n // wrap when_db in a watch observer\n when_db = whenmap_watch @ when_db, @{}\n __proto__: opt_ctx, on_update\n\n let when_tgt = opt_ctx.with_whenmap\n ? opt_ctx.with_whenmap(when_db) // allow wrapping the when_db; e.g. as a Proxy()\n : when_db // or passthrough\n\n const {signal, pre_tick, tick, post_tick} = opt_ctx\n while ! signal?.aborted ::\n //some dependency updated\n await _dp_update?.promise\n\n // wait throttled; e.g. requestAnimationFrame\n ; pre_tick && await pre_tick()\n\n //reset watcher\n _dp_update = Promise.withResolvers()\n\n ; tick && await tick()\n\n // return when_tgt because something changed\n yield when_tgt\n\n ; post_tick && await post_tick()\n\n\n","import {whenstream} from './whenstream.jsy'\n\nexport async function whencall(when_db, opt_ctx={}) ::\n for await let r of whencall_stream(when_db, opt_ctx) ::\n\nexport async function whencall_first(when_db, opt_ctx={}) ::\n for await let r of whencall_stream(when_db, opt_ctx) ::\n return r\n\nexport async function * whencall_stream(when_db, opt_ctx={}) ::\n const name = opt_ctx.name\n for await let db of whenstream(when_db, opt_ctx) ::\n let result = await opt_ctx.update(db, name)\n if name :: result = when_db.set(name, result)\n yield result\n\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t(t,e={}){let{refs:a,assigns:n,on_update:s,signal:i}=e;return{__proto__:null,has:e=>(o(e),t.has(e)),get:e=>(o(e),t.get(e)),when:e=>(o(e),t.when(e)),set:(e,a)=>(n?.add(e),t.set(e,v)),set_when:(e,a)=>(n?.add(e),t.set_when(e,v))};function o(e){s&&!a?.has(e)&&(a??=new Set,t.subscribe(e,s,i)),a?.add(e)}}async function*e(e,a={}){var n,s=new Map;e=t(e,{__proto__:a,on_update:function(t,e){let a=s.get(t);void 0!==a||s.has(t)?e!==a&&(s.set(t,e),n.resolve(!0)):s.set(t,e)}});let i=a.with_whenmap?a.with_whenmap(e):e;const{signal:o,pre_tick:r,tick:w,post_tick:c}=a;for(;!o?.aborted;)await(n?.promise),r&&await r(),n=Promise.withResolvers(),w&&await w(),yield i,c&&await c()}async function a(t,e={}){for await(let a of s(t,e));}async function n(t,e={}){for await(let a of s(t,e))return a}async function*s(t,a={}){const n=a.name;for await(let s of e(t,a)){let e=await a.update(s,n);n&&(e=t.set(n,e)),yield e}}export{a as whencall,n as whencall_first,s as whencall_stream,t as whenmap_watch,e as whenstream};
|
package/esm/whenmap.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
function whenmap(opt) {
|
|
2
|
+
return _whenmap(_whenmap_entry_, opt)}
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
function _whenmap(_entry_proto_, opt) {
|
|
6
|
+
const _subs = opt?.subscribers ?? new Map();
|
|
7
|
+
|
|
8
|
+
const _db = opt?.db ?? new Map();
|
|
9
|
+
const _at = key => {
|
|
10
|
+
let entry = _db.get(key);
|
|
11
|
+
if (undefined === entry) {
|
|
12
|
+
_db.set(key, entry=_entry_proto_.init(key, _emit));}
|
|
13
|
+
return entry};
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
__proto__: null
|
|
17
|
+
|
|
18
|
+
, // avoid lazy init for has() query
|
|
19
|
+
has: key => !! _db.get(key)?.assigned
|
|
20
|
+
|
|
21
|
+
, get: key => _at(key).promise
|
|
22
|
+
, when: key => _at(key).promise
|
|
23
|
+
|
|
24
|
+
, async set_when(key, value) {
|
|
25
|
+
_at(key); // reference in the db
|
|
26
|
+
this.set(key, value = await value);
|
|
27
|
+
return value}
|
|
28
|
+
|
|
29
|
+
, set(key, value) {
|
|
30
|
+
let entry = _at(key);
|
|
31
|
+
entry.resolve(value);
|
|
32
|
+
return this}
|
|
33
|
+
|
|
34
|
+
, delete(key) {
|
|
35
|
+
let entry = _db.get(key);
|
|
36
|
+
entry?.fin() && _emit(key);
|
|
37
|
+
return _db.delete(key)}
|
|
38
|
+
|
|
39
|
+
, clear() {
|
|
40
|
+
let tuples = [... _db.entries()];
|
|
41
|
+
_db.clear();
|
|
42
|
+
|
|
43
|
+
for (let [,entry] of tuples) {
|
|
44
|
+
entry.fin();}
|
|
45
|
+
|
|
46
|
+
for (let [key] of tuples) {
|
|
47
|
+
_emit(key);} }
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
, keys: () => _db.keys()
|
|
51
|
+
, *values() {for (let [,entry] of _db) {yield entry.promise;} }
|
|
52
|
+
, *entries() {for (let [key, entry] of _db) {yield [key, entry.promise];} }
|
|
53
|
+
, [Symbol.iterator]() {return this.entries()}
|
|
54
|
+
|
|
55
|
+
, value_stream_at(key, signal) {
|
|
56
|
+
return _at(key).when_stream(signal)}
|
|
57
|
+
|
|
58
|
+
, async * entry_stream_at(key, signal) {
|
|
59
|
+
for await (let value of _at(key).when_stream(signal)) {
|
|
60
|
+
yield [key, value];} }
|
|
61
|
+
|
|
62
|
+
, async subscribe_at(key, emit_fn, signal) {
|
|
63
|
+
for await (let value of _at(key).when_stream(signal)) {
|
|
64
|
+
emit_fn(key, value);} }
|
|
65
|
+
|
|
66
|
+
, subscribe(key_or_fn, ...args) {
|
|
67
|
+
if (key_or_fn.call) {
|
|
68
|
+
_subs.set(key_or_fn, args[0]);}
|
|
69
|
+
else if (key_or_fn.trim) {
|
|
70
|
+
this.subscribe_at(key_or_fn, ...args);}
|
|
71
|
+
else throw TypeError()
|
|
72
|
+
return this} }
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
function _emit(key, value) {
|
|
76
|
+
for (let [emit_fn, signal] of _subs) {
|
|
77
|
+
if (! signal?.aborted) {
|
|
78
|
+
emit_fn(key, value);}
|
|
79
|
+
else _subs.delete(emit_fn);} } }
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
const _whenmap_entry_ ={
|
|
83
|
+
assigned: false
|
|
84
|
+
, done: false
|
|
85
|
+
|
|
86
|
+
, init(key, _emit) {
|
|
87
|
+
_emit = _emit.bind(null, key);
|
|
88
|
+
let self ={
|
|
89
|
+
__proto__: this, key
|
|
90
|
+
, cycle(value) {
|
|
91
|
+
let $ = this.$, _dn = Promise.withResolvers()
|
|
92
|
+
; (this.$ = _dn).promise.then(_emit);
|
|
93
|
+
return $} };
|
|
94
|
+
|
|
95
|
+
self.cycle();
|
|
96
|
+
return self}
|
|
97
|
+
|
|
98
|
+
, cycle() {
|
|
99
|
+
let _dp = this.$
|
|
100
|
+
;(this.$ = Promise.withResolvers())
|
|
101
|
+
.promise.then(this._emit);
|
|
102
|
+
return _dp}
|
|
103
|
+
|
|
104
|
+
, fin() {
|
|
105
|
+
this.done = true;
|
|
106
|
+
let _dp = this.$;
|
|
107
|
+
this.$ = null;
|
|
108
|
+
_dp?.resolve();
|
|
109
|
+
return this}
|
|
110
|
+
|
|
111
|
+
, resolve(value) {
|
|
112
|
+
this.promise = Promise.resolve(value);
|
|
113
|
+
this.assigned = true;
|
|
114
|
+
this.cycle().resolve(value);}
|
|
115
|
+
|
|
116
|
+
, async * when_stream(signal) {
|
|
117
|
+
yield this.promise;
|
|
118
|
+
|
|
119
|
+
while (1) {
|
|
120
|
+
if (this.done || signal?.aborted) {return}
|
|
121
|
+
let value = await this.$.promise;
|
|
122
|
+
|
|
123
|
+
if (this.done || signal?.aborted) {return}
|
|
124
|
+
yield value;} } };
|
|
125
|
+
|
|
126
|
+
export { _whenmap, whenmap as default, whenmap };
|
|
127
|
+
//# sourceMappingURL=whenmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whenmap.js","sources":["../code/whenmap.jsy"],"sourcesContent":["export function whenmap(opt) ::\n return _whenmap(_whenmap_entry_, opt)\nexport default whenmap\n\n\nexport function _whenmap(_entry_proto_, opt) ::\n const _subs = opt?.subscribers ?? new Map()\n\n const _db = opt?.db ?? new Map()\n const _at = key => ::\n let entry = _db.get(key)\n if undefined === entry ::\n _db.set(key, entry=_entry_proto_.init(key, _emit))\n return entry\n\n return @{}\n __proto__: null\n\n // avoid lazy init for has() query\n has: key => !! _db.get(key)?.assigned\n\n get: key => _at(key).promise\n when: key => _at(key).promise\n\n async set_when(key, value) ::\n _at(key) // reference in the db\n this.set(key, value = await value) \n return value\n\n set(key, value) ::\n let entry = _at(key)\n entry.resolve(value)\n return this\n\n delete(key) ::\n let entry = _db.get(key)\n entry?.fin() && _emit(key)\n return _db.delete(key)\n\n clear() ::\n let tuples = [... _db.entries()]\n _db.clear()\n\n for let [,entry] of tuples ::\n entry.fin()\n\n for let [key] of tuples ::\n _emit(key)\n\n\n keys: () => _db.keys()\n *values() :: for let [,entry] of _db :: yield entry.promise\n *entries() :: for let [key, entry] of _db :: yield [key, entry.promise]\n [Symbol.iterator]() :: return this.entries()\n\n value_stream_at(key, signal) ::\n return _at(key).when_stream(signal)\n\n async * entry_stream_at(key, signal) ::\n for await let value of _at(key).when_stream(signal) ::\n yield [key, value]\n\n async subscribe_at(key, emit_fn, signal) ::\n for await let value of _at(key).when_stream(signal) ::\n emit_fn(key, value)\n\n subscribe(key_or_fn, ...args) ::\n if key_or_fn.call ::\n _subs.set(key_or_fn, args[0])\n else if key_or_fn.trim ::\n this.subscribe_at(key_or_fn, ...args)\n else throw TypeError()\n return this\n\n\n function _emit(key, value) ::\n for let [emit_fn, signal] of _subs ::\n if ! signal?.aborted ::\n emit_fn(key, value)\n else _subs.delete(emit_fn)\n\n\nconst _whenmap_entry_ = @{}\n assigned: false\n done: false\n\n init(key, _emit) ::\n _emit = _emit.bind(null, key)\n let self = @{}\n __proto__: this, key\n cycle(value) ::\n let $ = this.$, _dn = Promise.withResolvers()\n ; (this.$ = _dn).promise.then(_emit)\n return $\n\n self.cycle()\n return self\n\n cycle() ::\n let _dp = this.$\n ;(this.$ = Promise.withResolvers())\n .promise.then(this._emit)\n return _dp\n\n fin() ::\n this.done = true\n let _dp = this.$\n this.$ = null\n _dp?.resolve()\n return this\n\n resolve(value) ::\n this.promise = Promise.resolve(value)\n this.assigned = true\n this.cycle().resolve(value)\n\n async * when_stream(signal) ::\n yield this.promise\n\n while 1 ::\n if this.done || signal?.aborted :: return\n let value = await this.$.promise\n\n if this.done || signal?.aborted :: return\n yield value\n\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){return t(r,e)}function t(e,t){const r=t?.subscribers??new Map,s=t?.db??new Map,i=t=>{let r=s.get(t);return void 0===r&&s.set(t,r=e.init(t,n)),r};return{__proto__:null,has:e=>!!s.get(e)?.assigned,get:e=>i(e).promise,when:e=>i(e).promise,async set_when(e,t){return i(e),this.set(e,t=await t),t},set(e,t){return i(e).resolve(t),this},delete(e){let t=s.get(e);return t?.fin()&&n(e),s.delete(e)},clear(){let e=[...s.entries()];s.clear();for(let[,t]of e)t.fin();for(let[t]of e)n(t)},keys:()=>s.keys(),*values(){for(let[,e]of s)yield e.promise},*entries(){for(let[e,t]of s)yield[e,t.promise]},[Symbol.iterator](){return this.entries()},value_stream_at:(e,t)=>i(e).when_stream(t),async*entry_stream_at(e,t){for await(let r of i(e).when_stream(t))yield[e,r]},async subscribe_at(e,t,r){for await(let s of i(e).when_stream(r))t(e,s)},subscribe(e,...t){if(e.call)r.set(e,t[0]);else{if(!e.trim)throw TypeError();this.subscribe_at(e,...t)}return this}};function n(e,t){for(let[s,i]of r)i?.aborted?r.delete(s):s(e,t)}}const r={assigned:!1,done:!1,init(e,t){t=t.bind(null,e);let r={__proto__:this,key:e,cycle(e){let r=this.$,s=Promise.withResolvers();return(this.$=s).promise.then(t),r}};return r.cycle(),r},cycle(){let e=this.$;return(this.$=Promise.withResolvers()).promise.then(this._emit),e},fin(){this.done=!0;let e=this.$;return this.$=null,e?.resolve(),this},resolve(e){this.promise=Promise.resolve(e),this.assigned=!0,this.cycle().resolve(e)},async*when_stream(e){for(yield this.promise;;){if(this.done||e?.aborted)return;let t=await this.$.promise;if(this.done||e?.aborted)return;yield t}}};export{t as _whenmap,e as default,e as whenmap};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const _whenmap_pxy_ ={
|
|
2
|
+
has: (map_db, key) => key !== 'then' ? map_db.has(key) : null
|
|
3
|
+
, get: (map_db, key) => key !== 'then' ? map_db.when(key) : null
|
|
4
|
+
, set: (map_db, key, value) => key !== 'then' ? map_db.set_when(key, value) : null};
|
|
5
|
+
|
|
6
|
+
const as_whenmap_proxy = when_db =>
|
|
7
|
+
new Proxy(when_db, _whenmap_pxy_);
|
|
8
|
+
|
|
9
|
+
export { _whenmap_pxy_, as_whenmap_proxy, as_whenmap_proxy as default };
|
|
10
|
+
//# sourceMappingURL=whenmap_proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whenmap_proxy.js","sources":["../code/whenmap_proxy.jsy"],"sourcesContent":["export const _whenmap_pxy_ = @{}\n has: (map_db, key) => key !== 'then' ? map_db.has(key) : null\n get: (map_db, key) => key !== 'then' ? map_db.when(key) : null\n set: (map_db, key, value) => key !== 'then' ? map_db.set_when(key, value) : null\n\nexport const as_whenmap_proxy = when_db =>\n new Proxy(when_db, _whenmap_pxy_)\n\nexport default as_whenmap_proxy\n"],"names":[],"mappings":"AAAA,MAAA,aAAA,EAAA;AACE,EAAA,GAAA,EAAA,CAAA,MAAA,EAAA,GAAA,KAAA,GAAA,KAA8B,MAAM,GAAA,MAAA,CAAA,GAAA,CAAA,GAAA,CAAA,GAAA;AACpC,EAAA,GAAA,EAAA,CAAA,MAAA,EAAA,GAAA,KAAA,GAAA,KAA8B,MAAM,GAAA,MAAA,CAAA,IAAA,CAAA,GAAA,CAAA,GAAA;AACpC,EAAA,GAAA,EAAA,CAAA,MAAA,EAAA,GAAA,EAAA,KAAA,KAAA,GAAA,KAAqC,MAAM,GAAA,MAAA,CAAA,QAAA,CAAA,GAAA,EAAA,KAAA,CAAA,GAAA,IAAA;;AAE7C,MAAA,gBAAA,GAAA,OAAA;AACC,CAAA,IAAA,KAAA,CAAA,OAAA,EAAA,aAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={has:(e,n)=>"then"!==n?e.has(n):null,get:(e,n)=>"then"!==n?e.when(n):null,set:(e,n,t)=>"then"!==n?e.set_when(n,t):null},n=n=>new Proxy(n,e);export{e as _whenmap_pxy_,n as as_whenmap_proxy,n as default};
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "whenmap",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "BSD-2-Clause",
|
|
6
|
+
"author": "Shane Holloway <shane.holloway@ieee.org>",
|
|
7
|
+
"homepage": "https://github.com/shanewholloway/js-whenmap#readme",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/shanewholloway/js-whenmap/issues"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+ssh://git@github.com/shanewholloway/js-whenmap.git"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"esm/"
|
|
17
|
+
],
|
|
18
|
+
"type": "module",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": "./esm/index.js",
|
|
21
|
+
"./esm": "./esm"
|
|
22
|
+
},
|
|
23
|
+
"imports": {
|
|
24
|
+
"#test_bdd": {
|
|
25
|
+
"node": "./test/node_bdd.js",
|
|
26
|
+
"web": "./test/web_bdd_mocha.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
31
|
+
"chai": "^5.2.0",
|
|
32
|
+
"rollup": "^4.36.0",
|
|
33
|
+
"rollup-plugin-jsy": "^1.9.2"
|
|
34
|
+
},
|
|
35
|
+
"optionalDependencies": {
|
|
36
|
+
"vite": "^6.2.2"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"clean": "rm ./esm/* || true",
|
|
40
|
+
"build": "rollup --config",
|
|
41
|
+
"watch": "rollup --config --watch",
|
|
42
|
+
"pretest": "test -f esm/hashbelt.js || npm -s run build",
|
|
43
|
+
"vite": "vite",
|
|
44
|
+
"serve": "vite",
|
|
45
|
+
"test": "npm -s run test:one",
|
|
46
|
+
"test:one": "cd test && node --test",
|
|
47
|
+
"test:watch": "cd test && node --test --watch",
|
|
48
|
+
"test:only": "cd test && node --test --test-only --watch",
|
|
49
|
+
"prepublishOnly": "npm run clean && npm run test"
|
|
50
|
+
}
|
|
51
|
+
}
|