@aegisjsproject/callback-registry 1.0.3 → 2.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/CHANGELOG.md +13 -0
- package/callbackRegistry.cjs +56 -32
- package/callbackRegistry.mjs +1 -1
- package/callbackRegistry.mjs.map +1 -1
- package/callbacks.cjs +55 -30
- package/callbacks.js +42 -20
- package/events.js +12 -11
- package/package.json +11 -6
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [v2.0.1] - 2026-03-06
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Use `Signal.State` for attributes & `Signal.Computed` to derive the selectors
|
|
14
|
+
|
|
15
|
+
## [v2.0.0] - 2026-03-01
|
|
16
|
+
|
|
17
|
+
## Added
|
|
18
|
+
- Add support for `DisposableStack` and `AsyncDisposableStack` disposal of keys
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- Creating and registering callbacks now returns an object with `[Symbol.dispose]` extending `String`
|
|
22
|
+
|
|
10
23
|
## [v1.0.3] - 2025-09-29
|
|
11
24
|
|
|
12
25
|
### Added
|
package/callbackRegistry.cjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var signals = require('@shgysk8zer0/signals');
|
|
4
|
+
|
|
3
5
|
const PREFIX = 'data-aegis-event-';
|
|
4
6
|
const EVENT_PREFIX = PREFIX + 'on-';
|
|
5
7
|
const EVENT_PREFIX_LENGTH = EVENT_PREFIX.length;
|
|
@@ -112,7 +114,7 @@ const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart';
|
|
|
112
114
|
const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend';
|
|
113
115
|
const onError = EVENT_PREFIX + 'error';
|
|
114
116
|
|
|
115
|
-
const eventAttrs = [
|
|
117
|
+
const eventAttrs = new signals.Signal.State([
|
|
116
118
|
onAbort,
|
|
117
119
|
onBlur,
|
|
118
120
|
onFocus,
|
|
@@ -209,15 +211,15 @@ const eventAttrs = [
|
|
|
209
211
|
onWebkitanimationstart,
|
|
210
212
|
onWebkittransitionend,
|
|
211
213
|
onError,
|
|
212
|
-
];
|
|
214
|
+
]);
|
|
213
215
|
|
|
214
|
-
|
|
216
|
+
const selector = new signals.Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(', '));
|
|
215
217
|
|
|
216
218
|
const attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;
|
|
217
219
|
|
|
218
220
|
const eventToProp = event => EVENT_PREFIX + event;
|
|
219
221
|
|
|
220
|
-
const hasEventAttribute = event => eventAttrs.includes(EVENT_PREFIX + event);
|
|
222
|
+
const hasEventAttribute = event => eventAttrs.get().includes(EVENT_PREFIX + event);
|
|
221
223
|
|
|
222
224
|
const isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX);
|
|
223
225
|
|
|
@@ -400,13 +402,13 @@ function registerEventAttribute(attr, {
|
|
|
400
402
|
signal,
|
|
401
403
|
} = {}) {
|
|
402
404
|
const fullAttr = EVENT_PREFIX + attr.toLowerCase();
|
|
405
|
+
const attrs = eventAttrs.get();
|
|
403
406
|
|
|
404
|
-
if (!
|
|
407
|
+
if (! attrs.includes(fullAttr)) {
|
|
405
408
|
const sel = `[${CSS.escape(fullAttr)}]`;
|
|
406
409
|
const prop = attrToProp(fullAttr);
|
|
407
|
-
eventAttrs.
|
|
410
|
+
eventAttrs.set([...attrs, fullAttr]);
|
|
408
411
|
EVENTS[prop] = fullAttr;
|
|
409
|
-
selector += `, ${sel}`;
|
|
410
412
|
|
|
411
413
|
if (addListeners) {
|
|
412
414
|
requestAnimationFrame(() => {
|
|
@@ -556,9 +558,9 @@ function unregisterSignal(signal) {
|
|
|
556
558
|
* @returns {Element|Document} Returns the passed target node
|
|
557
559
|
*/
|
|
558
560
|
function attachListeners(target, { signal } = {}) {
|
|
559
|
-
const nodes = target instanceof Element && target.matches(selector)
|
|
560
|
-
? [target, ...target.querySelectorAll(selector)]
|
|
561
|
-
: target.querySelectorAll(selector);
|
|
561
|
+
const nodes = target instanceof Element && target.matches(selector.get())
|
|
562
|
+
? [target, ...target.querySelectorAll(selector.get())]
|
|
563
|
+
: target.querySelectorAll(selector.get());
|
|
562
564
|
|
|
563
565
|
nodes.forEach(el => _addListeners(el, { signal }));
|
|
564
566
|
|
|
@@ -578,7 +580,7 @@ function observeEvents(root = document) {
|
|
|
578
580
|
childList:true,
|
|
579
581
|
attributes: true,
|
|
580
582
|
attributeOldValue: true,
|
|
581
|
-
attributeFilter: eventAttrs,
|
|
583
|
+
attributeFilter: eventAttrs.get(),
|
|
582
584
|
});
|
|
583
585
|
}
|
|
584
586
|
|
|
@@ -653,6 +655,9 @@ const FUNCS = {
|
|
|
653
655
|
},
|
|
654
656
|
};
|
|
655
657
|
|
|
658
|
+
/**
|
|
659
|
+
* @type {Map<string, function>}
|
|
660
|
+
*/
|
|
656
661
|
const registry = new Map([
|
|
657
662
|
[FUNCS.debug.log, console.log],
|
|
658
663
|
[FUNCS.debug.warn, console.warn],
|
|
@@ -765,6 +770,12 @@ const registry = new Map([
|
|
|
765
770
|
[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],
|
|
766
771
|
]);
|
|
767
772
|
|
|
773
|
+
class CallbackRegistryKey extends String {
|
|
774
|
+
[Symbol.dispose]() {
|
|
775
|
+
registry.delete(this.toString());
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
768
779
|
/**
|
|
769
780
|
* Check if callback registry is open
|
|
770
781
|
*
|
|
@@ -789,26 +800,26 @@ const listCallbacks = () => Object.freeze(Array.from(registry.keys()));
|
|
|
789
800
|
/**
|
|
790
801
|
* Check if a callback is registered
|
|
791
802
|
*
|
|
792
|
-
* @param {string} name The name/key to check for in callback registry
|
|
803
|
+
* @param {CallbackRegistryKey|string} name The name/key to check for in callback registry
|
|
793
804
|
* @returns {boolean} Whether or not a callback is registered
|
|
794
805
|
*/
|
|
795
|
-
const hasCallback = name => registry.has(name);
|
|
806
|
+
const hasCallback = name => registry.has(name?.toString());
|
|
796
807
|
|
|
797
808
|
/**
|
|
798
809
|
* Get a callback from the registry by name/key
|
|
799
810
|
*
|
|
800
|
-
* @param {string} name The name/key of the callback to get
|
|
811
|
+
* @param {CallbackRegistryKey|string} name The name/key of the callback to get
|
|
801
812
|
* @returns {Function|undefined} The corresponding function registered under that name/key
|
|
802
813
|
*/
|
|
803
|
-
const getCallback = name => registry.get(name);
|
|
814
|
+
const getCallback = name => registry.get(name?.toString());
|
|
804
815
|
|
|
805
816
|
/**
|
|
806
817
|
* Remove a callback from the registry
|
|
807
818
|
*
|
|
808
|
-
* @param {string} name The name/key of the callback to get
|
|
819
|
+
* @param {CallbackRegistryKey|string} name The name/key of the callback to get
|
|
809
820
|
* @returns {boolean} Whether or not the callback was successfully unregisterd
|
|
810
821
|
*/
|
|
811
|
-
const unregisterCallback = name => _isRegistrationOpen && registry.delete(name);
|
|
822
|
+
const unregisterCallback = name => _isRegistrationOpen && registry.delete(name?.toString());
|
|
812
823
|
|
|
813
824
|
/**
|
|
814
825
|
* Remove all callbacks from the registry
|
|
@@ -821,21 +832,23 @@ const clearRegistry = () => registry.clear();
|
|
|
821
832
|
* Create a registered callback with a randomly generated name
|
|
822
833
|
*
|
|
823
834
|
* @param {Function} callback Callback function to register
|
|
835
|
+
* @param {object} [config]
|
|
836
|
+
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
|
|
824
837
|
* @returns {string} The automatically generated key/name of the registered callback
|
|
825
838
|
*/
|
|
826
|
-
const createCallback = (callback) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback);
|
|
839
|
+
const createCallback = (callback, { stack } = {}) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback, { stack });
|
|
827
840
|
|
|
828
841
|
/**
|
|
829
842
|
* Call a callback fromt the registry by name/key
|
|
830
843
|
*
|
|
831
|
-
* @param {string} name The name/key of the registered function
|
|
844
|
+
* @param {CallbackRegistryKey|string} name The name/key of the registered function
|
|
832
845
|
* @param {...any} args Any arguments to pass along to the function
|
|
833
846
|
* @returns {any} Whatever the return value of the function is
|
|
834
847
|
* @throws {Error} Throws if callback is not found or any error resulting from calling the function
|
|
835
848
|
*/
|
|
836
849
|
function callCallback(name, ...args) {
|
|
837
|
-
if (registry.has(name)) {
|
|
838
|
-
return registry.get(name).apply(this || globalThis, args);
|
|
850
|
+
if (registry.has(name?.toString())) {
|
|
851
|
+
return registry.get(name?.toString()).apply(this || globalThis, args);
|
|
839
852
|
} else {
|
|
840
853
|
throw new Error(`No ${name} function registered.`);
|
|
841
854
|
}
|
|
@@ -844,22 +857,33 @@ function callCallback(name, ...args) {
|
|
|
844
857
|
/**
|
|
845
858
|
* Register a named callback in registry
|
|
846
859
|
*
|
|
847
|
-
* @param {string} name The name/key to register the callback under
|
|
860
|
+
* @param {CallbackRegistryKey|string} name The name/key to register the callback under
|
|
848
861
|
* @param {Function} callback The callback value to register
|
|
862
|
+
* @param {object} config
|
|
863
|
+
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
|
|
849
864
|
* @returns {string} The registered name/key
|
|
850
865
|
*/
|
|
851
|
-
function registerCallback(name, callback) {
|
|
852
|
-
if (typeof name
|
|
853
|
-
|
|
866
|
+
function registerCallback(name, callback, { stack } = {}) {
|
|
867
|
+
if (typeof name === 'string') {
|
|
868
|
+
return registerCallback(new CallbackRegistryKey(name), callback, { stack });
|
|
869
|
+
}else if (! (name instanceof CallbackRegistryKey)) {
|
|
870
|
+
throw new TypeError('Callback name must be a disposable string/CallbackRegistryKey.');
|
|
854
871
|
} if (! (callback instanceof Function)) {
|
|
855
872
|
throw new TypeError('Callback must be a function.');
|
|
856
873
|
} else if (! _isRegistrationOpen) {
|
|
857
874
|
throw new TypeError('Cannot register new callbacks because registry is closed.');
|
|
858
|
-
} else if (registry.has(name)) {
|
|
875
|
+
} else if (registry.has(name?.toString())) {
|
|
859
876
|
throw new Error(`Handler "${name}" is already registered.`);
|
|
877
|
+
} else if (stack instanceof DisposableStack || stack instanceof AsyncDisposableStack) {
|
|
878
|
+
const key = stack.use(new CallbackRegistryKey(name));
|
|
879
|
+
registry.set(key.toString(), callback);
|
|
880
|
+
|
|
881
|
+
return key;
|
|
860
882
|
} else {
|
|
861
|
-
|
|
862
|
-
|
|
883
|
+
const key = new CallbackRegistryKey(name);
|
|
884
|
+
registry.set(key.toString(), callback);
|
|
885
|
+
|
|
886
|
+
return key;
|
|
863
887
|
}
|
|
864
888
|
}
|
|
865
889
|
|
|
@@ -883,10 +907,10 @@ function getHost(target) {
|
|
|
883
907
|
}
|
|
884
908
|
}
|
|
885
909
|
|
|
886
|
-
function on(event, callback, { capture: capture$1 = false, passive: passive$1 = false, once: once$1 = false, signal: signal$1 } = {}) {
|
|
910
|
+
function on(event, callback, { capture: capture$1 = false, passive: passive$1 = false, once: once$1 = false, signal: signal$1, stack } = {}) {
|
|
887
911
|
if (callback instanceof Function) {
|
|
888
|
-
return on(event, createCallback(callback), { capture: capture$1, passive: passive$1, once: once$1, signal: signal$1 });
|
|
889
|
-
} else if (typeof callback
|
|
912
|
+
return on(event, createCallback(callback, { stack }), { capture: capture$1, passive: passive$1, once: once$1, signal: signal$1 });
|
|
913
|
+
} else if (! (callback instanceof String || typeof callback === 'string') || callback.length === 0) {
|
|
890
914
|
throw new TypeError('Callback must be a function or a registered callback string.');
|
|
891
915
|
} else if (typeof event !== 'string' || event.length === 0) {
|
|
892
916
|
throw new TypeError('Event must be a non-empty string.');
|
|
@@ -919,6 +943,7 @@ function on(event, callback, { capture: capture$1 = false, passive: passive$1 =
|
|
|
919
943
|
}
|
|
920
944
|
}
|
|
921
945
|
|
|
946
|
+
exports.CallbackRegistryKey = CallbackRegistryKey;
|
|
922
947
|
exports.EVENTS = EVENTS;
|
|
923
948
|
exports.FUNCS = FUNCS;
|
|
924
949
|
exports.abortController = abortController;
|
|
@@ -931,7 +956,6 @@ exports.controller = controller;
|
|
|
931
956
|
exports.createCallback = createCallback;
|
|
932
957
|
exports.createController = createController;
|
|
933
958
|
exports.disconnectEventsObserver = disconnectEventsObserver;
|
|
934
|
-
exports.eventAttrs = eventAttrs;
|
|
935
959
|
exports.eventToProp = eventToProp;
|
|
936
960
|
exports.getCallback = getCallback;
|
|
937
961
|
exports.getController = getController;
|
package/callbackRegistry.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e="data-aegis-event-",t=e+"on-",n="aegisEventOn",o=Symbol("aegis:signal"),r=Symbol("aegis:controller"),a=new Map,i=new Map,s=e+"once",l=e+"passive",c=e+"capture",u=e+"signal",g=e+"controller",d=t+"abort",p=t+"blur",b=t+"focus",m=t+"cancel",h=t+"auxclick",f=t+"beforeinput",v=t+"beforetoggle",y=t+"canplay",w=t+"canplaythrough",T=t+"change",E=t+"click",S=t+"close",k=t+"command",A=t+"contextmenu",P=t+"copy",C=t+"cuechange",F=t+"cut",M=t+"dblclick",L=t+"drag",D=t+"dragend",O=t+"dragenter",q=t+"dragexit",I=t+"dragleave",x=t+"dragover",N=t+"dragstart",U=t+"drop",R=t+"durationchange",j=t+"emptied",$=t+"ended",z=t+"formdata",W=t+"input",H=t+"invalid",V=t+"keydown",B=t+"keypress",K=t+"keyup",G=t+"load",_=t+"loadeddata",J=t+"loadedmetadata",Q=t+"loadstart",X=t+"mousedown",Y=t+"mouseenter",Z=t+"mouseleave",ee=t+"mousemove",te=t+"mouseout",ne=t+"mouseover",oe=t+"mouseup",re=t+"wheel",ae=t+"paste",ie=t+"pause",se=t+"play",le=t+"playing",ce=t+"progress",ue=t+"ratechange",ge=t+"reset",de=t+"resize",pe=t+"scroll",be=t+"scrollend",me=t+"securitypolicyviolation",he=t+"seeked",fe=t+"seeking",ve=t+"select",ye=t+"slotchange",we=t+"stalled",Te=t+"submit",Ee=t+"suspend",Se=t+"timeupdate",ke=t+"volumechange",Ae=t+"waiting",Pe=t+"selectstart",Ce=t+"selectionchange",Fe=t+"toggle",Me=t+"pointercancel",Le=t+"pointerdown",De=t+"pointerup",Oe=t+"pointermove",qe=t+"pointerout",Ie=t+"pointerover",xe=t+"pointerenter",Ne=t+"pointerleave",Ue=t+"gotpointercapture",Re=t+"lostpointercapture",je=t+"mozfullscreenchange",$e=t+"mozfullscreenerror",ze=t+"animationcancel",We=t+"animationend",He=t+"animationiteration",Ve=t+"animationstart",Be=t+"transitioncancel",Ke=t+"transitionend",Ge=t+"transitionrun",_e=t+"transitionstart",Je=t+"webkitanimationend",Qe=t+"webkitanimationiteration",Xe=t+"webkitanimationstart",Ye=t+"webkittransitionend",Ze=t+"error",et=[d,p,b,m,h,f,v,y,w,T,E,S,k,A,P,C,F,M,L,D,O,q,I,x,N,U,R,j,$,z,W,H,V,B,K,G,_,J,Q,X,Y,Z,ee,te,ne,oe,re,ae,ie,se,le,ce,ue,ge,de,pe,be,me,he,fe,ve,ye,we,Te,Ee,Se,ke,Ae,Pe,Ce,Fe,Me,Le,De,Oe,qe,Ie,xe,Ne,Ue,Re,je,$e,ze,We,He,Ve,Be,Ke,Ge,_e,Je,Qe,Xe,Ye,Ze];let tt=et.map((e=>`[${CSS.escape(e)}]`)).join(", ");const nt=e=>t+e,ot=e=>et.includes(t+e),rt=([e])=>e.startsWith(n);function at(e,{signal:t,attrFilter:n=st}={}){const o=e.dataset;for(const[r,a]of Object.entries(o).filter(rt))try{const i="on"+r.substring(12);n.hasOwnProperty(i)&&Dt(a)&&e.addEventListener(i.substring(2).toLowerCase(),Ot(a),{passive:o.hasOwnProperty("aegisEventPassive"),capture:o.hasOwnProperty("aegisEventCapture"),once:o.hasOwnProperty("aegisEventOnce"),signal:o.hasOwnProperty("aegisEventSignal")?mt(o.aegisEventSignal):t})}catch(e){reportError(e)}}const it=new MutationObserver((e=>{e.forEach((e=>{switch(e.type){case"childList":[...e.addedNodes].filter((e=>e.nodeType===Node.ELEMENT_NODE)).forEach((e=>ft(e)));break;case"attributes":"string"==typeof e.oldValue&&Dt(e.oldValue)&&e.target.removeEventListener(e.attributeName.substring(20),Ot(e.oldValue),{once:e.target.hasAttribute(s),capture:e.target.hasAttribute(c),passive:e.target.hasAttribute(l)}),e.target.hasAttribute(e.attributeName)&&Dt(e.target.getAttribute(e.attributeName))&&e.target.addEventListener(e.attributeName.substring(20),Ot(e.target.getAttribute(e.attributeName)),{once:e.target.hasAttribute(s),capture:e.target.hasAttribute(c),passive:e.target.hasAttribute(l),signal:e.target.hasAttribute(u)?mt(e.target.getAttribute(u)):void 0})}}))})),st={onAbort:d,onBlur:p,onFocus:b,onCancel:m,onAuxclick:h,onBeforeinput:f,onBeforetoggle:v,onCanplay:y,onCanplaythrough:w,onChange:T,onClick:E,onClose:S,onCommand:k,onContextmenu:A,onCopy:P,onCuechange:C,onCut:F,onDblclick:M,onDrag:L,onDragend:D,onDragenter:O,onDragexit:q,onDragleave:I,onDragover:x,onDragstart:N,onDrop:U,onDurationchange:R,onEmptied:j,onEnded:$,onFormdata:z,onInput:W,onInvalid:H,onKeydown:V,onKeypress:B,onKeyup:K,onLoad:G,onLoadeddata:_,onLoadedmetadata:J,onLoadstart:Q,onMousedown:X,onMouseenter:Y,onMouseleave:Z,onMousemove:ee,onMouseout:te,onMouseover:ne,onMouseup:oe,onWheel:re,onPaste:ae,onPause:ie,onPlay:se,onPlaying:le,onProgress:ce,onRatechange:ue,onReset:ge,onResize:de,onScroll:pe,onScrollend:be,onSecuritypolicyviolation:me,onSeeked:he,onSeeking:fe,onSelect:ve,onSlotchange:ye,onStalled:we,onSubmit:Te,onSuspend:Ee,onTimeupdate:Se,onVolumechange:ke,onWaiting:Ae,onSelectstart:Pe,onSelectionchange:Ce,onToggle:Fe,onPointercancel:Me,onPointerdown:Le,onPointerup:De,onPointermove:Oe,onPointerout:qe,onPointerover:Ie,onPointerenter:xe,onPointerleave:Ne,onGotpointercapture:Ue,onLostpointercapture:Re,onMozfullscreenchange:je,onMozfullscreenerror:$e,onAnimationcancel:ze,onAnimationend:We,onAnimationiteration:He,onAnimationstart:Ve,onTransitioncancel:Be,onTransitionend:Ke,onTransitionrun:Ge,onTransitionstart:_e,onWebkitanimationend:Je,onWebkitanimationiteration:Qe,onWebkitanimationstart:Xe,onWebkittransitionend:Ye,onError:Ze,once:s,passive:l,capture:c};function lt(e,{addListeners:n=!1,base:o=document.body,signal:r}={}){const a=t+e.toLowerCase();if(!et.includes(a)){const e=`[${CSS.escape(a)}]`,t=(e=>`on${e[20].toUpperCase()}${e.substring(21)}`)(a);et.push(a),st[t]=a,tt+=`, ${e}`,n&&requestAnimationFrame((()=>{const n={attrFilter:{[t]:e},signal:r};[o,...o.querySelectorAll(e)].forEach((e=>at(e,n)))}))}return a}function ct(e){if(e instanceof AbortController){if(e.signal.aborted)throw e.signal.reason;if("string"==typeof e.signal[r])return e.signal[r];{const t="aegis:event:controller:"+crypto.randomUUID();return Object.defineProperty(e.signal,r,{value:t,writable:!1,enumerable:!1}),i.set(t,e),e.signal.addEventListener("abort",ut,{once:!0}),t}}throw new TypeError("Controller is not an `AbortSignal.")}function ut(e){return e instanceof AbortController?i.delete(e.signal[r]):e instanceof AbortSignal?i.delete(e[r]):i.delete(e)}function gt({signal:e}={}){const t=new AbortController;return e instanceof AbortSignal&&e.addEventListener("abort",(({target:e})=>t.abort(e.reason)),{signal:t.signal}),ct(t)}const dt=e=>i.get(e);function pt(e,t){const n=dt(e);return n instanceof AbortController&&("string"==typeof t?(n.abort(new Error(t)),!0):(n.abort(t),!0))}function bt(e){if(e instanceof AbortSignal){if("string"==typeof e[o])return e[o];{const t="aegis:event:signal:"+crypto.randomUUID();return Object.defineProperty(e,o,{value:t,writable:!1,enumerable:!1}),a.set(t,e),e.addEventListener("abort",(({target:e})=>ht(e[o])),{once:!0}),t}}throw new TypeError("Signal must be an `AbortSignal`.")}const mt=e=>a.get(e);function ht(e){if(e instanceof AbortSignal)return a.delete(e[o]);if("string"==typeof e)return a.delete(e);throw new TypeError("Signal must be an `AbortSignal` or registered key/attribute.")}function ft(e,{signal:t}={}){return(e instanceof Element&&e.matches(tt)?[e,...e.querySelectorAll(tt)]:e.querySelectorAll(tt)).forEach((e=>at(e,{signal:t}))),e}function vt(e=document){ft(e),it.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:et})}const yt=()=>it.disconnect();function wt(e,{capture:t,once:n,passive:o,signal:r}={}){if(!(e instanceof Function))throw new TypeError("Callback is not a function.");globalThis.addEventListener("error",e,{capture:t,once:n,passive:o,signal:r})}let Tt=!0;const Et=(e,t=document)=>t.querySelectorAll(e),St=(e,t=document)=>t.querySelector(e),kt={attr:"data-request-fullscreen-selector",data:"requestFullscreenSelector"},At={attr:"data-toggle-fullscreen-selector",data:"toggleFullscreenSelector"},Pt={debug:{log:"aegis:debug:log",info:"aegis:debug:info",warn:"aegis:debug:warn",error:"aegis:debug:error"},navigate:{back:"aegis:navigate:back",forward:"aegis:navigate:forward",reload:"aegis:navigate:reload",close:"aegis:navigate:close",link:"aegis:navigate:go",popup:"aegis:navigate:popup"},ui:{command:"aegis:ui:command",print:"aegis:ui:print",remove:"aegis:ui:remove",hide:"aegis:ui:hide",unhide:"aegis:ui:unhide",showModal:"aegis:ui:showModal",closeModal:"aegis:ui:closeModal",showPopover:"aegis:ui:showPopover",hidePopover:"aegis:ui:hidePopover",togglePopover:"aegis:ui:togglePopover",enable:"aegis:ui:enable",disable:"aegis:ui:disable",scrollTo:"aegis:ui:scrollTo",prevent:"aegis:ui:prevent",revokeObjectURL:"aegis:ui:revokeObjectURL",cancelAnimationFrame:"aegis:ui:cancelAnimationFrame",requestFullscreen:"aegis:ui:requestFullscreen",toggleFullscreen:"aegis:ui:toggleFullsceen",exitFullsceen:"aegis:ui:exitFullscreen",open:"aegis:ui:open",close:"aegis:ui:close",abortController:"aegis:ui:controller:abort"}},Ct=new Map([[Pt.debug.log,console.log],[Pt.debug.warn,console.warn],[Pt.debug.error,console.error],[Pt.debug.info,console.info],[Pt.navigate.back,()=>history.back()],[Pt.navigate.forward,()=>history.forward()],[Pt.navigate.reload,()=>history.go(0)],[Pt.navigate.close,()=>globalThis.close()],[Pt.navigate.link,e=>{e.isTrusted&&(e.preventDefault(),location.href=e.currentTarget.dataset.url)}],[Pt.navigate.popup,e=>{e.isTrusted&&(e.preventDefault(),globalThis.open(e.currentTarget.dataset.url))}],[Pt.ui.hide,({currentTarget:e})=>{Et(e.dataset.hideSelector).forEach((e=>e.hidden=!0))}],[Pt.ui.unhide,({currentTarget:e})=>{Et(e.dataset.unhideSelector).forEach((e=>e.hidden=!1))}],[Pt.ui.disable,({currentTarget:e})=>{Et(e.dataset.disableSelector).forEach((e=>e.disabled=!0))}],[Pt.ui.enable,({currentTarget:e})=>{Et(e.dataset.enableSelector).forEach((e=>e.disabled=!1))}],[Pt.ui.remove,({currentTarget:e})=>{Et(e.dataset.removeSelector).forEach((e=>e.remove()))}],[Pt.ui.scrollTo,({currentTarget:e})=>{const t=St(e.dataset.scrollToSelector);t instanceof Element&&t.scrollIntoView({behavior:matchMedia("(prefers-reduced-motion: reduce)").matches?"instant":"smooth"})}],[Pt.ui.revokeObjectURL,({currentTarget:e})=>URL.revokeObjectURL(e.src)],[Pt.ui.cancelAnimationFrame,({currentTarget:e})=>cancelAnimationFrame(parseInt(e.dataset.animationFrame))],[Pt.ui.clearInterval,({currentTarget:e})=>clearInterval(parseInt(e.dataset.clearInterval))],[Pt.ui.clearTimeout,({currentTarget:e})=>clearTimeout(parseInt(e.dataset.timeout))],[Pt.ui.abortController,({currentTarget:e})=>pt(e.dataset.aegisEventController,e.dataset.aegisControllerReason)],[Pt.ui.open,({currentTarget:e})=>document.querySelector(e.dataset.openSelector).open=!0],[Pt.ui.close,({currentTarget:e})=>document.querySelector(e.dataset.closeSelector).open=!1],[Pt.ui.showModal,({currentTarget:e})=>{const t=St(e.dataset.showModalSelector);t instanceof HTMLDialogElement&&t.showModal()}],[Pt.ui.closeModal,({currentTarget:e})=>{const t=St(e.dataset.closeModalSelector);t instanceof HTMLDialogElement&&t.close()}],[Pt.ui.showPopover,({currentTarget:e})=>{const t=St(e.dataset.showPopoverSelector);t instanceof HTMLElement&&t.showPopover()}],[Pt.ui.hidePopover,({currentTarget:e})=>{const t=St(e.dataset.hidePopoverSelector);t instanceof HTMLElement&&t.hidePopover()}],[Pt.ui.togglePopover,({currentTarget:e})=>{const t=St(e.dataset.togglePopoverSelector);t instanceof HTMLElement&&t.togglePopover()}],[Pt.ui.print,()=>globalThis.print()],[Pt.ui.prevent,e=>e.preventDefault()],[Pt.ui.requestFullscreen,({currentTarget:e})=>{e.dataset.hasOwnProperty(kt.data)?document.getElementById(e.dataset[kt.data]).requestFullscreen():e.requestFullscreen()}],[Pt.ui.toggleFullscreen,({currentTarget:e})=>{const t=e.dataset.hasOwnProperty(At.data)?document.getElementById(e.dataset[At.data]):e;t.isSameNode(document.fullscreenElement)?document.exitFullscreen():t.requestFullscreen()}],[Pt.ui.exitFullsceen,()=>document.exitFullscreen()]]),Ft=()=>Tt,Mt=()=>Tt=!1,Lt=()=>Object.freeze(Array.from(Ct.keys())),Dt=e=>Ct.has(e),Ot=e=>Ct.get(e),qt=e=>Tt&&Ct.delete(e),It=()=>Ct.clear(),xt=e=>Ut("aegis:callback:"+crypto.randomUUID(),e);function Nt(e,...t){if(Ct.has(e))return Ct.get(e).apply(this||globalThis,t);throw new Error(`No ${e} function registered.`)}function Ut(e,t){if("string"!=typeof e||0===e.length)throw new TypeError("Callback name must be a string.");if(t instanceof Function){if(Tt){if(Ct.has(e))throw new Error(`Handler "${e}" is already registered.`);return Ct.set(e,t),e}throw new TypeError("Cannot register new callbacks because registry is closed.")}throw new TypeError("Callback must be a function.")}function Rt(e){return e instanceof Event?Rt(e.currentTarget):e instanceof Document?e:e instanceof Element?Rt(e.getRootNode()):e instanceof ShadowRoot?e.host:null}function jt(e,t,{capture:n=!1,passive:o=!1,once:r=!1,signal:a}={}){if(t instanceof Function)return jt(e,xt(t),{capture:n,passive:o,once:r,signal:a});if("string"!=typeof t||0===t.length)throw new TypeError("Callback must be a function or a registered callback string.");if("string"!=typeof e||0===e.length)throw new TypeError("Event must be a non-empty string.");{ot(e)||lt(e);const i=[[nt(e),t]];return n&&i.push([c,""]),o&&i.push([l,""]),r&&i.push([s,""]),a instanceof AbortSignal?i.push([u,bt(a)]):"string"==typeof a&&i.push([u,a]),i.map((([e,t])=>`${e}="${t}"`)).join(" ")}}export{st as EVENTS,Pt as FUNCS,pt as abortController,ft as attachListeners,Nt as callCallback,c as capture,It as clearRegistry,Mt as closeRegistration,g as controller,xt as createCallback,gt as createController,yt as disconnectEventsObserver,et as eventAttrs,nt as eventToProp,Ot as getCallback,dt as getController,Rt as getHost,mt as getSignal,Dt as hasCallback,ot as hasEventAttribute,Ft as isRegistrationOpen,Lt as listCallbacks,vt as observeEvents,jt as on,d as onAbort,ze as onAnimationcancel,We as onAnimationend,He as onAnimationiteration,Ve as onAnimationstart,h as onAuxclick,f as onBeforeinput,v as onBeforetoggle,p as onBlur,m as onCancel,y as onCanplay,w as onCanplaythrough,T as onChange,E as onClick,S as onClose,k as onCommand,A as onContextmenu,P as onCopy,C as onCuechange,F as onCut,M as onDblclick,L as onDrag,D as onDragend,O as onDragenter,q as onDragexit,I as onDragleave,x as onDragover,N as onDragstart,U as onDrop,R as onDurationchange,j as onEmptied,$ as onEnded,Ze as onError,b as onFocus,z as onFormdata,Ue as onGotpointercapture,W as onInput,H as onInvalid,V as onKeydown,B as onKeypress,K as onKeyup,G as onLoad,_ as onLoadeddata,J as onLoadedmetadata,Q as onLoadstart,Re as onLostpointercapture,X as onMousedown,Y as onMouseenter,Z as onMouseleave,ee as onMousemove,te as onMouseout,ne as onMouseover,oe as onMouseup,je as onMozfullscreenchange,$e as onMozfullscreenerror,ae as onPaste,ie as onPause,se as onPlay,le as onPlaying,Me as onPointercancel,Le as onPointerdown,xe as onPointerenter,Ne as onPointerleave,Oe as onPointermove,qe as onPointerout,Ie as onPointerover,De as onPointerup,ce as onProgress,ue as onRatechange,ge as onReset,de as onResize,pe as onScroll,be as onScrollend,me as onSecuritypolicyviolation,he as onSeeked,fe as onSeeking,ve as onSelect,Ce as onSelectionchange,Pe as onSelectstart,ye as onSlotchange,we as onStalled,Te as onSubmit,Ee as onSuspend,Se as onTimeupdate,Fe as onToggle,Be as onTransitioncancel,Ke as onTransitionend,Ge as onTransitionrun,_e as onTransitionstart,ke as onVolumechange,Ae as onWaiting,Je as onWebkitanimationend,Qe as onWebkitanimationiteration,Xe as onWebkitanimationstart,Ye as onWebkittransitionend,re as onWheel,s as once,l as passive,Ut as registerCallback,ct as registerController,lt as registerEventAttribute,bt as registerSignal,kt as requestFullscreen,wt as setGlobalErrorHandler,u as signal,At as toggleFullsceen,qt as unregisterCallback,ut as unregisterController,ht as unregisterSignal};
|
|
1
|
+
import{Signal as e}from"@shgysk8zer0/signals";const t="data-aegis-event-",n=t+"on-",o="aegisEventOn",r=Symbol("aegis:signal"),a=Symbol("aegis:controller"),i=new Map,s=new Map,l=t+"once",c=t+"passive",u=t+"capture",g=t+"signal",d=t+"controller",p=n+"abort",b=n+"blur",m=n+"focus",f=n+"cancel",h=n+"auxclick",v=n+"beforeinput",y=n+"beforetoggle",w=n+"canplay",S=n+"canplaythrough",T=n+"change",E=n+"click",k=n+"close",A=n+"command",P=n+"contextmenu",C=n+"copy",F=n+"cuechange",M=n+"cut",L=n+"dblclick",D=n+"drag",O=n+"dragend",q=n+"dragenter",I=n+"dragexit",x=n+"dragleave",N=n+"dragover",R=n+"dragstart",U=n+"drop",j=n+"durationchange",z=n+"emptied",$=n+"ended",W=n+"formdata",H=n+"input",V=n+"invalid",B=n+"keydown",K=n+"keypress",G=n+"keyup",_=n+"load",J=n+"loadeddata",Q=n+"loadedmetadata",X=n+"loadstart",Y=n+"mousedown",Z=n+"mouseenter",ee=n+"mouseleave",te=n+"mousemove",ne=n+"mouseout",oe=n+"mouseover",re=n+"mouseup",ae=n+"wheel",ie=n+"paste",se=n+"pause",le=n+"play",ce=n+"playing",ue=n+"progress",ge=n+"ratechange",de=n+"reset",pe=n+"resize",be=n+"scroll",me=n+"scrollend",fe=n+"securitypolicyviolation",he=n+"seeked",ve=n+"seeking",ye=n+"select",we=n+"slotchange",Se=n+"stalled",Te=n+"submit",Ee=n+"suspend",ke=n+"timeupdate",Ae=n+"volumechange",Pe=n+"waiting",Ce=n+"selectstart",Fe=n+"selectionchange",Me=n+"toggle",Le=n+"pointercancel",De=n+"pointerdown",Oe=n+"pointerup",qe=n+"pointermove",Ie=n+"pointerout",xe=n+"pointerover",Ne=n+"pointerenter",Re=n+"pointerleave",Ue=n+"gotpointercapture",je=n+"lostpointercapture",ze=n+"mozfullscreenchange",$e=n+"mozfullscreenerror",We=n+"animationcancel",He=n+"animationend",Ve=n+"animationiteration",Be=n+"animationstart",Ke=n+"transitioncancel",Ge=n+"transitionend",_e=n+"transitionrun",Je=n+"transitionstart",Qe=n+"webkitanimationend",Xe=n+"webkitanimationiteration",Ye=n+"webkitanimationstart",Ze=n+"webkittransitionend",et=n+"error",tt=new e.State([p,b,m,f,h,v,y,w,S,T,E,k,A,P,C,F,M,L,D,O,q,I,x,N,R,U,j,z,$,W,H,V,B,K,G,_,J,Q,X,Y,Z,ee,te,ne,oe,re,ae,ie,se,le,ce,ue,ge,de,pe,be,me,fe,he,ve,ye,we,Se,Te,Ee,ke,Ae,Pe,Ce,Fe,Me,Le,De,Oe,qe,Ie,xe,Ne,Re,Ue,je,ze,$e,We,He,Ve,Be,Ke,Ge,_e,Je,Qe,Xe,Ye,Ze,et]),nt=new e.Computed(()=>tt.get().map(e=>`[${CSS.escape(e)}]`).join(", ")),ot=e=>n+e,rt=e=>tt.get().includes(n+e),at=([e])=>e.startsWith(o);function it(e,{signal:t,attrFilter:n=lt}={}){const o=e.dataset;for(const[r,a]of Object.entries(o).filter(at))try{const i="on"+r.substring(12);n.hasOwnProperty(i)&&qt(a)&&e.addEventListener(i.substring(2).toLowerCase(),It(a),{passive:o.hasOwnProperty("aegisEventPassive"),capture:o.hasOwnProperty("aegisEventCapture"),once:o.hasOwnProperty("aegisEventOnce"),signal:o.hasOwnProperty("aegisEventSignal")?ft(o.aegisEventSignal):t})}catch(e){reportError(e)}}const st=new MutationObserver(e=>{e.forEach(e=>{switch(e.type){case"childList":[...e.addedNodes].filter(e=>e.nodeType===Node.ELEMENT_NODE).forEach(e=>vt(e));break;case"attributes":"string"==typeof e.oldValue&&qt(e.oldValue)&&e.target.removeEventListener(e.attributeName.substring(20),It(e.oldValue),{once:e.target.hasAttribute(l),capture:e.target.hasAttribute(u),passive:e.target.hasAttribute(c)}),e.target.hasAttribute(e.attributeName)&&qt(e.target.getAttribute(e.attributeName))&&e.target.addEventListener(e.attributeName.substring(20),It(e.target.getAttribute(e.attributeName)),{once:e.target.hasAttribute(l),capture:e.target.hasAttribute(u),passive:e.target.hasAttribute(c),signal:e.target.hasAttribute(g)?ft(e.target.getAttribute(g)):void 0})}})}),lt={onAbort:p,onBlur:b,onFocus:m,onCancel:f,onAuxclick:h,onBeforeinput:v,onBeforetoggle:y,onCanplay:w,onCanplaythrough:S,onChange:T,onClick:E,onClose:k,onCommand:A,onContextmenu:P,onCopy:C,onCuechange:F,onCut:M,onDblclick:L,onDrag:D,onDragend:O,onDragenter:q,onDragexit:I,onDragleave:x,onDragover:N,onDragstart:R,onDrop:U,onDurationchange:j,onEmptied:z,onEnded:$,onFormdata:W,onInput:H,onInvalid:V,onKeydown:B,onKeypress:K,onKeyup:G,onLoad:_,onLoadeddata:J,onLoadedmetadata:Q,onLoadstart:X,onMousedown:Y,onMouseenter:Z,onMouseleave:ee,onMousemove:te,onMouseout:ne,onMouseover:oe,onMouseup:re,onWheel:ae,onPaste:ie,onPause:se,onPlay:le,onPlaying:ce,onProgress:ue,onRatechange:ge,onReset:de,onResize:pe,onScroll:be,onScrollend:me,onSecuritypolicyviolation:fe,onSeeked:he,onSeeking:ve,onSelect:ye,onSlotchange:we,onStalled:Se,onSubmit:Te,onSuspend:Ee,onTimeupdate:ke,onVolumechange:Ae,onWaiting:Pe,onSelectstart:Ce,onSelectionchange:Fe,onToggle:Me,onPointercancel:Le,onPointerdown:De,onPointerup:Oe,onPointermove:qe,onPointerout:Ie,onPointerover:xe,onPointerenter:Ne,onPointerleave:Re,onGotpointercapture:Ue,onLostpointercapture:je,onMozfullscreenchange:ze,onMozfullscreenerror:$e,onAnimationcancel:We,onAnimationend:He,onAnimationiteration:Ve,onAnimationstart:Be,onTransitioncancel:Ke,onTransitionend:Ge,onTransitionrun:_e,onTransitionstart:Je,onWebkitanimationend:Qe,onWebkitanimationiteration:Xe,onWebkitanimationstart:Ye,onWebkittransitionend:Ze,onError:et,once:l,passive:c,capture:u};function ct(e,{addListeners:t=!1,base:o=document.body,signal:r}={}){const a=n+e.toLowerCase(),i=tt.get();if(!i.includes(a)){const e=`[${CSS.escape(a)}]`,n=(e=>`on${e[20].toUpperCase()}${e.substring(21)}`)(a);tt.set([...i,a]),lt[n]=a,t&&requestAnimationFrame(()=>{const t={attrFilter:{[n]:e},signal:r};[o,...o.querySelectorAll(e)].forEach(e=>it(e,t))})}return a}function ut(e){if(e instanceof AbortController){if(e.signal.aborted)throw e.signal.reason;if("string"==typeof e.signal[a])return e.signal[a];{const t="aegis:event:controller:"+crypto.randomUUID();return Object.defineProperty(e.signal,a,{value:t,writable:!1,enumerable:!1}),s.set(t,e),e.signal.addEventListener("abort",gt,{once:!0}),t}}throw new TypeError("Controller is not an `AbortSignal.")}function gt(e){return e instanceof AbortController?s.delete(e.signal[a]):e instanceof AbortSignal?s.delete(e[a]):s.delete(e)}function dt({signal:e}={}){const t=new AbortController;return e instanceof AbortSignal&&e.addEventListener("abort",({target:e})=>t.abort(e.reason),{signal:t.signal}),ut(t)}const pt=e=>s.get(e);function bt(e,t){const n=pt(e);return n instanceof AbortController&&("string"==typeof t?(n.abort(new Error(t)),!0):(n.abort(t),!0))}function mt(e){if(e instanceof AbortSignal){if("string"==typeof e[r])return e[r];{const t="aegis:event:signal:"+crypto.randomUUID();return Object.defineProperty(e,r,{value:t,writable:!1,enumerable:!1}),i.set(t,e),e.addEventListener("abort",({target:e})=>ht(e[r]),{once:!0}),t}}throw new TypeError("Signal must be an `AbortSignal`.")}const ft=e=>i.get(e);function ht(e){if(e instanceof AbortSignal)return i.delete(e[r]);if("string"==typeof e)return i.delete(e);throw new TypeError("Signal must be an `AbortSignal` or registered key/attribute.")}function vt(e,{signal:t}={}){return(e instanceof Element&&e.matches(nt.get())?[e,...e.querySelectorAll(nt.get())]:e.querySelectorAll(nt.get())).forEach(e=>it(e,{signal:t})),e}function yt(e=document){vt(e),st.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:tt.get()})}const wt=()=>st.disconnect();function St(e,{capture:t,once:n,passive:o,signal:r}={}){if(!(e instanceof Function))throw new TypeError("Callback is not a function.");globalThis.addEventListener("error",e,{capture:t,once:n,passive:o,signal:r})}let Tt=!0;const Et=(e,t=document)=>t.querySelectorAll(e),kt=(e,t=document)=>t.querySelector(e),At={attr:"data-request-fullscreen-selector",data:"requestFullscreenSelector"},Pt={attr:"data-toggle-fullscreen-selector",data:"toggleFullscreenSelector"},Ct={debug:{log:"aegis:debug:log",info:"aegis:debug:info",warn:"aegis:debug:warn",error:"aegis:debug:error"},navigate:{back:"aegis:navigate:back",forward:"aegis:navigate:forward",reload:"aegis:navigate:reload",close:"aegis:navigate:close",link:"aegis:navigate:go",popup:"aegis:navigate:popup"},ui:{command:"aegis:ui:command",print:"aegis:ui:print",remove:"aegis:ui:remove",hide:"aegis:ui:hide",unhide:"aegis:ui:unhide",showModal:"aegis:ui:showModal",closeModal:"aegis:ui:closeModal",showPopover:"aegis:ui:showPopover",hidePopover:"aegis:ui:hidePopover",togglePopover:"aegis:ui:togglePopover",enable:"aegis:ui:enable",disable:"aegis:ui:disable",scrollTo:"aegis:ui:scrollTo",prevent:"aegis:ui:prevent",revokeObjectURL:"aegis:ui:revokeObjectURL",cancelAnimationFrame:"aegis:ui:cancelAnimationFrame",requestFullscreen:"aegis:ui:requestFullscreen",toggleFullscreen:"aegis:ui:toggleFullsceen",exitFullsceen:"aegis:ui:exitFullscreen",open:"aegis:ui:open",close:"aegis:ui:close",abortController:"aegis:ui:controller:abort"}},Ft=new Map([[Ct.debug.log,console.log],[Ct.debug.warn,console.warn],[Ct.debug.error,console.error],[Ct.debug.info,console.info],[Ct.navigate.back,()=>history.back()],[Ct.navigate.forward,()=>history.forward()],[Ct.navigate.reload,()=>history.go(0)],[Ct.navigate.close,()=>globalThis.close()],[Ct.navigate.link,e=>{e.isTrusted&&(e.preventDefault(),location.href=e.currentTarget.dataset.url)}],[Ct.navigate.popup,e=>{e.isTrusted&&(e.preventDefault(),globalThis.open(e.currentTarget.dataset.url))}],[Ct.ui.hide,({currentTarget:e})=>{Et(e.dataset.hideSelector).forEach(e=>e.hidden=!0)}],[Ct.ui.unhide,({currentTarget:e})=>{Et(e.dataset.unhideSelector).forEach(e=>e.hidden=!1)}],[Ct.ui.disable,({currentTarget:e})=>{Et(e.dataset.disableSelector).forEach(e=>e.disabled=!0)}],[Ct.ui.enable,({currentTarget:e})=>{Et(e.dataset.enableSelector).forEach(e=>e.disabled=!1)}],[Ct.ui.remove,({currentTarget:e})=>{Et(e.dataset.removeSelector).forEach(e=>e.remove())}],[Ct.ui.scrollTo,({currentTarget:e})=>{const t=kt(e.dataset.scrollToSelector);t instanceof Element&&t.scrollIntoView({behavior:matchMedia("(prefers-reduced-motion: reduce)").matches?"instant":"smooth"})}],[Ct.ui.revokeObjectURL,({currentTarget:e})=>URL.revokeObjectURL(e.src)],[Ct.ui.cancelAnimationFrame,({currentTarget:e})=>cancelAnimationFrame(parseInt(e.dataset.animationFrame))],[Ct.ui.clearInterval,({currentTarget:e})=>clearInterval(parseInt(e.dataset.clearInterval))],[Ct.ui.clearTimeout,({currentTarget:e})=>clearTimeout(parseInt(e.dataset.timeout))],[Ct.ui.abortController,({currentTarget:e})=>bt(e.dataset.aegisEventController,e.dataset.aegisControllerReason)],[Ct.ui.open,({currentTarget:e})=>document.querySelector(e.dataset.openSelector).open=!0],[Ct.ui.close,({currentTarget:e})=>document.querySelector(e.dataset.closeSelector).open=!1],[Ct.ui.showModal,({currentTarget:e})=>{const t=kt(e.dataset.showModalSelector);t instanceof HTMLDialogElement&&t.showModal()}],[Ct.ui.closeModal,({currentTarget:e})=>{const t=kt(e.dataset.closeModalSelector);t instanceof HTMLDialogElement&&t.close()}],[Ct.ui.showPopover,({currentTarget:e})=>{const t=kt(e.dataset.showPopoverSelector);t instanceof HTMLElement&&t.showPopover()}],[Ct.ui.hidePopover,({currentTarget:e})=>{const t=kt(e.dataset.hidePopoverSelector);t instanceof HTMLElement&&t.hidePopover()}],[Ct.ui.togglePopover,({currentTarget:e})=>{const t=kt(e.dataset.togglePopoverSelector);t instanceof HTMLElement&&t.togglePopover()}],[Ct.ui.print,()=>globalThis.print()],[Ct.ui.prevent,e=>e.preventDefault()],[Ct.ui.requestFullscreen,({currentTarget:e})=>{e.dataset.hasOwnProperty(At.data)?document.getElementById(e.dataset[At.data]).requestFullscreen():e.requestFullscreen()}],[Ct.ui.toggleFullscreen,({currentTarget:e})=>{const t=e.dataset.hasOwnProperty(Pt.data)?document.getElementById(e.dataset[Pt.data]):e;t.isSameNode(document.fullscreenElement)?document.exitFullscreen():t.requestFullscreen()}],[Ct.ui.exitFullsceen,()=>document.exitFullscreen()]]);class Mt extends String{[Symbol.dispose](){Ft.delete(this.toString())}}const Lt=()=>Tt,Dt=()=>Tt=!1,Ot=()=>Object.freeze(Array.from(Ft.keys())),qt=e=>Ft.has(e?.toString()),It=e=>Ft.get(e?.toString()),xt=e=>Tt&&Ft.delete(e?.toString()),Nt=()=>Ft.clear(),Rt=(e,{stack:t}={})=>jt("aegis:callback:"+crypto.randomUUID(),e,{stack:t});function Ut(e,...t){if(Ft.has(e?.toString()))return Ft.get(e?.toString()).apply(this||globalThis,t);throw new Error(`No ${e} function registered.`)}function jt(e,t,{stack:n}={}){if("string"==typeof e)return jt(new Mt(e),t,{stack:n});if(!(e instanceof Mt))throw new TypeError("Callback name must be a disposable string/CallbackRegistryKey.");if(t instanceof Function){if(Tt){if(Ft.has(e?.toString()))throw new Error(`Handler "${e}" is already registered.`);if(n instanceof DisposableStack||n instanceof AsyncDisposableStack){const o=n.use(new Mt(e));return Ft.set(o.toString(),t),o}{const n=new Mt(e);return Ft.set(n.toString(),t),n}}throw new TypeError("Cannot register new callbacks because registry is closed.")}throw new TypeError("Callback must be a function.")}function zt(e){return e instanceof Event?zt(e.currentTarget):e instanceof Document?e:e instanceof Element?zt(e.getRootNode()):e instanceof ShadowRoot?e.host:null}function $t(e,t,{capture:n=!1,passive:o=!1,once:r=!1,signal:a,stack:i}={}){if(t instanceof Function)return $t(e,Rt(t,{stack:i}),{capture:n,passive:o,once:r,signal:a});if((t instanceof String||"string"==typeof t)&&0!==t.length){if("string"!=typeof e||0===e.length)throw new TypeError("Event must be a non-empty string.");{rt(e)||ct(e);const i=[[ot(e),t]];return n&&i.push([u,""]),o&&i.push([c,""]),r&&i.push([l,""]),a instanceof AbortSignal?i.push([g,mt(a)]):"string"==typeof a&&i.push([g,a]),i.map(([e,t])=>`${e}="${t}"`).join(" ")}}throw new TypeError("Callback must be a function or a registered callback string.")}export{Mt as CallbackRegistryKey,lt as EVENTS,Ct as FUNCS,bt as abortController,vt as attachListeners,Ut as callCallback,u as capture,Nt as clearRegistry,Dt as closeRegistration,d as controller,Rt as createCallback,dt as createController,wt as disconnectEventsObserver,ot as eventToProp,It as getCallback,pt as getController,zt as getHost,ft as getSignal,qt as hasCallback,rt as hasEventAttribute,Lt as isRegistrationOpen,Ot as listCallbacks,yt as observeEvents,$t as on,p as onAbort,We as onAnimationcancel,He as onAnimationend,Ve as onAnimationiteration,Be as onAnimationstart,h as onAuxclick,v as onBeforeinput,y as onBeforetoggle,b as onBlur,f as onCancel,w as onCanplay,S as onCanplaythrough,T as onChange,E as onClick,k as onClose,A as onCommand,P as onContextmenu,C as onCopy,F as onCuechange,M as onCut,L as onDblclick,D as onDrag,O as onDragend,q as onDragenter,I as onDragexit,x as onDragleave,N as onDragover,R as onDragstart,U as onDrop,j as onDurationchange,z as onEmptied,$ as onEnded,et as onError,m as onFocus,W as onFormdata,Ue as onGotpointercapture,H as onInput,V as onInvalid,B as onKeydown,K as onKeypress,G as onKeyup,_ as onLoad,J as onLoadeddata,Q as onLoadedmetadata,X as onLoadstart,je as onLostpointercapture,Y as onMousedown,Z as onMouseenter,ee as onMouseleave,te as onMousemove,ne as onMouseout,oe as onMouseover,re as onMouseup,ze as onMozfullscreenchange,$e as onMozfullscreenerror,ie as onPaste,se as onPause,le as onPlay,ce as onPlaying,Le as onPointercancel,De as onPointerdown,Ne as onPointerenter,Re as onPointerleave,qe as onPointermove,Ie as onPointerout,xe as onPointerover,Oe as onPointerup,ue as onProgress,ge as onRatechange,de as onReset,pe as onResize,be as onScroll,me as onScrollend,fe as onSecuritypolicyviolation,he as onSeeked,ve as onSeeking,ye as onSelect,Fe as onSelectionchange,Ce as onSelectstart,we as onSlotchange,Se as onStalled,Te as onSubmit,Ee as onSuspend,ke as onTimeupdate,Me as onToggle,Ke as onTransitioncancel,Ge as onTransitionend,_e as onTransitionrun,Je as onTransitionstart,Ae as onVolumechange,Pe as onWaiting,Qe as onWebkitanimationend,Xe as onWebkitanimationiteration,Ye as onWebkitanimationstart,Ze as onWebkittransitionend,ae as onWheel,l as once,c as passive,jt as registerCallback,ut as registerController,ct as registerEventAttribute,mt as registerSignal,At as requestFullscreen,St as setGlobalErrorHandler,g as signal,Pt as toggleFullsceen,xt as unregisterCallback,gt as unregisterController,ht as unregisterSignal};
|
|
2
2
|
//# sourceMappingURL=callbackRegistry.mjs.map
|
package/callbackRegistry.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbackRegistry.mjs","sources":["events.js","callbacks.js"],"sourcesContent":["import { hasCallback, getCallback } from './callbacks.js';\n\nconst PREFIX = 'data-aegis-event-';\nconst EVENT_PREFIX = PREFIX + 'on-';\nconst EVENT_PREFIX_LENGTH = EVENT_PREFIX.length;\nconst DATA_PREFIX = 'aegisEventOn';\nconst DATA_PREFIX_LENGTH = DATA_PREFIX.length;\nconst signalSymbol = Symbol('aegis:signal');\nconst controllerSymbol = Symbol('aegis:controller');\nconst signalRegistry = new Map();\nconst controllerRegistry = new Map();\n\nexport const once = PREFIX + 'once';\nexport const passive = PREFIX + 'passive';\nexport const capture = PREFIX + 'capture';\nexport const signal = PREFIX + 'signal';\nexport const controller = PREFIX + 'controller';\nexport const onAbort = EVENT_PREFIX + 'abort';\nexport const onBlur = EVENT_PREFIX + 'blur';\nexport const onFocus = EVENT_PREFIX + 'focus';\nexport const onCancel = EVENT_PREFIX + 'cancel';\nexport const onAuxclick = EVENT_PREFIX + 'auxclick';\nexport const onBeforeinput = EVENT_PREFIX + 'beforeinput';\nexport const onBeforetoggle = EVENT_PREFIX + 'beforetoggle';\nexport const onCanplay = EVENT_PREFIX + 'canplay';\nexport const onCanplaythrough = EVENT_PREFIX + 'canplaythrough';\nexport const onChange = EVENT_PREFIX + 'change';\nexport const onClick = EVENT_PREFIX + 'click';\nexport const onClose = EVENT_PREFIX + 'close';\nexport const onCommand = EVENT_PREFIX + 'command';\nexport const onContextmenu = EVENT_PREFIX + 'contextmenu';\nexport const onCopy = EVENT_PREFIX + 'copy';\nexport const onCuechange = EVENT_PREFIX + 'cuechange';\nexport const onCut = EVENT_PREFIX + 'cut';\nexport const onDblclick = EVENT_PREFIX + 'dblclick';\nexport const onDrag = EVENT_PREFIX + 'drag';\nexport const onDragend = EVENT_PREFIX + 'dragend';\nexport const onDragenter = EVENT_PREFIX + 'dragenter';\nexport const onDragexit = EVENT_PREFIX + 'dragexit';\nexport const onDragleave = EVENT_PREFIX + 'dragleave';\nexport const onDragover = EVENT_PREFIX + 'dragover';\nexport const onDragstart = EVENT_PREFIX + 'dragstart';\nexport const onDrop = EVENT_PREFIX + 'drop';\nexport const onDurationchange = EVENT_PREFIX + 'durationchange';\nexport const onEmptied = EVENT_PREFIX + 'emptied';\nexport const onEnded = EVENT_PREFIX + 'ended';\nexport const onFormdata = EVENT_PREFIX + 'formdata';\nexport const onInput = EVENT_PREFIX + 'input';\nexport const onInvalid = EVENT_PREFIX + 'invalid';\nexport const onKeydown = EVENT_PREFIX + 'keydown';\nexport const onKeypress = EVENT_PREFIX + 'keypress';\nexport const onKeyup = EVENT_PREFIX + 'keyup';\nexport const onLoad = EVENT_PREFIX + 'load';\nexport const onLoadeddata = EVENT_PREFIX + 'loadeddata';\nexport const onLoadedmetadata = EVENT_PREFIX + 'loadedmetadata';\nexport const onLoadstart = EVENT_PREFIX + 'loadstart';\nexport const onMousedown = EVENT_PREFIX + 'mousedown';\nexport const onMouseenter = EVENT_PREFIX + 'mouseenter';\nexport const onMouseleave = EVENT_PREFIX + 'mouseleave';\nexport const onMousemove = EVENT_PREFIX + 'mousemove';\nexport const onMouseout = EVENT_PREFIX + 'mouseout';\nexport const onMouseover = EVENT_PREFIX + 'mouseover';\nexport const onMouseup = EVENT_PREFIX + 'mouseup';\nexport const onWheel = EVENT_PREFIX + 'wheel';\nexport const onPaste = EVENT_PREFIX + 'paste';\nexport const onPause = EVENT_PREFIX + 'pause';\nexport const onPlay = EVENT_PREFIX + 'play';\nexport const onPlaying = EVENT_PREFIX + 'playing';\nexport const onProgress = EVENT_PREFIX + 'progress';\nexport const onRatechange = EVENT_PREFIX + 'ratechange';\nexport const onReset = EVENT_PREFIX + 'reset';\nexport const onResize = EVENT_PREFIX + 'resize';\nexport const onScroll = EVENT_PREFIX + 'scroll';\nexport const onScrollend = EVENT_PREFIX + 'scrollend';\nexport const onSecuritypolicyviolation = EVENT_PREFIX + 'securitypolicyviolation';\nexport const onSeeked = EVENT_PREFIX + 'seeked';\nexport const onSeeking = EVENT_PREFIX + 'seeking';\nexport const onSelect = EVENT_PREFIX + 'select';\nexport const onSlotchange = EVENT_PREFIX + 'slotchange';\nexport const onStalled = EVENT_PREFIX + 'stalled';\nexport const onSubmit = EVENT_PREFIX + 'submit';\nexport const onSuspend = EVENT_PREFIX + 'suspend';\nexport const onTimeupdate = EVENT_PREFIX + 'timeupdate';\nexport const onVolumechange = EVENT_PREFIX + 'volumechange';\nexport const onWaiting = EVENT_PREFIX + 'waiting';\nexport const onSelectstart = EVENT_PREFIX + 'selectstart';\nexport const onSelectionchange = EVENT_PREFIX + 'selectionchange';\nexport const onToggle = EVENT_PREFIX + 'toggle';\nexport const onPointercancel = EVENT_PREFIX + 'pointercancel';\nexport const onPointerdown = EVENT_PREFIX + 'pointerdown';\nexport const onPointerup = EVENT_PREFIX + 'pointerup';\nexport const onPointermove = EVENT_PREFIX + 'pointermove';\nexport const onPointerout = EVENT_PREFIX + 'pointerout';\nexport const onPointerover = EVENT_PREFIX + 'pointerover';\nexport const onPointerenter = EVENT_PREFIX + 'pointerenter';\nexport const onPointerleave = EVENT_PREFIX + 'pointerleave';\nexport const onGotpointercapture = EVENT_PREFIX + 'gotpointercapture';\nexport const onLostpointercapture = EVENT_PREFIX + 'lostpointercapture';\nexport const onMozfullscreenchange = EVENT_PREFIX + 'mozfullscreenchange';\nexport const onMozfullscreenerror = EVENT_PREFIX + 'mozfullscreenerror';\nexport const onAnimationcancel = EVENT_PREFIX + 'animationcancel';\nexport const onAnimationend = EVENT_PREFIX + 'animationend';\nexport const onAnimationiteration = EVENT_PREFIX + 'animationiteration';\nexport const onAnimationstart = EVENT_PREFIX + 'animationstart';\nexport const onTransitioncancel = EVENT_PREFIX + 'transitioncancel';\nexport const onTransitionend = EVENT_PREFIX + 'transitionend';\nexport const onTransitionrun = EVENT_PREFIX + 'transitionrun';\nexport const onTransitionstart = EVENT_PREFIX + 'transitionstart';\nexport const onWebkitanimationend = EVENT_PREFIX + 'webkitanimationend';\nexport const onWebkitanimationiteration = EVENT_PREFIX + 'webkitanimationiteration';\nexport const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart';\nexport const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend';\nexport const onError = EVENT_PREFIX + 'error';\n\nexport const eventAttrs = [\n\tonAbort,\n\tonBlur,\n\tonFocus,\n\tonCancel,\n\tonAuxclick,\n\tonBeforeinput,\n\tonBeforetoggle,\n\tonCanplay,\n\tonCanplaythrough,\n\tonChange,\n\tonClick,\n\tonClose,\n\tonCommand,\n\tonContextmenu,\n\tonCopy,\n\tonCuechange,\n\tonCut,\n\tonDblclick,\n\tonDrag,\n\tonDragend,\n\tonDragenter,\n\tonDragexit,\n\tonDragleave,\n\tonDragover,\n\tonDragstart,\n\tonDrop,\n\tonDurationchange,\n\tonEmptied,\n\tonEnded,\n\tonFormdata,\n\tonInput,\n\tonInvalid,\n\tonKeydown,\n\tonKeypress,\n\tonKeyup,\n\tonLoad,\n\tonLoadeddata,\n\tonLoadedmetadata,\n\tonLoadstart,\n\tonMousedown,\n\tonMouseenter,\n\tonMouseleave,\n\tonMousemove,\n\tonMouseout,\n\tonMouseover,\n\tonMouseup,\n\tonWheel,\n\tonPaste,\n\tonPause,\n\tonPlay,\n\tonPlaying,\n\tonProgress,\n\tonRatechange,\n\tonReset,\n\tonResize,\n\tonScroll,\n\tonScrollend,\n\tonSecuritypolicyviolation,\n\tonSeeked,\n\tonSeeking,\n\tonSelect,\n\tonSlotchange,\n\tonStalled,\n\tonSubmit,\n\tonSuspend,\n\tonTimeupdate,\n\tonVolumechange,\n\tonWaiting,\n\tonSelectstart,\n\tonSelectionchange,\n\tonToggle,\n\tonPointercancel,\n\tonPointerdown,\n\tonPointerup,\n\tonPointermove,\n\tonPointerout,\n\tonPointerover,\n\tonPointerenter,\n\tonPointerleave,\n\tonGotpointercapture,\n\tonLostpointercapture,\n\tonMozfullscreenchange,\n\tonMozfullscreenerror,\n\tonAnimationcancel,\n\tonAnimationend,\n\tonAnimationiteration,\n\tonAnimationstart,\n\tonTransitioncancel,\n\tonTransitionend,\n\tonTransitionrun,\n\tonTransitionstart,\n\tonWebkitanimationend,\n\tonWebkitanimationiteration,\n\tonWebkitanimationstart,\n\tonWebkittransitionend,\n\tonError,\n];\n\nlet selector = eventAttrs.map(attr => `[${CSS.escape(attr)}]`).join(', ');\n\nconst attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;\n\nexport const eventToProp = event => EVENT_PREFIX + event;\n\nexport const hasEventAttribute = event => eventAttrs.includes(EVENT_PREFIX + event);\n\nconst isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX);\n\nfunction _addListeners(el, { signal, attrFilter = EVENTS } = {}) {\n\tconst dataset = el.dataset;\n\n\tfor (const [attr, val] of Object.entries(dataset).filter(isEventDataAttr)) {\n\t\ttry {\n\t\t\tconst event = 'on' + attr.substring(DATA_PREFIX_LENGTH);\n\n\t\t\tif (attrFilter.hasOwnProperty(event) && hasCallback(val)) {\n\t\t\t\tel.addEventListener(event.substring(2).toLowerCase(), getCallback(val), {\n\t\t\t\t\tpassive: dataset.hasOwnProperty('aegisEventPassive'),\n\t\t\t\t\tcapture: dataset.hasOwnProperty('aegisEventCapture'),\n\t\t\t\t\tonce: dataset.hasOwnProperty('aegisEventOnce'),\n\t\t\t\t\tsignal: dataset.hasOwnProperty('aegisEventSignal') ? getSignal(dataset.aegisEventSignal) : signal,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch(err) {\n\t\t\treportError(err);\n\t\t}\n\t}\n}\n\nconst observer = new MutationObserver(records => {\n\trecords.forEach(record => {\n\t\tswitch(record.type) {\n\t\t\tcase 'childList':\n\t\t\t\t[...record.addedNodes]\n\t\t\t\t\t.filter(node => node.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t.forEach(node => attachListeners(node));\n\t\t\t\tbreak;\n\n\t\t\tcase 'attributes':\n\t\t\t\tif (typeof record.oldValue === 'string' && hasCallback(record.oldValue)) {\n\t\t\t\t\trecord.target.removeEventListener(\n\t\t\t\t\t\trecord.attributeName.substring(EVENT_PREFIX_LENGTH),\n\t\t\t\t\t\tgetCallback(record.oldValue), {\n\t\t\t\t\t\t\tonce: record.target.hasAttribute(once),\n\t\t\t\t\t\t\tcapture: record.target.hasAttribute(capture),\n\t\t\t\t\t\t\tpassive: record.target.hasAttribute(passive),\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trecord.target.hasAttribute(record.attributeName)\n\t\t\t\t\t&& hasCallback(record.target.getAttribute(record.attributeName))\n\t\t\t\t) {\n\t\t\t\t\trecord.target.addEventListener(\n\t\t\t\t\t\trecord.attributeName.substring(EVENT_PREFIX_LENGTH),\n\t\t\t\t\t\tgetCallback(record.target.getAttribute(record.attributeName)), {\n\t\t\t\t\t\t\tonce: record.target.hasAttribute(once),\n\t\t\t\t\t\t\tcapture: record.target.hasAttribute(capture),\n\t\t\t\t\t\t\tpassive: record.target.hasAttribute(passive),\n\t\t\t\t\t\t\tsignal: record.target.hasAttribute(signal) ? getSignal(record.target.getAttribute(signal)) : undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n});\n\nexport const EVENTS = {\n\tonAbort,\n\tonBlur,\n\tonFocus,\n\tonCancel,\n\tonAuxclick,\n\tonBeforeinput,\n\tonBeforetoggle,\n\tonCanplay,\n\tonCanplaythrough,\n\tonChange,\n\tonClick,\n\tonClose,\n\tonCommand,\n\tonContextmenu,\n\tonCopy,\n\tonCuechange,\n\tonCut,\n\tonDblclick,\n\tonDrag,\n\tonDragend,\n\tonDragenter,\n\tonDragexit,\n\tonDragleave,\n\tonDragover,\n\tonDragstart,\n\tonDrop,\n\tonDurationchange,\n\tonEmptied,\n\tonEnded,\n\tonFormdata,\n\tonInput,\n\tonInvalid,\n\tonKeydown,\n\tonKeypress,\n\tonKeyup,\n\tonLoad,\n\tonLoadeddata,\n\tonLoadedmetadata,\n\tonLoadstart,\n\tonMousedown,\n\tonMouseenter,\n\tonMouseleave,\n\tonMousemove,\n\tonMouseout,\n\tonMouseover,\n\tonMouseup,\n\tonWheel,\n\tonPaste,\n\tonPause,\n\tonPlay,\n\tonPlaying,\n\tonProgress,\n\tonRatechange,\n\tonReset,\n\tonResize,\n\tonScroll,\n\tonScrollend,\n\tonSecuritypolicyviolation,\n\tonSeeked,\n\tonSeeking,\n\tonSelect,\n\tonSlotchange,\n\tonStalled,\n\tonSubmit,\n\tonSuspend,\n\tonTimeupdate,\n\tonVolumechange,\n\tonWaiting,\n\tonSelectstart,\n\tonSelectionchange,\n\tonToggle,\n\tonPointercancel,\n\tonPointerdown,\n\tonPointerup,\n\tonPointermove,\n\tonPointerout,\n\tonPointerover,\n\tonPointerenter,\n\tonPointerleave,\n\tonGotpointercapture,\n\tonLostpointercapture,\n\tonMozfullscreenchange,\n\tonMozfullscreenerror,\n\tonAnimationcancel,\n\tonAnimationend,\n\tonAnimationiteration,\n\tonAnimationstart,\n\tonTransitioncancel,\n\tonTransitionend,\n\tonTransitionrun,\n\tonTransitionstart,\n\tonWebkitanimationend,\n\tonWebkitanimationiteration,\n\tonWebkitanimationstart,\n\tonWebkittransitionend,\n\tonError,\n\tonce,\n\tpassive,\n\tcapture,\n};\n\n/**\n * Register an attribute to observe for adding/removing event listeners\n *\n * @param {string} attr Name of the attribute to observe\n * @param {object} options\n * @param {boolean} [options.addListeners=false] Whether or not to automatically add listeners\n * @param {Document|Element} [options.base=document.body] Root node to observe\n * @param {AbortSignal} [options.signal] An abort signal to remove any listeners when aborted\n * @returns {string} The resulting `data-*` attribute name\n */\nexport function registerEventAttribute(attr, {\n\taddListeners = false,\n\tbase = document.body,\n\tsignal,\n} = {}) {\n\tconst fullAttr = EVENT_PREFIX + attr.toLowerCase();\n\n\tif (! eventAttrs.includes(fullAttr)) {\n\t\tconst sel = `[${CSS.escape(fullAttr)}]`;\n\t\tconst prop = attrToProp(fullAttr);\n\t\teventAttrs.push(fullAttr);\n\t\tEVENTS[prop] = fullAttr;\n\t\tselector += `, ${sel}`;\n\n\t\tif (addListeners) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst config = { attrFilter: { [prop]: sel }, signal };\n\t\t\t\t[base, ...base.querySelectorAll(sel)].forEach(el => _addListeners(el, config));\n\t\t\t});\n\t\t}\n\t}\n\n\treturn fullAttr;\n}\n\n/**\n * Registers an `AbortController` in the controller registry and returns the key for it\n *\n * @param {AbortController} controller\n * @returns {string} The randomly generated key with which the controller is registered\n * @throws {TypeError} If controller is not an `AbortController`\n * @throws {Error} Any `reason` if controller is already aborted\n */\nexport function registerController(controller) {\n\tif (! (controller instanceof AbortController)) {\n\t\tthrow new TypeError('Controller is not an `AbortSignal.');\n\t} else if (controller.signal.aborted) {\n\t\tthrow controller.signal.reason;\n\t} else if (typeof controller.signal[controllerSymbol] === 'string') {\n\t\treturn controller.signal[controllerSymbol];\n\t} else {\n\t\tconst key = 'aegis:event:controller:' + crypto.randomUUID();\n\t\tObject.defineProperty(controller.signal, controllerSymbol, { value: key, writable: false, enumerable: false });\n\t\tcontrollerRegistry.set(key, controller);\n\n\t\tcontroller.signal.addEventListener('abort', unregisterController, { once: true });\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Removes a controller from the registry\n *\n * @param {AbortController|AbortSignal|string} key The registed key or the controller or signal it corresponds to\n * @returns {boolean} Whether or not the controller was successfully unregistered\n */\nexport function unregisterController(key) {\n\tif (key instanceof AbortController) {\n\t\treturn controllerRegistry.delete(key.signal[controllerSymbol]);\n\t} else if (key instanceof AbortSignal) {\n\t\treturn controllerRegistry.delete(key[controllerSymbol]);\n\t} else {\n\t\treturn controllerRegistry.delete(key);\n\t}\n}\n\n/**\n * Creates and registers an `AbortController` in the controller registry and returns the key for it\n *\n * @param {object} options\n * @param {AbortSignal} [options.signal] An optional `AbortSignal` to externally abort the controller with\n * @returns {string} The randomly generated key with which the controller is registered\n */\nexport function createController({ signal } = {}) {\n\tconst controller = new AbortController();\n\n\tif (signal instanceof AbortSignal) {\n\t\tsignal.addEventListener('abort', ({ target }) => controller.abort(target.reason), { signal: controller.signal});\n\t}\n\n\treturn registerController(controller);\n}\n\n/**\n * Get a registetd controller from the registry\n *\n * @param {string} key Generated key with which the controller was registered\n * @returns {AbortController|void} Any registered controller, if any\n */\nexport const getController = key => controllerRegistry.get(key);\n\nexport function abortController(key, reason) {\n\tconst controller = getController(key);\n\n\tif (! (controller instanceof AbortController)) {\n\t\treturn false;\n\t} else if (typeof reason === 'string') {\n\t\tcontroller.abort(new Error(reason));\n\t\treturn true;\n\t} else {\n\t\tcontroller.abort(reason);\n\t\treturn true;\n\t}\n}\n\n/**\n * Register an `AbortSignal` to be used in declarative HTML as a value for `data-aegis-event-signal`\n *\n * @param {AbortSignal} signal The signal to register\n * @returns {string} The registered key\n * @throws {TypeError} Thrown if not an `AbortSignal`\n */\nexport function registerSignal(signal) {\n\tif (! (signal instanceof AbortSignal)) {\n\t\tthrow new TypeError('Signal must be an `AbortSignal`.');\n\t} else if (typeof signal[signalSymbol] === 'string') {\n\t\treturn signal[signalSymbol];\n\t} else {\n\t\tconst key = 'aegis:event:signal:' + crypto.randomUUID();\n\t\tObject.defineProperty(signal, signalSymbol, { value: key, writable: false, enumerable: false });\n\t\tsignalRegistry.set(key, signal);\n\t\tsignal.addEventListener('abort', ({ target }) => unregisterSignal(target[signalSymbol]), { once: true });\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Gets and `AbortSignal` from the registry\n *\n * @param {string} key The registered key for the signal\n * @returns {AbortSignal|void} The corresponding `AbortSignal`, if any\n */\nexport const getSignal = key => signalRegistry.get(key);\n\n/**\n * Removes an `AbortSignal` from the registry\n *\n * @param {AbortSignal|string} signal An `AbortSignal` or the registered key for one\n * @returns {boolean} Whether or not the signal was sucessfully unregistered\n * @throws {TypeError} Throws if `signal` is not an `AbortSignal` or the key for a registered signal\n */\nexport function unregisterSignal(signal) {\n\tif (signal instanceof AbortSignal) {\n\t\treturn signalRegistry.delete(signal[signalSymbol]);\n\t} else if (typeof signal === 'string') {\n\t\treturn signalRegistry.delete(signal);\n\t} else {\n\t\tthrow new TypeError('Signal must be an `AbortSignal` or registered key/attribute.');\n\t}\n}\n\n/**\n * Add listeners to an element and its children, matching a generated query based on registered attributes\n *\n * @param {Element|Document} target Root node to add listeners from\n * @param {object} options\n * @param {AbortSignal} [options.signal] Optional signal to remove event listeners\n * @returns {Element|Document} Returns the passed target node\n */\nexport function attachListeners(target, { signal } = {}) {\n\tconst nodes = target instanceof Element && target.matches(selector)\n\t\t? [target, ...target.querySelectorAll(selector)]\n\t\t: target.querySelectorAll(selector);\n\n\tnodes.forEach(el => _addListeners(el, { signal }));\n\n\treturn target;\n}\n\n/**\n * Add a node to the `MutationObserver` to observe attributes and add/remove event listeners\n *\n * @param {Document|Element} root Element to observe attributes on\n */\nexport function observeEvents(root = document) {\n\tattachListeners(root);\n\n\tobserver.observe(root, {\n\t\tsubtree: true,\n\t\tchildList:true,\n\t\tattributes: true,\n\t\tattributeOldValue: true,\n\t\tattributeFilter: eventAttrs,\n\t});\n}\n\n/**\n * Disconnects the `MutationObserver`, disabling observing of all attribute changes\n *\n * @returns {void}\n */\nexport const disconnectEventsObserver = () => observer.disconnect();\n\n/**\n * Register a global error handler callback\n *\n * @param {Function} callback Callback to register as a global error handler\n * @param {EventInit} config Typical event listener config object\n */\nexport function setGlobalErrorHandler(callback, { capture, once, passive, signal } = {}) {\n\tif (callback instanceof Function) {\n\t\tglobalThis.addEventListener('error', callback, { capture, once, passive, signal });\n\t} else {\n\t\tthrow new TypeError('Callback is not a function.');\n\t}\n}\n","import {\n\teventToProp, capture as captureAttr, once as onceAttr, passive as passiveAttr, signal as signalAttr,\n\tregisterEventAttribute, hasEventAttribute, registerSignal, abortController,\n} from './events.js';\n\nlet _isRegistrationOpen = true;\n\nconst $$ = (selector, base = document) => base.querySelectorAll(selector);\n\nconst $ = (selector, base = document) => base.querySelector(selector);\n\nexport const requestFullscreen = { attr: 'data-request-fullscreen-selector', data: 'requestFullscreenSelector' };\nexport const toggleFullsceen = { attr: 'data-toggle-fullscreen-selector', data: 'toggleFullscreenSelector' };\n\nexport const FUNCS = {\n\tdebug: {\n\t\tlog: 'aegis:debug:log',\n\t\tinfo: 'aegis:debug:info',\n\t\twarn: 'aegis:debug:warn',\n\t\terror: 'aegis:debug:error',\n\t},\n\tnavigate: {\n\t\tback: 'aegis:navigate:back',\n\t\tforward: 'aegis:navigate:forward',\n\t\treload: 'aegis:navigate:reload',\n\t\tclose: 'aegis:navigate:close',\n\t\tlink: 'aegis:navigate:go',\n\t\tpopup: 'aegis:navigate:popup',\n\t},\n\tui: {\n\t\tcommand: 'aegis:ui:command',\n\t\tprint: 'aegis:ui:print',\n\t\tremove: 'aegis:ui:remove',\n\t\thide: 'aegis:ui:hide',\n\t\tunhide: 'aegis:ui:unhide',\n\t\tshowModal: 'aegis:ui:showModal',\n\t\tcloseModal: 'aegis:ui:closeModal',\n\t\tshowPopover: 'aegis:ui:showPopover',\n\t\thidePopover: 'aegis:ui:hidePopover',\n\t\ttogglePopover: 'aegis:ui:togglePopover',\n\t\tenable: 'aegis:ui:enable',\n\t\tdisable: 'aegis:ui:disable',\n\t\tscrollTo: 'aegis:ui:scrollTo',\n\t\tprevent: 'aegis:ui:prevent',\n\t\trevokeObjectURL: 'aegis:ui:revokeObjectURL',\n\t\tcancelAnimationFrame: 'aegis:ui:cancelAnimationFrame',\n\t\trequestFullscreen: 'aegis:ui:requestFullscreen',\n\t\ttoggleFullscreen: 'aegis:ui:toggleFullsceen',\n\t\texitFullsceen: 'aegis:ui:exitFullscreen',\n\t\topen: 'aegis:ui:open',\n\t\tclose: 'aegis:ui:close',\n\t\tabortController: 'aegis:ui:controller:abort',\n\t},\n};\n\nconst registry = new Map([\n\t[FUNCS.debug.log, console.log],\n\t[FUNCS.debug.warn, console.warn],\n\t[FUNCS.debug.error, console.error],\n\t[FUNCS.debug.info, console.info],\n\t[FUNCS.navigate.back, () => history.back()],\n\t[FUNCS.navigate.forward, () => history.forward()],\n\t[FUNCS.navigate.reload, () => history.go(0)],\n\t[FUNCS.navigate.close, () => globalThis.close()],\n\t[FUNCS.navigate.link, event => {\n\t\tif (event.isTrusted) {\n\t\t\tevent.preventDefault();\n\t\t\tlocation.href = event.currentTarget.dataset.url;\n\t\t}\n\t}],\n\t[FUNCS.navigate.popup, event => {\n\t\tif (event.isTrusted) {\n\t\t\tevent.preventDefault();\n\t\t\tglobalThis.open(event.currentTarget.dataset.url);\n\t\t}\n\t}],\n\t[FUNCS.ui.hide, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.hideSelector).forEach(el => el.hidden = true);\n\t}],\n\t[FUNCS.ui.unhide, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.unhideSelector).forEach(el => el.hidden = false);\n\t}],\n\t[FUNCS.ui.disable, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.disableSelector).forEach(el => el.disabled = true);\n\t}],\n\t[FUNCS.ui.enable, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.enableSelector).forEach(el => el.disabled = false);\n\t}],\n\t[FUNCS.ui.remove, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.removeSelector).forEach(el => el.remove());\n\t}],\n\t[FUNCS.ui.scrollTo, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.scrollToSelector);\n\n\t\tif (target instanceof Element) {\n\t\t\ttarget.scrollIntoView({\n\t\t\t\tbehavior: matchMedia('(prefers-reduced-motion: reduce)').matches\n\t\t\t\t\t? 'instant'\n\t\t\t\t\t: 'smooth',\n\t\t\t});\n\t\t}\n\t}],\n\t[FUNCS.ui.revokeObjectURL, ({ currentTarget }) => URL.revokeObjectURL(currentTarget.src)],\n\t[FUNCS.ui.cancelAnimationFrame, ({ currentTarget }) => cancelAnimationFrame(parseInt(currentTarget.dataset.animationFrame))],\n\t[FUNCS.ui.clearInterval, ({ currentTarget }) => clearInterval(parseInt(currentTarget.dataset.clearInterval))],\n\t[FUNCS.ui.clearTimeout, ({ currentTarget }) => clearTimeout(parseInt(currentTarget.dataset.timeout))],\n\t[FUNCS.ui.abortController, ({ currentTarget }) => abortController(currentTarget.dataset.aegisEventController, currentTarget.dataset.aegisControllerReason)],\n\t[FUNCS.ui.open, ({ currentTarget }) => document.querySelector(currentTarget.dataset.openSelector).open = true],\n\t[FUNCS.ui.close, ({ currentTarget }) => document.querySelector(currentTarget.dataset.closeSelector).open = false],\n\t[FUNCS.ui.showModal, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.showModalSelector);\n\n\t\tif (target instanceof HTMLDialogElement) {\n\t\t\ttarget.showModal();\n\t\t}\n\t}],\n\t[FUNCS.ui.closeModal, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.closeModalSelector);\n\n\t\tif (target instanceof HTMLDialogElement) {\n\t\t\ttarget.close();\n\t\t}\n\t}],\n\t[FUNCS.ui.showPopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.showPopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.showPopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.hidePopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.hidePopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.hidePopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.togglePopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.togglePopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.togglePopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.print, () => globalThis.print()],\n\t[FUNCS.ui.prevent, event => event.preventDefault()],\n\t[FUNCS.ui.requestFullscreen, ({ currentTarget}) => {\n\t\tif (currentTarget.dataset.hasOwnProperty(requestFullscreen.data)) {\n\t\t\tdocument.getElementById(currentTarget.dataset[requestFullscreen.data]).requestFullscreen();\n\t\t} else {\n\t\t\tcurrentTarget.requestFullscreen();\n\t\t}\n\t}],\n\t[FUNCS.ui.toggleFullscreen, ({ currentTarget }) => {\n\t\tconst target = currentTarget.dataset.hasOwnProperty(toggleFullsceen.data)\n\t\t\t? document.getElementById(currentTarget.dataset[toggleFullsceen.data])\n\t\t\t: currentTarget;\n\n\t\tif (target.isSameNode(document.fullscreenElement)) {\n\t\t\tdocument.exitFullscreen();\n\t\t} else {\n\t\t\ttarget.requestFullscreen();\n\t\t}\n\t}],\n\t[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],\n]);\n\n/**\n * Check if callback registry is open\n *\n * @returns {boolean} Whether or not callback registry is open\n */\nexport const isRegistrationOpen = () => _isRegistrationOpen;\n\n/**\n * Close callback registry\n *\n * @returns {boolean} Whether or not the callback was succesfully removed\n */\nexport const closeRegistration = () => _isRegistrationOpen = false;\n\n/**\n * Get an array of registered callbacks\n *\n * @returns {Array} A frozen array listing keys to all registered callbacks\n */\nexport const listCallbacks = () => Object.freeze(Array.from(registry.keys()));\n\n/**\n * Check if a callback is registered\n *\n * @param {string} name The name/key to check for in callback registry\n * @returns {boolean} Whether or not a callback is registered\n */\nexport const hasCallback = name => registry.has(name);\n\n/**\n * Get a callback from the registry by name/key\n *\n * @param {string} name The name/key of the callback to get\n * @returns {Function|undefined} The corresponding function registered under that name/key\n */\nexport const getCallback = name => registry.get(name);\n\n/**\n *\t Remove a callback from the registry\n *\n * @param {string} name The name/key of the callback to get\n * @returns {boolean} Whether or not the callback was successfully unregisterd\n */\nexport const unregisterCallback = name => _isRegistrationOpen && registry.delete(name);\n\n/**\n * Remove all callbacks from the registry\n *\n * @returns {void}\n */\nexport const clearRegistry = () => registry.clear();\n\n/**\n * Create a registered callback with a randomly generated name\n *\n * @param {Function} callback Callback function to register\n * @returns {string} The automatically generated key/name of the registered callback\n */\nexport const createCallback = (callback) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback);\n\n/**\n * Call a callback fromt the registry by name/key\n *\n * @param {string} name The name/key of the registered function\n * @param {...any} args Any arguments to pass along to the function\n * @returns {any} Whatever the return value of the function is\n * @throws {Error} Throws if callback is not found or any error resulting from calling the function\n */\nexport function callCallback(name, ...args) {\n\tif (registry.has(name)) {\n\t\treturn registry.get(name).apply(this || globalThis, args);\n\t} else {\n\t\tthrow new Error(`No ${name} function registered.`);\n\t}\n}\n\n/**\n * Register a named callback in registry\n *\n * @param {string} name The name/key to register the callback under\n * @param {Function} callback The callback value to register\n * @returns {string} The registered name/key\n */\nexport function registerCallback(name, callback) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new TypeError('Callback name must be a string.');\n\t} if (! (callback instanceof Function)) {\n\t\tthrow new TypeError('Callback must be a function.');\n\t} else if (! _isRegistrationOpen) {\n\t\tthrow new TypeError('Cannot register new callbacks because registry is closed.');\n\t} else if (registry.has(name)) {\n\t\tthrow new Error(`Handler \"${name}\" is already registered.`);\n\t} else {\n\t\tregistry.set(name, callback);\n\t\treturn name;\n\t}\n}\n\n/**\n * Get the host/root node of a given thing.\n *\n * @param {Event|Document|Element|ShadowRoot} target Source thing to search for host of\n * @returns {Document|Element|null} The host/root node, or null\n */\nexport function getHost(target) {\n\tif (target instanceof Event) {\n\t\treturn getHost(target.currentTarget);\n\t} else if (target instanceof Document) {\n\t\treturn target;\n\t} else if (target instanceof Element) {\n\t\treturn getHost(target.getRootNode());\n\t} else if (target instanceof ShadowRoot) {\n\t\treturn target.host;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nexport function on(event, callback, { capture = false, passive = false, once = false, signal } = {}) {\n\tif (callback instanceof Function) {\n\t\treturn on(event, createCallback(callback), { capture, passive, once, signal });\n\t} else if (typeof callback !== 'string' || callback.length === 0) {\n\t\tthrow new TypeError('Callback must be a function or a registered callback string.');\n\t} else if (typeof event !== 'string' || event.length === 0) {\n\t\tthrow new TypeError('Event must be a non-empty string.');\n\t} else {\n\t\tif (! hasEventAttribute(event)) {\n\t\t\tregisterEventAttribute(event);\n\t\t}\n\n\t\tconst parts = [[eventToProp(event), callback]];\n\n\t\tif (capture) {\n\t\t\tparts.push([captureAttr, '']);\n\t\t}\n\n\t\tif (passive) {\n\t\t\tparts.push([passiveAttr, '']);\n\t\t}\n\n\t\tif (once) {\n\t\t\tparts.push([onceAttr, '']);\n\t\t}\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tparts.push([signalAttr, registerSignal(signal)]);\n\t\t} else if (typeof signal === 'string') {\n\t\t\tparts.push([signalAttr, signal]);\n\t\t}\n\n\t\treturn parts.map(([prop, val]) => `${prop}=\"${val}\"`).join(' ');\n\t}\n}\n"],"names":["PREFIX","EVENT_PREFIX","DATA_PREFIX","signalSymbol","Symbol","controllerSymbol","signalRegistry","Map","controllerRegistry","once","passive","capture","signal","controller","onAbort","onBlur","onFocus","onCancel","onAuxclick","onBeforeinput","onBeforetoggle","onCanplay","onCanplaythrough","onChange","onClick","onClose","onCommand","onContextmenu","onCopy","onCuechange","onCut","onDblclick","onDrag","onDragend","onDragenter","onDragexit","onDragleave","onDragover","onDragstart","onDrop","onDurationchange","onEmptied","onEnded","onFormdata","onInput","onInvalid","onKeydown","onKeypress","onKeyup","onLoad","onLoadeddata","onLoadedmetadata","onLoadstart","onMousedown","onMouseenter","onMouseleave","onMousemove","onMouseout","onMouseover","onMouseup","onWheel","onPaste","onPause","onPlay","onPlaying","onProgress","onRatechange","onReset","onResize","onScroll","onScrollend","onSecuritypolicyviolation","onSeeked","onSeeking","onSelect","onSlotchange","onStalled","onSubmit","onSuspend","onTimeupdate","onVolumechange","onWaiting","onSelectstart","onSelectionchange","onToggle","onPointercancel","onPointerdown","onPointerup","onPointermove","onPointerout","onPointerover","onPointerenter","onPointerleave","onGotpointercapture","onLostpointercapture","onMozfullscreenchange","onMozfullscreenerror","onAnimationcancel","onAnimationend","onAnimationiteration","onAnimationstart","onTransitioncancel","onTransitionend","onTransitionrun","onTransitionstart","onWebkitanimationend","onWebkitanimationiteration","onWebkitanimationstart","onWebkittransitionend","onError","eventAttrs","selector","map","attr","CSS","escape","join","eventToProp","event","hasEventAttribute","includes","isEventDataAttr","name","startsWith","_addListeners","el","attrFilter","EVENTS","dataset","val","Object","entries","filter","substring","hasOwnProperty","hasCallback","addEventListener","toLowerCase","getCallback","getSignal","aegisEventSignal","err","reportError","observer","MutationObserver","records","forEach","record","type","addedNodes","node","nodeType","Node","ELEMENT_NODE","attachListeners","oldValue","target","removeEventListener","attributeName","hasAttribute","getAttribute","undefined","registerEventAttribute","addListeners","base","document","body","fullAttr","sel","prop","toUpperCase","EVENT_PREFIX_LENGTH","attrToProp","push","requestAnimationFrame","config","querySelectorAll","registerController","AbortController","aborted","reason","key","crypto","randomUUID","defineProperty","value","writable","enumerable","set","unregisterController","TypeError","delete","AbortSignal","createController","abort","getController","get","abortController","Error","registerSignal","unregisterSignal","Element","matches","observeEvents","root","observe","subtree","childList","attributes","attributeOldValue","attributeFilter","disconnectEventsObserver","disconnect","setGlobalErrorHandler","callback","Function","globalThis","_isRegistrationOpen","$$","$","querySelector","requestFullscreen","data","toggleFullsceen","FUNCS","debug","log","info","warn","error","navigate","back","forward","reload","close","link","popup","ui","command","print","remove","hide","unhide","showModal","closeModal","showPopover","hidePopover","togglePopover","enable","disable","scrollTo","prevent","revokeObjectURL","cancelAnimationFrame","toggleFullscreen","exitFullsceen","open","registry","console","history","go","isTrusted","preventDefault","location","href","currentTarget","url","hideSelector","hidden","unhideSelector","disableSelector","disabled","enableSelector","removeSelector","scrollToSelector","scrollIntoView","behavior","matchMedia","URL","src","parseInt","animationFrame","clearInterval","clearTimeout","timeout","aegisEventController","aegisControllerReason","openSelector","closeSelector","showModalSelector","HTMLDialogElement","closeModalSelector","showPopoverSelector","HTMLElement","hidePopoverSelector","togglePopoverSelector","getElementById","isSameNode","fullscreenElement","exitFullscreen","isRegistrationOpen","closeRegistration","listCallbacks","freeze","Array","from","keys","has","unregisterCallback","clearRegistry","clear","createCallback","registerCallback","callCallback","args","apply","this","length","getHost","Event","Document","getRootNode","ShadowRoot","host","on","parts","captureAttr","passiveAttr","onceAttr","signalAttr"],"mappings":"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WAC7DR,EAAOS,OAAOC,oBACbV,EAAOW,cAAczB,UA5PCpI,IA6PtByI,GAAYS,EAAOQ,UAAW,CAC7BlJ,KAAM0I,EAAOS,OAAOG,aAAatJ,GACjCE,QAASwI,EAAOS,OAAOG,aAAapJ,GACpCD,QAASyI,EAAOS,OAAOG,aAAarJ,KAMtCyI,EAAOS,OAAOG,aAAaZ,EAAOW,gBAC/BvB,GAAYY,EAAOS,OAAOI,aAAab,EAAOW,iBAEjDX,EAAOS,OAAOpB,iBACbW,EAAOW,cAAczB,UA1QCpI,IA2QtByI,GAAYS,EAAOS,OAAOI,aAAab,EAAOW,gBAAiB,CAC9DrJ,KAAM0I,EAAOS,OAAOG,aAAatJ,GACjCE,QAASwI,EAAOS,OAAOG,aAAapJ,GACpCD,QAASyI,EAAOS,OAAOG,aAAarJ,GACpCE,OAAQuI,EAAOS,OAAOG,aAAanJ,GAAU+H,GAAUQ,EAAOS,OAAOI,aAAapJ,SAAWqJ,IAKpG,GACG,IAGUlC,GAAS,CACrBjH,UACAC,SACAC,UACAC,WACAC,aACAC,gBACAC,iBACAC,YACAC,mBACAC,WACAC,UACAC,UACAC,YACAC,gBACAC,SACAC,cACAC,QACAC,aACAC,SACAC,YACAC,cACAC,aACAC,cACAC,aACAC,cACAC,SACAC,mBACAC,YACAC,UACAC,aACAC,UACAC,YACAC,YACAC,aACAC,UACAC,SACAC,eACAC,mBACAC,cACAC,cACAC,eACAC,eACAC,eACAC,cACAC,eACAC,aACAC,WACAC,WACAC,WACAC,UACAC,aACAC,cACAC,gBACAC,WACAC,YACAC,YACAC,eACAC,6BACAC,YACAC,aACAC,YACAC,gBACAC,aACAC,YACAC,aACAC,gBACAC,kBACAC,aACAC,iBACAC,qBACAC,YACAC,mBACAC,iBACAC,eACAC,iBACAC,gBACAC,iBACAC,kBACAC,kBACAC,uBACAC,wBACAC,yBACAC,wBACAC,qBACAC,kBACAC,wBACAC,oBACAC,sBACAC,mBACAC,mBACAC,qBACAC,wBACAC,8BACAC,0BACAC,yBACAC,WACApG,OACAC,UACAC,WAaM,SAASuJ,GAAuBjD,GAAMkD,aAC5CA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"}
|
|
1
|
+
{"version":3,"file":"callbackRegistry.mjs","sources":["events.js","callbacks.js"],"sourcesContent":["import { hasCallback, getCallback } from './callbacks.js';\nimport { Signal } from '@shgysk8zer0/signals';\n\nconst PREFIX = 'data-aegis-event-';\nconst EVENT_PREFIX = PREFIX + 'on-';\nconst EVENT_PREFIX_LENGTH = EVENT_PREFIX.length;\nconst DATA_PREFIX = 'aegisEventOn';\nconst DATA_PREFIX_LENGTH = DATA_PREFIX.length;\nconst signalSymbol = Symbol('aegis:signal');\nconst controllerSymbol = Symbol('aegis:controller');\nconst signalRegistry = new Map();\nconst controllerRegistry = new Map();\n\nexport const once = PREFIX + 'once';\nexport const passive = PREFIX + 'passive';\nexport const capture = PREFIX + 'capture';\nexport const signal = PREFIX + 'signal';\nexport const controller = PREFIX + 'controller';\nexport const onAbort = EVENT_PREFIX + 'abort';\nexport const onBlur = EVENT_PREFIX + 'blur';\nexport const onFocus = EVENT_PREFIX + 'focus';\nexport const onCancel = EVENT_PREFIX + 'cancel';\nexport const onAuxclick = EVENT_PREFIX + 'auxclick';\nexport const onBeforeinput = EVENT_PREFIX + 'beforeinput';\nexport const onBeforetoggle = EVENT_PREFIX + 'beforetoggle';\nexport const onCanplay = EVENT_PREFIX + 'canplay';\nexport const onCanplaythrough = EVENT_PREFIX + 'canplaythrough';\nexport const onChange = EVENT_PREFIX + 'change';\nexport const onClick = EVENT_PREFIX + 'click';\nexport const onClose = EVENT_PREFIX + 'close';\nexport const onCommand = EVENT_PREFIX + 'command';\nexport const onContextmenu = EVENT_PREFIX + 'contextmenu';\nexport const onCopy = EVENT_PREFIX + 'copy';\nexport const onCuechange = EVENT_PREFIX + 'cuechange';\nexport const onCut = EVENT_PREFIX + 'cut';\nexport const onDblclick = EVENT_PREFIX + 'dblclick';\nexport const onDrag = EVENT_PREFIX + 'drag';\nexport const onDragend = EVENT_PREFIX + 'dragend';\nexport const onDragenter = EVENT_PREFIX + 'dragenter';\nexport const onDragexit = EVENT_PREFIX + 'dragexit';\nexport const onDragleave = EVENT_PREFIX + 'dragleave';\nexport const onDragover = EVENT_PREFIX + 'dragover';\nexport const onDragstart = EVENT_PREFIX + 'dragstart';\nexport const onDrop = EVENT_PREFIX + 'drop';\nexport const onDurationchange = EVENT_PREFIX + 'durationchange';\nexport const onEmptied = EVENT_PREFIX + 'emptied';\nexport const onEnded = EVENT_PREFIX + 'ended';\nexport const onFormdata = EVENT_PREFIX + 'formdata';\nexport const onInput = EVENT_PREFIX + 'input';\nexport const onInvalid = EVENT_PREFIX + 'invalid';\nexport const onKeydown = EVENT_PREFIX + 'keydown';\nexport const onKeypress = EVENT_PREFIX + 'keypress';\nexport const onKeyup = EVENT_PREFIX + 'keyup';\nexport const onLoad = EVENT_PREFIX + 'load';\nexport const onLoadeddata = EVENT_PREFIX + 'loadeddata';\nexport const onLoadedmetadata = EVENT_PREFIX + 'loadedmetadata';\nexport const onLoadstart = EVENT_PREFIX + 'loadstart';\nexport const onMousedown = EVENT_PREFIX + 'mousedown';\nexport const onMouseenter = EVENT_PREFIX + 'mouseenter';\nexport const onMouseleave = EVENT_PREFIX + 'mouseleave';\nexport const onMousemove = EVENT_PREFIX + 'mousemove';\nexport const onMouseout = EVENT_PREFIX + 'mouseout';\nexport const onMouseover = EVENT_PREFIX + 'mouseover';\nexport const onMouseup = EVENT_PREFIX + 'mouseup';\nexport const onWheel = EVENT_PREFIX + 'wheel';\nexport const onPaste = EVENT_PREFIX + 'paste';\nexport const onPause = EVENT_PREFIX + 'pause';\nexport const onPlay = EVENT_PREFIX + 'play';\nexport const onPlaying = EVENT_PREFIX + 'playing';\nexport const onProgress = EVENT_PREFIX + 'progress';\nexport const onRatechange = EVENT_PREFIX + 'ratechange';\nexport const onReset = EVENT_PREFIX + 'reset';\nexport const onResize = EVENT_PREFIX + 'resize';\nexport const onScroll = EVENT_PREFIX + 'scroll';\nexport const onScrollend = EVENT_PREFIX + 'scrollend';\nexport const onSecuritypolicyviolation = EVENT_PREFIX + 'securitypolicyviolation';\nexport const onSeeked = EVENT_PREFIX + 'seeked';\nexport const onSeeking = EVENT_PREFIX + 'seeking';\nexport const onSelect = EVENT_PREFIX + 'select';\nexport const onSlotchange = EVENT_PREFIX + 'slotchange';\nexport const onStalled = EVENT_PREFIX + 'stalled';\nexport const onSubmit = EVENT_PREFIX + 'submit';\nexport const onSuspend = EVENT_PREFIX + 'suspend';\nexport const onTimeupdate = EVENT_PREFIX + 'timeupdate';\nexport const onVolumechange = EVENT_PREFIX + 'volumechange';\nexport const onWaiting = EVENT_PREFIX + 'waiting';\nexport const onSelectstart = EVENT_PREFIX + 'selectstart';\nexport const onSelectionchange = EVENT_PREFIX + 'selectionchange';\nexport const onToggle = EVENT_PREFIX + 'toggle';\nexport const onPointercancel = EVENT_PREFIX + 'pointercancel';\nexport const onPointerdown = EVENT_PREFIX + 'pointerdown';\nexport const onPointerup = EVENT_PREFIX + 'pointerup';\nexport const onPointermove = EVENT_PREFIX + 'pointermove';\nexport const onPointerout = EVENT_PREFIX + 'pointerout';\nexport const onPointerover = EVENT_PREFIX + 'pointerover';\nexport const onPointerenter = EVENT_PREFIX + 'pointerenter';\nexport const onPointerleave = EVENT_PREFIX + 'pointerleave';\nexport const onGotpointercapture = EVENT_PREFIX + 'gotpointercapture';\nexport const onLostpointercapture = EVENT_PREFIX + 'lostpointercapture';\nexport const onMozfullscreenchange = EVENT_PREFIX + 'mozfullscreenchange';\nexport const onMozfullscreenerror = EVENT_PREFIX + 'mozfullscreenerror';\nexport const onAnimationcancel = EVENT_PREFIX + 'animationcancel';\nexport const onAnimationend = EVENT_PREFIX + 'animationend';\nexport const onAnimationiteration = EVENT_PREFIX + 'animationiteration';\nexport const onAnimationstart = EVENT_PREFIX + 'animationstart';\nexport const onTransitioncancel = EVENT_PREFIX + 'transitioncancel';\nexport const onTransitionend = EVENT_PREFIX + 'transitionend';\nexport const onTransitionrun = EVENT_PREFIX + 'transitionrun';\nexport const onTransitionstart = EVENT_PREFIX + 'transitionstart';\nexport const onWebkitanimationend = EVENT_PREFIX + 'webkitanimationend';\nexport const onWebkitanimationiteration = EVENT_PREFIX + 'webkitanimationiteration';\nexport const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart';\nexport const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend';\nexport const onError = EVENT_PREFIX + 'error';\n\nconst eventAttrs = new Signal.State([\n\tonAbort,\n\tonBlur,\n\tonFocus,\n\tonCancel,\n\tonAuxclick,\n\tonBeforeinput,\n\tonBeforetoggle,\n\tonCanplay,\n\tonCanplaythrough,\n\tonChange,\n\tonClick,\n\tonClose,\n\tonCommand,\n\tonContextmenu,\n\tonCopy,\n\tonCuechange,\n\tonCut,\n\tonDblclick,\n\tonDrag,\n\tonDragend,\n\tonDragenter,\n\tonDragexit,\n\tonDragleave,\n\tonDragover,\n\tonDragstart,\n\tonDrop,\n\tonDurationchange,\n\tonEmptied,\n\tonEnded,\n\tonFormdata,\n\tonInput,\n\tonInvalid,\n\tonKeydown,\n\tonKeypress,\n\tonKeyup,\n\tonLoad,\n\tonLoadeddata,\n\tonLoadedmetadata,\n\tonLoadstart,\n\tonMousedown,\n\tonMouseenter,\n\tonMouseleave,\n\tonMousemove,\n\tonMouseout,\n\tonMouseover,\n\tonMouseup,\n\tonWheel,\n\tonPaste,\n\tonPause,\n\tonPlay,\n\tonPlaying,\n\tonProgress,\n\tonRatechange,\n\tonReset,\n\tonResize,\n\tonScroll,\n\tonScrollend,\n\tonSecuritypolicyviolation,\n\tonSeeked,\n\tonSeeking,\n\tonSelect,\n\tonSlotchange,\n\tonStalled,\n\tonSubmit,\n\tonSuspend,\n\tonTimeupdate,\n\tonVolumechange,\n\tonWaiting,\n\tonSelectstart,\n\tonSelectionchange,\n\tonToggle,\n\tonPointercancel,\n\tonPointerdown,\n\tonPointerup,\n\tonPointermove,\n\tonPointerout,\n\tonPointerover,\n\tonPointerenter,\n\tonPointerleave,\n\tonGotpointercapture,\n\tonLostpointercapture,\n\tonMozfullscreenchange,\n\tonMozfullscreenerror,\n\tonAnimationcancel,\n\tonAnimationend,\n\tonAnimationiteration,\n\tonAnimationstart,\n\tonTransitioncancel,\n\tonTransitionend,\n\tonTransitionrun,\n\tonTransitionstart,\n\tonWebkitanimationend,\n\tonWebkitanimationiteration,\n\tonWebkitanimationstart,\n\tonWebkittransitionend,\n\tonError,\n]);\n\nconst selector = new Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(', '));\n\nconst attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;\n\nexport const eventToProp = event => EVENT_PREFIX + event;\n\nexport const hasEventAttribute = event => eventAttrs.get().includes(EVENT_PREFIX + event);\n\nconst isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX);\n\nfunction _addListeners(el, { signal, attrFilter = EVENTS } = {}) {\n\tconst dataset = el.dataset;\n\n\tfor (const [attr, val] of Object.entries(dataset).filter(isEventDataAttr)) {\n\t\ttry {\n\t\t\tconst event = 'on' + attr.substring(DATA_PREFIX_LENGTH);\n\n\t\t\tif (attrFilter.hasOwnProperty(event) && hasCallback(val)) {\n\t\t\t\tel.addEventListener(event.substring(2).toLowerCase(), getCallback(val), {\n\t\t\t\t\tpassive: dataset.hasOwnProperty('aegisEventPassive'),\n\t\t\t\t\tcapture: dataset.hasOwnProperty('aegisEventCapture'),\n\t\t\t\t\tonce: dataset.hasOwnProperty('aegisEventOnce'),\n\t\t\t\t\tsignal: dataset.hasOwnProperty('aegisEventSignal') ? getSignal(dataset.aegisEventSignal) : signal,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch(err) {\n\t\t\treportError(err);\n\t\t}\n\t}\n}\n\nconst observer = new MutationObserver(records => {\n\trecords.forEach(record => {\n\t\tswitch(record.type) {\n\t\t\tcase 'childList':\n\t\t\t\t[...record.addedNodes]\n\t\t\t\t\t.filter(node => node.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t.forEach(node => attachListeners(node));\n\t\t\t\tbreak;\n\n\t\t\tcase 'attributes':\n\t\t\t\tif (typeof record.oldValue === 'string' && hasCallback(record.oldValue)) {\n\t\t\t\t\trecord.target.removeEventListener(\n\t\t\t\t\t\trecord.attributeName.substring(EVENT_PREFIX_LENGTH),\n\t\t\t\t\t\tgetCallback(record.oldValue), {\n\t\t\t\t\t\t\tonce: record.target.hasAttribute(once),\n\t\t\t\t\t\t\tcapture: record.target.hasAttribute(capture),\n\t\t\t\t\t\t\tpassive: record.target.hasAttribute(passive),\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trecord.target.hasAttribute(record.attributeName)\n\t\t\t\t\t&& hasCallback(record.target.getAttribute(record.attributeName))\n\t\t\t\t) {\n\t\t\t\t\trecord.target.addEventListener(\n\t\t\t\t\t\trecord.attributeName.substring(EVENT_PREFIX_LENGTH),\n\t\t\t\t\t\tgetCallback(record.target.getAttribute(record.attributeName)), {\n\t\t\t\t\t\t\tonce: record.target.hasAttribute(once),\n\t\t\t\t\t\t\tcapture: record.target.hasAttribute(capture),\n\t\t\t\t\t\t\tpassive: record.target.hasAttribute(passive),\n\t\t\t\t\t\t\tsignal: record.target.hasAttribute(signal) ? getSignal(record.target.getAttribute(signal)) : undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n});\n\nexport const EVENTS = {\n\tonAbort,\n\tonBlur,\n\tonFocus,\n\tonCancel,\n\tonAuxclick,\n\tonBeforeinput,\n\tonBeforetoggle,\n\tonCanplay,\n\tonCanplaythrough,\n\tonChange,\n\tonClick,\n\tonClose,\n\tonCommand,\n\tonContextmenu,\n\tonCopy,\n\tonCuechange,\n\tonCut,\n\tonDblclick,\n\tonDrag,\n\tonDragend,\n\tonDragenter,\n\tonDragexit,\n\tonDragleave,\n\tonDragover,\n\tonDragstart,\n\tonDrop,\n\tonDurationchange,\n\tonEmptied,\n\tonEnded,\n\tonFormdata,\n\tonInput,\n\tonInvalid,\n\tonKeydown,\n\tonKeypress,\n\tonKeyup,\n\tonLoad,\n\tonLoadeddata,\n\tonLoadedmetadata,\n\tonLoadstart,\n\tonMousedown,\n\tonMouseenter,\n\tonMouseleave,\n\tonMousemove,\n\tonMouseout,\n\tonMouseover,\n\tonMouseup,\n\tonWheel,\n\tonPaste,\n\tonPause,\n\tonPlay,\n\tonPlaying,\n\tonProgress,\n\tonRatechange,\n\tonReset,\n\tonResize,\n\tonScroll,\n\tonScrollend,\n\tonSecuritypolicyviolation,\n\tonSeeked,\n\tonSeeking,\n\tonSelect,\n\tonSlotchange,\n\tonStalled,\n\tonSubmit,\n\tonSuspend,\n\tonTimeupdate,\n\tonVolumechange,\n\tonWaiting,\n\tonSelectstart,\n\tonSelectionchange,\n\tonToggle,\n\tonPointercancel,\n\tonPointerdown,\n\tonPointerup,\n\tonPointermove,\n\tonPointerout,\n\tonPointerover,\n\tonPointerenter,\n\tonPointerleave,\n\tonGotpointercapture,\n\tonLostpointercapture,\n\tonMozfullscreenchange,\n\tonMozfullscreenerror,\n\tonAnimationcancel,\n\tonAnimationend,\n\tonAnimationiteration,\n\tonAnimationstart,\n\tonTransitioncancel,\n\tonTransitionend,\n\tonTransitionrun,\n\tonTransitionstart,\n\tonWebkitanimationend,\n\tonWebkitanimationiteration,\n\tonWebkitanimationstart,\n\tonWebkittransitionend,\n\tonError,\n\tonce,\n\tpassive,\n\tcapture,\n};\n\n/**\n * Register an attribute to observe for adding/removing event listeners\n *\n * @param {string} attr Name of the attribute to observe\n * @param {object} options\n * @param {boolean} [options.addListeners=false] Whether or not to automatically add listeners\n * @param {Document|Element} [options.base=document.body] Root node to observe\n * @param {AbortSignal} [options.signal] An abort signal to remove any listeners when aborted\n * @returns {string} The resulting `data-*` attribute name\n */\nexport function registerEventAttribute(attr, {\n\taddListeners = false,\n\tbase = document.body,\n\tsignal,\n} = {}) {\n\tconst fullAttr = EVENT_PREFIX + attr.toLowerCase();\n\tconst attrs = eventAttrs.get();\n\n\tif (! attrs.includes(fullAttr)) {\n\t\tconst sel = `[${CSS.escape(fullAttr)}]`;\n\t\tconst prop = attrToProp(fullAttr);\n\t\teventAttrs.set([...attrs, fullAttr]);\n\t\tEVENTS[prop] = fullAttr;\n\n\t\tif (addListeners) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst config = { attrFilter: { [prop]: sel }, signal };\n\t\t\t\t[base, ...base.querySelectorAll(sel)].forEach(el => _addListeners(el, config));\n\t\t\t});\n\t\t}\n\t}\n\n\treturn fullAttr;\n}\n\n/**\n * Registers an `AbortController` in the controller registry and returns the key for it\n *\n * @param {AbortController} controller\n * @returns {string} The randomly generated key with which the controller is registered\n * @throws {TypeError} If controller is not an `AbortController`\n * @throws {Error} Any `reason` if controller is already aborted\n */\nexport function registerController(controller) {\n\tif (! (controller instanceof AbortController)) {\n\t\tthrow new TypeError('Controller is not an `AbortSignal.');\n\t} else if (controller.signal.aborted) {\n\t\tthrow controller.signal.reason;\n\t} else if (typeof controller.signal[controllerSymbol] === 'string') {\n\t\treturn controller.signal[controllerSymbol];\n\t} else {\n\t\tconst key = 'aegis:event:controller:' + crypto.randomUUID();\n\t\tObject.defineProperty(controller.signal, controllerSymbol, { value: key, writable: false, enumerable: false });\n\t\tcontrollerRegistry.set(key, controller);\n\n\t\tcontroller.signal.addEventListener('abort', unregisterController, { once: true });\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Removes a controller from the registry\n *\n * @param {AbortController|AbortSignal|string} key The registed key or the controller or signal it corresponds to\n * @returns {boolean} Whether or not the controller was successfully unregistered\n */\nexport function unregisterController(key) {\n\tif (key instanceof AbortController) {\n\t\treturn controllerRegistry.delete(key.signal[controllerSymbol]);\n\t} else if (key instanceof AbortSignal) {\n\t\treturn controllerRegistry.delete(key[controllerSymbol]);\n\t} else {\n\t\treturn controllerRegistry.delete(key);\n\t}\n}\n\n/**\n * Creates and registers an `AbortController` in the controller registry and returns the key for it\n *\n * @param {object} options\n * @param {AbortSignal} [options.signal] An optional `AbortSignal` to externally abort the controller with\n * @returns {string} The randomly generated key with which the controller is registered\n */\nexport function createController({ signal } = {}) {\n\tconst controller = new AbortController();\n\n\tif (signal instanceof AbortSignal) {\n\t\tsignal.addEventListener('abort', ({ target }) => controller.abort(target.reason), { signal: controller.signal});\n\t}\n\n\treturn registerController(controller);\n}\n\n/**\n * Get a registetd controller from the registry\n *\n * @param {string} key Generated key with which the controller was registered\n * @returns {AbortController|void} Any registered controller, if any\n */\nexport const getController = key => controllerRegistry.get(key);\n\nexport function abortController(key, reason) {\n\tconst controller = getController(key);\n\n\tif (! (controller instanceof AbortController)) {\n\t\treturn false;\n\t} else if (typeof reason === 'string') {\n\t\tcontroller.abort(new Error(reason));\n\t\treturn true;\n\t} else {\n\t\tcontroller.abort(reason);\n\t\treturn true;\n\t}\n}\n\n/**\n * Register an `AbortSignal` to be used in declarative HTML as a value for `data-aegis-event-signal`\n *\n * @param {AbortSignal} signal The signal to register\n * @returns {string} The registered key\n * @throws {TypeError} Thrown if not an `AbortSignal`\n */\nexport function registerSignal(signal) {\n\tif (! (signal instanceof AbortSignal)) {\n\t\tthrow new TypeError('Signal must be an `AbortSignal`.');\n\t} else if (typeof signal[signalSymbol] === 'string') {\n\t\treturn signal[signalSymbol];\n\t} else {\n\t\tconst key = 'aegis:event:signal:' + crypto.randomUUID();\n\t\tObject.defineProperty(signal, signalSymbol, { value: key, writable: false, enumerable: false });\n\t\tsignalRegistry.set(key, signal);\n\t\tsignal.addEventListener('abort', ({ target }) => unregisterSignal(target[signalSymbol]), { once: true });\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Gets and `AbortSignal` from the registry\n *\n * @param {string} key The registered key for the signal\n * @returns {AbortSignal|void} The corresponding `AbortSignal`, if any\n */\nexport const getSignal = key => signalRegistry.get(key);\n\n/**\n * Removes an `AbortSignal` from the registry\n *\n * @param {AbortSignal|string} signal An `AbortSignal` or the registered key for one\n * @returns {boolean} Whether or not the signal was sucessfully unregistered\n * @throws {TypeError} Throws if `signal` is not an `AbortSignal` or the key for a registered signal\n */\nexport function unregisterSignal(signal) {\n\tif (signal instanceof AbortSignal) {\n\t\treturn signalRegistry.delete(signal[signalSymbol]);\n\t} else if (typeof signal === 'string') {\n\t\treturn signalRegistry.delete(signal);\n\t} else {\n\t\tthrow new TypeError('Signal must be an `AbortSignal` or registered key/attribute.');\n\t}\n}\n\n/**\n * Add listeners to an element and its children, matching a generated query based on registered attributes\n *\n * @param {Element|Document} target Root node to add listeners from\n * @param {object} options\n * @param {AbortSignal} [options.signal] Optional signal to remove event listeners\n * @returns {Element|Document} Returns the passed target node\n */\nexport function attachListeners(target, { signal } = {}) {\n\tconst nodes = target instanceof Element && target.matches(selector.get())\n\t\t? [target, ...target.querySelectorAll(selector.get())]\n\t\t: target.querySelectorAll(selector.get());\n\n\tnodes.forEach(el => _addListeners(el, { signal }));\n\n\treturn target;\n}\n\n/**\n * Add a node to the `MutationObserver` to observe attributes and add/remove event listeners\n *\n * @param {Document|Element} root Element to observe attributes on\n */\nexport function observeEvents(root = document) {\n\tattachListeners(root);\n\n\tobserver.observe(root, {\n\t\tsubtree: true,\n\t\tchildList:true,\n\t\tattributes: true,\n\t\tattributeOldValue: true,\n\t\tattributeFilter: eventAttrs.get(),\n\t});\n}\n\n/**\n * Disconnects the `MutationObserver`, disabling observing of all attribute changes\n *\n * @returns {void}\n */\nexport const disconnectEventsObserver = () => observer.disconnect();\n\n/**\n * Register a global error handler callback\n *\n * @param {Function} callback Callback to register as a global error handler\n * @param {EventInit} config Typical event listener config object\n */\nexport function setGlobalErrorHandler(callback, { capture, once, passive, signal } = {}) {\n\tif (callback instanceof Function) {\n\t\tglobalThis.addEventListener('error', callback, { capture, once, passive, signal });\n\t} else {\n\t\tthrow new TypeError('Callback is not a function.');\n\t}\n}\n","import {\n\teventToProp, capture as captureAttr, once as onceAttr, passive as passiveAttr, signal as signalAttr,\n\tregisterEventAttribute, hasEventAttribute, registerSignal, abortController,\n} from './events.js';\n\nlet _isRegistrationOpen = true;\n\nconst $$ = (selector, base = document) => base.querySelectorAll(selector);\n\nconst $ = (selector, base = document) => base.querySelector(selector);\n\nexport const requestFullscreen = { attr: 'data-request-fullscreen-selector', data: 'requestFullscreenSelector' };\nexport const toggleFullsceen = { attr: 'data-toggle-fullscreen-selector', data: 'toggleFullscreenSelector' };\n\nexport const FUNCS = {\n\tdebug: {\n\t\tlog: 'aegis:debug:log',\n\t\tinfo: 'aegis:debug:info',\n\t\twarn: 'aegis:debug:warn',\n\t\terror: 'aegis:debug:error',\n\t},\n\tnavigate: {\n\t\tback: 'aegis:navigate:back',\n\t\tforward: 'aegis:navigate:forward',\n\t\treload: 'aegis:navigate:reload',\n\t\tclose: 'aegis:navigate:close',\n\t\tlink: 'aegis:navigate:go',\n\t\tpopup: 'aegis:navigate:popup',\n\t},\n\tui: {\n\t\tcommand: 'aegis:ui:command',\n\t\tprint: 'aegis:ui:print',\n\t\tremove: 'aegis:ui:remove',\n\t\thide: 'aegis:ui:hide',\n\t\tunhide: 'aegis:ui:unhide',\n\t\tshowModal: 'aegis:ui:showModal',\n\t\tcloseModal: 'aegis:ui:closeModal',\n\t\tshowPopover: 'aegis:ui:showPopover',\n\t\thidePopover: 'aegis:ui:hidePopover',\n\t\ttogglePopover: 'aegis:ui:togglePopover',\n\t\tenable: 'aegis:ui:enable',\n\t\tdisable: 'aegis:ui:disable',\n\t\tscrollTo: 'aegis:ui:scrollTo',\n\t\tprevent: 'aegis:ui:prevent',\n\t\trevokeObjectURL: 'aegis:ui:revokeObjectURL',\n\t\tcancelAnimationFrame: 'aegis:ui:cancelAnimationFrame',\n\t\trequestFullscreen: 'aegis:ui:requestFullscreen',\n\t\ttoggleFullscreen: 'aegis:ui:toggleFullsceen',\n\t\texitFullsceen: 'aegis:ui:exitFullscreen',\n\t\topen: 'aegis:ui:open',\n\t\tclose: 'aegis:ui:close',\n\t\tabortController: 'aegis:ui:controller:abort',\n\t},\n};\n\n/**\n * @type {Map<string, function>}\n */\nconst registry = new Map([\n\t[FUNCS.debug.log, console.log],\n\t[FUNCS.debug.warn, console.warn],\n\t[FUNCS.debug.error, console.error],\n\t[FUNCS.debug.info, console.info],\n\t[FUNCS.navigate.back, () => history.back()],\n\t[FUNCS.navigate.forward, () => history.forward()],\n\t[FUNCS.navigate.reload, () => history.go(0)],\n\t[FUNCS.navigate.close, () => globalThis.close()],\n\t[FUNCS.navigate.link, event => {\n\t\tif (event.isTrusted) {\n\t\t\tevent.preventDefault();\n\t\t\tlocation.href = event.currentTarget.dataset.url;\n\t\t}\n\t}],\n\t[FUNCS.navigate.popup, event => {\n\t\tif (event.isTrusted) {\n\t\t\tevent.preventDefault();\n\t\t\tglobalThis.open(event.currentTarget.dataset.url);\n\t\t}\n\t}],\n\t[FUNCS.ui.hide, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.hideSelector).forEach(el => el.hidden = true);\n\t}],\n\t[FUNCS.ui.unhide, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.unhideSelector).forEach(el => el.hidden = false);\n\t}],\n\t[FUNCS.ui.disable, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.disableSelector).forEach(el => el.disabled = true);\n\t}],\n\t[FUNCS.ui.enable, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.enableSelector).forEach(el => el.disabled = false);\n\t}],\n\t[FUNCS.ui.remove, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.removeSelector).forEach(el => el.remove());\n\t}],\n\t[FUNCS.ui.scrollTo, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.scrollToSelector);\n\n\t\tif (target instanceof Element) {\n\t\t\ttarget.scrollIntoView({\n\t\t\t\tbehavior: matchMedia('(prefers-reduced-motion: reduce)').matches\n\t\t\t\t\t? 'instant'\n\t\t\t\t\t: 'smooth',\n\t\t\t});\n\t\t}\n\t}],\n\t[FUNCS.ui.revokeObjectURL, ({ currentTarget }) => URL.revokeObjectURL(currentTarget.src)],\n\t[FUNCS.ui.cancelAnimationFrame, ({ currentTarget }) => cancelAnimationFrame(parseInt(currentTarget.dataset.animationFrame))],\n\t[FUNCS.ui.clearInterval, ({ currentTarget }) => clearInterval(parseInt(currentTarget.dataset.clearInterval))],\n\t[FUNCS.ui.clearTimeout, ({ currentTarget }) => clearTimeout(parseInt(currentTarget.dataset.timeout))],\n\t[FUNCS.ui.abortController, ({ currentTarget }) => abortController(currentTarget.dataset.aegisEventController, currentTarget.dataset.aegisControllerReason)],\n\t[FUNCS.ui.open, ({ currentTarget }) => document.querySelector(currentTarget.dataset.openSelector).open = true],\n\t[FUNCS.ui.close, ({ currentTarget }) => document.querySelector(currentTarget.dataset.closeSelector).open = false],\n\t[FUNCS.ui.showModal, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.showModalSelector);\n\n\t\tif (target instanceof HTMLDialogElement) {\n\t\t\ttarget.showModal();\n\t\t}\n\t}],\n\t[FUNCS.ui.closeModal, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.closeModalSelector);\n\n\t\tif (target instanceof HTMLDialogElement) {\n\t\t\ttarget.close();\n\t\t}\n\t}],\n\t[FUNCS.ui.showPopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.showPopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.showPopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.hidePopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.hidePopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.hidePopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.togglePopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.togglePopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.togglePopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.print, () => globalThis.print()],\n\t[FUNCS.ui.prevent, event => event.preventDefault()],\n\t[FUNCS.ui.requestFullscreen, ({ currentTarget}) => {\n\t\tif (currentTarget.dataset.hasOwnProperty(requestFullscreen.data)) {\n\t\t\tdocument.getElementById(currentTarget.dataset[requestFullscreen.data]).requestFullscreen();\n\t\t} else {\n\t\t\tcurrentTarget.requestFullscreen();\n\t\t}\n\t}],\n\t[FUNCS.ui.toggleFullscreen, ({ currentTarget }) => {\n\t\tconst target = currentTarget.dataset.hasOwnProperty(toggleFullsceen.data)\n\t\t\t? document.getElementById(currentTarget.dataset[toggleFullsceen.data])\n\t\t\t: currentTarget;\n\n\t\tif (target.isSameNode(document.fullscreenElement)) {\n\t\t\tdocument.exitFullscreen();\n\t\t} else {\n\t\t\ttarget.requestFullscreen();\n\t\t}\n\t}],\n\t[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],\n]);\n\nexport class CallbackRegistryKey extends String {\n\t[Symbol.dispose]() {\n\t\tregistry.delete(this.toString());\n\t}\n}\n\n/**\n * Check if callback registry is open\n *\n * @returns {boolean} Whether or not callback registry is open\n */\nexport const isRegistrationOpen = () => _isRegistrationOpen;\n\n/**\n * Close callback registry\n *\n * @returns {boolean} Whether or not the callback was succesfully removed\n */\nexport const closeRegistration = () => _isRegistrationOpen = false;\n\n/**\n * Get an array of registered callbacks\n *\n * @returns {Array} A frozen array listing keys to all registered callbacks\n */\nexport const listCallbacks = () => Object.freeze(Array.from(registry.keys()));\n\n/**\n * Check if a callback is registered\n *\n * @param {CallbackRegistryKey|string} name The name/key to check for in callback registry\n * @returns {boolean} Whether or not a callback is registered\n */\nexport const hasCallback = name => registry.has(name?.toString());\n\n/**\n * Get a callback from the registry by name/key\n *\n * @param {CallbackRegistryKey|string} name The name/key of the callback to get\n * @returns {Function|undefined} The corresponding function registered under that name/key\n */\nexport const getCallback = name => registry.get(name?.toString());\n\n/**\n *\t Remove a callback from the registry\n *\n * @param {CallbackRegistryKey|string} name The name/key of the callback to get\n * @returns {boolean} Whether or not the callback was successfully unregisterd\n */\nexport const unregisterCallback = name => _isRegistrationOpen && registry.delete(name?.toString());\n\n/**\n * Remove all callbacks from the registry\n *\n * @returns {void}\n */\nexport const clearRegistry = () => registry.clear();\n\n/**\n * Create a registered callback with a randomly generated name\n *\n * @param {Function} callback Callback function to register\n * @param {object} [config]\n * @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.\n * @returns {string} The automatically generated key/name of the registered callback\n */\nexport const createCallback = (callback, { stack } = {}) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback, { stack });\n\n/**\n * Call a callback fromt the registry by name/key\n *\n * @param {CallbackRegistryKey|string} name The name/key of the registered function\n * @param {...any} args Any arguments to pass along to the function\n * @returns {any} Whatever the return value of the function is\n * @throws {Error} Throws if callback is not found or any error resulting from calling the function\n */\nexport function callCallback(name, ...args) {\n\tif (registry.has(name?.toString())) {\n\t\treturn registry.get(name?.toString()).apply(this || globalThis, args);\n\t} else {\n\t\tthrow new Error(`No ${name} function registered.`);\n\t}\n}\n\n/**\n * Register a named callback in registry\n *\n * @param {CallbackRegistryKey|string} name The name/key to register the callback under\n * @param {Function} callback The callback value to register\n * @param {object} config\n * @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.\n * @returns {string} The registered name/key\n */\nexport function registerCallback(name, callback, { stack } = {}) {\n\tif (typeof name === 'string') {\n\t\treturn registerCallback(new CallbackRegistryKey(name), callback, { stack });\n\t}else if (! (name instanceof CallbackRegistryKey)) {\n\t\tthrow new TypeError('Callback name must be a disposable string/CallbackRegistryKey.');\n\t} if (! (callback instanceof Function)) {\n\t\tthrow new TypeError('Callback must be a function.');\n\t} else if (! _isRegistrationOpen) {\n\t\tthrow new TypeError('Cannot register new callbacks because registry is closed.');\n\t} else if (registry.has(name?.toString())) {\n\t\tthrow new Error(`Handler \"${name}\" is already registered.`);\n\t} else if (stack instanceof DisposableStack || stack instanceof AsyncDisposableStack) {\n\t\tconst key = stack.use(new CallbackRegistryKey(name));\n\t\tregistry.set(key.toString(), callback);\n\n\t\treturn key;\n\t} else {\n\t\tconst key = new CallbackRegistryKey(name);\n\t\tregistry.set(key.toString(), callback);\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Get the host/root node of a given thing.\n *\n * @param {Event|Document|Element|ShadowRoot} target Source thing to search for host of\n * @returns {Document|Element|null} The host/root node, or null\n */\nexport function getHost(target) {\n\tif (target instanceof Event) {\n\t\treturn getHost(target.currentTarget);\n\t} else if (target instanceof Document) {\n\t\treturn target;\n\t} else if (target instanceof Element) {\n\t\treturn getHost(target.getRootNode());\n\t} else if (target instanceof ShadowRoot) {\n\t\treturn target.host;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nexport function on(event, callback, { capture = false, passive = false, once = false, signal, stack } = {}) {\n\tif (callback instanceof Function) {\n\t\treturn on(event, createCallback(callback, { stack }), { capture, passive, once, signal });\n\t} else if (! (callback instanceof String || typeof callback === 'string') || callback.length === 0) {\n\t\tthrow new TypeError('Callback must be a function or a registered callback string.');\n\t} else if (typeof event !== 'string' || event.length === 0) {\n\t\tthrow new TypeError('Event must be a non-empty string.');\n\t} else {\n\t\tif (! hasEventAttribute(event)) {\n\t\t\tregisterEventAttribute(event);\n\t\t}\n\n\t\tconst parts = [[eventToProp(event), callback]];\n\n\t\tif (capture) {\n\t\t\tparts.push([captureAttr, '']);\n\t\t}\n\n\t\tif (passive) {\n\t\t\tparts.push([passiveAttr, '']);\n\t\t}\n\n\t\tif (once) {\n\t\t\tparts.push([onceAttr, '']);\n\t\t}\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tparts.push([signalAttr, registerSignal(signal)]);\n\t\t} else if (typeof signal === 'string') {\n\t\t\tparts.push([signalAttr, signal]);\n\t\t}\n\n\t\treturn parts.map(([prop, val]) => `${prop}=\"${val}\"`).join(' ');\n\t}\n}\n"],"names":["PREFIX","EVENT_PREFIX","DATA_PREFIX","signalSymbol","Symbol","controllerSymbol","signalRegistry","Map","controllerRegistry","once","passive","capture","signal","controller","onAbort","onBlur","onFocus","onCancel","onAuxclick","onBeforeinput","onBeforetoggle","onCanplay","onCanplaythrough","onChange","onClick","onClose","onCommand","onContextmenu","onCopy","onCuechange","onCut","onDblclick","onDrag","onDragend","onDragenter","onDragexit","onDragleave","onDragover","onDragstart","onDrop","onDurationchange","onEmptied","onEnded","onFormdata","onInput","onInvalid","onKeydown","onKeypress","onKeyup","onLoad","onLoadeddata","onLoadedmetadata","onLoadstart","onMousedown","onMouseenter","onMouseleave","onMousemove","onMouseout","onMouseover","onMouseup","onWheel","onPaste","onPause","onPlay","onPlaying","onProgress","onRatechange","onReset","onResize","onScroll","onScrollend","onSecuritypolicyviolation","onSeeked","onSeeking","onSelect","onSlotchange","onStalled","onSubmit","onSuspend","onTimeupdate","onVolumechange","onWaiting","onSelectstart","onSelectionchange","onToggle","onPointercancel","onPointerdown","onPointerup","onPointermove","onPointerout","onPointerover","onPointerenter","onPointerleave","onGotpointercapture","onLostpointercapture","onMozfullscreenchange","onMozfullscreenerror","onAnimationcancel","onAnimationend","onAnimationiteration","onAnimationstart","onTransitioncancel","onTransitionend","onTransitionrun","onTransitionstart","onWebkitanimationend","onWebkitanimationiteration","onWebkitanimationstart","onWebkittransitionend","onError","eventAttrs","Signal","State","selector","Computed","get","map","attr","CSS","escape","join","eventToProp","event","hasEventAttribute","includes","isEventDataAttr","name","startsWith","_addListeners","el","attrFilter","EVENTS","dataset","val","Object","entries","filter","substring","hasOwnProperty","hasCallback","addEventListener","toLowerCase","getCallback","getSignal","aegisEventSignal","err","reportError","observer","MutationObserver","records","forEach","record","type","addedNodes","node","nodeType","Node","ELEMENT_NODE","attachListeners","oldValue","target","removeEventListener","attributeName","hasAttribute","getAttribute","undefined","registerEventAttribute","addListeners","base","document","body","fullAttr","attrs","sel","prop","toUpperCase","EVENT_PREFIX_LENGTH","attrToProp","set","requestAnimationFrame","config","querySelectorAll","registerController","AbortController","aborted","reason","key","crypto","randomUUID","defineProperty","value","writable","enumerable","unregisterController","TypeError","delete","AbortSignal","createController","abort","getController","abortController","Error","registerSignal","unregisterSignal","Element","matches","observeEvents","root","observe","subtree","childList","attributes","attributeOldValue","attributeFilter","disconnectEventsObserver","disconnect","setGlobalErrorHandler","callback","Function","globalThis","_isRegistrationOpen","$$","$","querySelector","requestFullscreen","data","toggleFullsceen","FUNCS","debug","log","info","warn","error","navigate","back","forward","reload","close","link","popup","ui","command","print","remove","hide","unhide","showModal","closeModal","showPopover","hidePopover","togglePopover","enable","disable","scrollTo","prevent","revokeObjectURL","cancelAnimationFrame","toggleFullscreen","exitFullsceen","open","registry","console","history","go","isTrusted","preventDefault","location","href","currentTarget","url","hideSelector","hidden","unhideSelector","disableSelector","disabled","enableSelector","removeSelector","scrollToSelector","scrollIntoView","behavior","matchMedia","URL","src","parseInt","animationFrame","clearInterval","clearTimeout","timeout","aegisEventController","aegisControllerReason","openSelector","closeSelector","showModalSelector","HTMLDialogElement","closeModalSelector","showPopoverSelector","HTMLElement","hidePopoverSelector","togglePopoverSelector","getElementById","isSameNode","fullscreenElement","exitFullscreen","CallbackRegistryKey","String","dispose","this","toString","isRegistrationOpen","closeRegistration","listCallbacks","freeze","Array","from","keys","has","unregisterCallback","clearRegistry","clear","createCallback","stack","registerCallback","callCallback","args","apply","DisposableStack","AsyncDisposableStack","use","getHost","Event","Document","getRootNode","ShadowRoot","host","on","length","parts","push","captureAttr","passiveAttr","onceAttr","signalAttr"],"mappings":"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"}
|
package/callbacks.cjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var signals = require('@shgysk8zer0/signals');
|
|
4
|
+
|
|
3
5
|
const PREFIX = 'data-aegis-event-';
|
|
4
6
|
const EVENT_PREFIX = PREFIX + 'on-';
|
|
5
7
|
const EVENT_PREFIX_LENGTH = EVENT_PREFIX.length;
|
|
@@ -110,7 +112,7 @@ const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart';
|
|
|
110
112
|
const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend';
|
|
111
113
|
const onError = EVENT_PREFIX + 'error';
|
|
112
114
|
|
|
113
|
-
const eventAttrs = [
|
|
115
|
+
const eventAttrs = new signals.Signal.State([
|
|
114
116
|
onAbort,
|
|
115
117
|
onBlur,
|
|
116
118
|
onFocus,
|
|
@@ -207,15 +209,15 @@ const eventAttrs = [
|
|
|
207
209
|
onWebkitanimationstart,
|
|
208
210
|
onWebkittransitionend,
|
|
209
211
|
onError,
|
|
210
|
-
];
|
|
212
|
+
]);
|
|
211
213
|
|
|
212
|
-
|
|
214
|
+
const selector = new signals.Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(', '));
|
|
213
215
|
|
|
214
216
|
const attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;
|
|
215
217
|
|
|
216
218
|
const eventToProp = event => EVENT_PREFIX + event;
|
|
217
219
|
|
|
218
|
-
const hasEventAttribute = event => eventAttrs.includes(EVENT_PREFIX + event);
|
|
220
|
+
const hasEventAttribute = event => eventAttrs.get().includes(EVENT_PREFIX + event);
|
|
219
221
|
|
|
220
222
|
const isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX);
|
|
221
223
|
|
|
@@ -398,13 +400,13 @@ function registerEventAttribute(attr, {
|
|
|
398
400
|
signal,
|
|
399
401
|
} = {}) {
|
|
400
402
|
const fullAttr = EVENT_PREFIX + attr.toLowerCase();
|
|
403
|
+
const attrs = eventAttrs.get();
|
|
401
404
|
|
|
402
|
-
if (!
|
|
405
|
+
if (! attrs.includes(fullAttr)) {
|
|
403
406
|
const sel = `[${CSS.escape(fullAttr)}]`;
|
|
404
407
|
const prop = attrToProp(fullAttr);
|
|
405
|
-
eventAttrs.
|
|
408
|
+
eventAttrs.set([...attrs, fullAttr]);
|
|
406
409
|
EVENTS[prop] = fullAttr;
|
|
407
|
-
selector += `, ${sel}`;
|
|
408
410
|
|
|
409
411
|
if (addListeners) {
|
|
410
412
|
requestAnimationFrame(() => {
|
|
@@ -495,9 +497,9 @@ function unregisterSignal(signal) {
|
|
|
495
497
|
* @returns {Element|Document} Returns the passed target node
|
|
496
498
|
*/
|
|
497
499
|
function attachListeners(target, { signal } = {}) {
|
|
498
|
-
const nodes = target instanceof Element && target.matches(selector)
|
|
499
|
-
? [target, ...target.querySelectorAll(selector)]
|
|
500
|
-
: target.querySelectorAll(selector);
|
|
500
|
+
const nodes = target instanceof Element && target.matches(selector.get())
|
|
501
|
+
? [target, ...target.querySelectorAll(selector.get())]
|
|
502
|
+
: target.querySelectorAll(selector.get());
|
|
501
503
|
|
|
502
504
|
nodes.forEach(el => _addListeners(el, { signal }));
|
|
503
505
|
|
|
@@ -554,6 +556,9 @@ const FUNCS = {
|
|
|
554
556
|
},
|
|
555
557
|
};
|
|
556
558
|
|
|
559
|
+
/**
|
|
560
|
+
* @type {Map<string, function>}
|
|
561
|
+
*/
|
|
557
562
|
const registry = new Map([
|
|
558
563
|
[FUNCS.debug.log, console.log],
|
|
559
564
|
[FUNCS.debug.warn, console.warn],
|
|
@@ -666,6 +671,12 @@ const registry = new Map([
|
|
|
666
671
|
[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],
|
|
667
672
|
]);
|
|
668
673
|
|
|
674
|
+
class CallbackRegistryKey extends String {
|
|
675
|
+
[Symbol.dispose]() {
|
|
676
|
+
registry.delete(this.toString());
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
669
680
|
/**
|
|
670
681
|
* Check if callback registry is open
|
|
671
682
|
*
|
|
@@ -690,26 +701,26 @@ const listCallbacks = () => Object.freeze(Array.from(registry.keys()));
|
|
|
690
701
|
/**
|
|
691
702
|
* Check if a callback is registered
|
|
692
703
|
*
|
|
693
|
-
* @param {string} name The name/key to check for in callback registry
|
|
704
|
+
* @param {CallbackRegistryKey|string} name The name/key to check for in callback registry
|
|
694
705
|
* @returns {boolean} Whether or not a callback is registered
|
|
695
706
|
*/
|
|
696
|
-
const hasCallback = name => registry.has(name);
|
|
707
|
+
const hasCallback = name => registry.has(name?.toString());
|
|
697
708
|
|
|
698
709
|
/**
|
|
699
710
|
* Get a callback from the registry by name/key
|
|
700
711
|
*
|
|
701
|
-
* @param {string} name The name/key of the callback to get
|
|
712
|
+
* @param {CallbackRegistryKey|string} name The name/key of the callback to get
|
|
702
713
|
* @returns {Function|undefined} The corresponding function registered under that name/key
|
|
703
714
|
*/
|
|
704
|
-
const getCallback = name => registry.get(name);
|
|
715
|
+
const getCallback = name => registry.get(name?.toString());
|
|
705
716
|
|
|
706
717
|
/**
|
|
707
718
|
* Remove a callback from the registry
|
|
708
719
|
*
|
|
709
|
-
* @param {string} name The name/key of the callback to get
|
|
720
|
+
* @param {CallbackRegistryKey|string} name The name/key of the callback to get
|
|
710
721
|
* @returns {boolean} Whether or not the callback was successfully unregisterd
|
|
711
722
|
*/
|
|
712
|
-
const unregisterCallback = name => _isRegistrationOpen && registry.delete(name);
|
|
723
|
+
const unregisterCallback = name => _isRegistrationOpen && registry.delete(name?.toString());
|
|
713
724
|
|
|
714
725
|
/**
|
|
715
726
|
* Remove all callbacks from the registry
|
|
@@ -722,21 +733,23 @@ const clearRegistry = () => registry.clear();
|
|
|
722
733
|
* Create a registered callback with a randomly generated name
|
|
723
734
|
*
|
|
724
735
|
* @param {Function} callback Callback function to register
|
|
736
|
+
* @param {object} [config]
|
|
737
|
+
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
|
|
725
738
|
* @returns {string} The automatically generated key/name of the registered callback
|
|
726
739
|
*/
|
|
727
|
-
const createCallback = (callback) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback);
|
|
740
|
+
const createCallback = (callback, { stack } = {}) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback, { stack });
|
|
728
741
|
|
|
729
742
|
/**
|
|
730
743
|
* Call a callback fromt the registry by name/key
|
|
731
744
|
*
|
|
732
|
-
* @param {string} name The name/key of the registered function
|
|
745
|
+
* @param {CallbackRegistryKey|string} name The name/key of the registered function
|
|
733
746
|
* @param {...any} args Any arguments to pass along to the function
|
|
734
747
|
* @returns {any} Whatever the return value of the function is
|
|
735
748
|
* @throws {Error} Throws if callback is not found or any error resulting from calling the function
|
|
736
749
|
*/
|
|
737
750
|
function callCallback(name, ...args) {
|
|
738
|
-
if (registry.has(name)) {
|
|
739
|
-
return registry.get(name).apply(this || globalThis, args);
|
|
751
|
+
if (registry.has(name?.toString())) {
|
|
752
|
+
return registry.get(name?.toString()).apply(this || globalThis, args);
|
|
740
753
|
} else {
|
|
741
754
|
throw new Error(`No ${name} function registered.`);
|
|
742
755
|
}
|
|
@@ -745,22 +758,33 @@ function callCallback(name, ...args) {
|
|
|
745
758
|
/**
|
|
746
759
|
* Register a named callback in registry
|
|
747
760
|
*
|
|
748
|
-
* @param {string} name The name/key to register the callback under
|
|
761
|
+
* @param {CallbackRegistryKey|string} name The name/key to register the callback under
|
|
749
762
|
* @param {Function} callback The callback value to register
|
|
763
|
+
* @param {object} config
|
|
764
|
+
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
|
|
750
765
|
* @returns {string} The registered name/key
|
|
751
766
|
*/
|
|
752
|
-
function registerCallback(name, callback) {
|
|
753
|
-
if (typeof name
|
|
754
|
-
|
|
767
|
+
function registerCallback(name, callback, { stack } = {}) {
|
|
768
|
+
if (typeof name === 'string') {
|
|
769
|
+
return registerCallback(new CallbackRegistryKey(name), callback, { stack });
|
|
770
|
+
}else if (! (name instanceof CallbackRegistryKey)) {
|
|
771
|
+
throw new TypeError('Callback name must be a disposable string/CallbackRegistryKey.');
|
|
755
772
|
} if (! (callback instanceof Function)) {
|
|
756
773
|
throw new TypeError('Callback must be a function.');
|
|
757
774
|
} else if (! _isRegistrationOpen) {
|
|
758
775
|
throw new TypeError('Cannot register new callbacks because registry is closed.');
|
|
759
|
-
} else if (registry.has(name)) {
|
|
776
|
+
} else if (registry.has(name?.toString())) {
|
|
760
777
|
throw new Error(`Handler "${name}" is already registered.`);
|
|
778
|
+
} else if (stack instanceof DisposableStack || stack instanceof AsyncDisposableStack) {
|
|
779
|
+
const key = stack.use(new CallbackRegistryKey(name));
|
|
780
|
+
registry.set(key.toString(), callback);
|
|
781
|
+
|
|
782
|
+
return key;
|
|
761
783
|
} else {
|
|
762
|
-
|
|
763
|
-
|
|
784
|
+
const key = new CallbackRegistryKey(name);
|
|
785
|
+
registry.set(key.toString(), callback);
|
|
786
|
+
|
|
787
|
+
return key;
|
|
764
788
|
}
|
|
765
789
|
}
|
|
766
790
|
|
|
@@ -784,10 +808,10 @@ function getHost(target) {
|
|
|
784
808
|
}
|
|
785
809
|
}
|
|
786
810
|
|
|
787
|
-
function on(event, callback, { capture: capture$1 = false, passive: passive$1 = false, once: once$1 = false, signal: signal$1 } = {}) {
|
|
811
|
+
function on(event, callback, { capture: capture$1 = false, passive: passive$1 = false, once: once$1 = false, signal: signal$1, stack } = {}) {
|
|
788
812
|
if (callback instanceof Function) {
|
|
789
|
-
return on(event, createCallback(callback), { capture: capture$1, passive: passive$1, once: once$1, signal: signal$1 });
|
|
790
|
-
} else if (typeof callback
|
|
813
|
+
return on(event, createCallback(callback, { stack }), { capture: capture$1, passive: passive$1, once: once$1, signal: signal$1 });
|
|
814
|
+
} else if (! (callback instanceof String || typeof callback === 'string') || callback.length === 0) {
|
|
791
815
|
throw new TypeError('Callback must be a function or a registered callback string.');
|
|
792
816
|
} else if (typeof event !== 'string' || event.length === 0) {
|
|
793
817
|
throw new TypeError('Event must be a non-empty string.');
|
|
@@ -820,6 +844,7 @@ function on(event, callback, { capture: capture$1 = false, passive: passive$1 =
|
|
|
820
844
|
}
|
|
821
845
|
}
|
|
822
846
|
|
|
847
|
+
exports.CallbackRegistryKey = CallbackRegistryKey;
|
|
823
848
|
exports.FUNCS = FUNCS;
|
|
824
849
|
exports.callCallback = callCallback;
|
|
825
850
|
exports.clearRegistry = clearRegistry;
|
package/callbacks.js
CHANGED
|
@@ -53,6 +53,9 @@ export const FUNCS = {
|
|
|
53
53
|
},
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
+
/**
|
|
57
|
+
* @type {Map<string, function>}
|
|
58
|
+
*/
|
|
56
59
|
const registry = new Map([
|
|
57
60
|
[FUNCS.debug.log, console.log],
|
|
58
61
|
[FUNCS.debug.warn, console.warn],
|
|
@@ -165,6 +168,12 @@ const registry = new Map([
|
|
|
165
168
|
[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],
|
|
166
169
|
]);
|
|
167
170
|
|
|
171
|
+
export class CallbackRegistryKey extends String {
|
|
172
|
+
[Symbol.dispose]() {
|
|
173
|
+
registry.delete(this.toString());
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
168
177
|
/**
|
|
169
178
|
* Check if callback registry is open
|
|
170
179
|
*
|
|
@@ -189,26 +198,26 @@ export const listCallbacks = () => Object.freeze(Array.from(registry.keys()));
|
|
|
189
198
|
/**
|
|
190
199
|
* Check if a callback is registered
|
|
191
200
|
*
|
|
192
|
-
* @param {string} name The name/key to check for in callback registry
|
|
201
|
+
* @param {CallbackRegistryKey|string} name The name/key to check for in callback registry
|
|
193
202
|
* @returns {boolean} Whether or not a callback is registered
|
|
194
203
|
*/
|
|
195
|
-
export const hasCallback = name => registry.has(name);
|
|
204
|
+
export const hasCallback = name => registry.has(name?.toString());
|
|
196
205
|
|
|
197
206
|
/**
|
|
198
207
|
* Get a callback from the registry by name/key
|
|
199
208
|
*
|
|
200
|
-
* @param {string} name The name/key of the callback to get
|
|
209
|
+
* @param {CallbackRegistryKey|string} name The name/key of the callback to get
|
|
201
210
|
* @returns {Function|undefined} The corresponding function registered under that name/key
|
|
202
211
|
*/
|
|
203
|
-
export const getCallback = name => registry.get(name);
|
|
212
|
+
export const getCallback = name => registry.get(name?.toString());
|
|
204
213
|
|
|
205
214
|
/**
|
|
206
215
|
* Remove a callback from the registry
|
|
207
216
|
*
|
|
208
|
-
* @param {string} name The name/key of the callback to get
|
|
217
|
+
* @param {CallbackRegistryKey|string} name The name/key of the callback to get
|
|
209
218
|
* @returns {boolean} Whether or not the callback was successfully unregisterd
|
|
210
219
|
*/
|
|
211
|
-
export const unregisterCallback = name => _isRegistrationOpen && registry.delete(name);
|
|
220
|
+
export const unregisterCallback = name => _isRegistrationOpen && registry.delete(name?.toString());
|
|
212
221
|
|
|
213
222
|
/**
|
|
214
223
|
* Remove all callbacks from the registry
|
|
@@ -221,21 +230,23 @@ export const clearRegistry = () => registry.clear();
|
|
|
221
230
|
* Create a registered callback with a randomly generated name
|
|
222
231
|
*
|
|
223
232
|
* @param {Function} callback Callback function to register
|
|
233
|
+
* @param {object} [config]
|
|
234
|
+
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
|
|
224
235
|
* @returns {string} The automatically generated key/name of the registered callback
|
|
225
236
|
*/
|
|
226
|
-
export const createCallback = (callback) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback);
|
|
237
|
+
export const createCallback = (callback, { stack } = {}) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback, { stack });
|
|
227
238
|
|
|
228
239
|
/**
|
|
229
240
|
* Call a callback fromt the registry by name/key
|
|
230
241
|
*
|
|
231
|
-
* @param {string} name The name/key of the registered function
|
|
242
|
+
* @param {CallbackRegistryKey|string} name The name/key of the registered function
|
|
232
243
|
* @param {...any} args Any arguments to pass along to the function
|
|
233
244
|
* @returns {any} Whatever the return value of the function is
|
|
234
245
|
* @throws {Error} Throws if callback is not found or any error resulting from calling the function
|
|
235
246
|
*/
|
|
236
247
|
export function callCallback(name, ...args) {
|
|
237
|
-
if (registry.has(name)) {
|
|
238
|
-
return registry.get(name).apply(this || globalThis, args);
|
|
248
|
+
if (registry.has(name?.toString())) {
|
|
249
|
+
return registry.get(name?.toString()).apply(this || globalThis, args);
|
|
239
250
|
} else {
|
|
240
251
|
throw new Error(`No ${name} function registered.`);
|
|
241
252
|
}
|
|
@@ -244,22 +255,33 @@ export function callCallback(name, ...args) {
|
|
|
244
255
|
/**
|
|
245
256
|
* Register a named callback in registry
|
|
246
257
|
*
|
|
247
|
-
* @param {string} name The name/key to register the callback under
|
|
258
|
+
* @param {CallbackRegistryKey|string} name The name/key to register the callback under
|
|
248
259
|
* @param {Function} callback The callback value to register
|
|
260
|
+
* @param {object} config
|
|
261
|
+
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
|
|
249
262
|
* @returns {string} The registered name/key
|
|
250
263
|
*/
|
|
251
|
-
export function registerCallback(name, callback) {
|
|
252
|
-
if (typeof name
|
|
253
|
-
|
|
264
|
+
export function registerCallback(name, callback, { stack } = {}) {
|
|
265
|
+
if (typeof name === 'string') {
|
|
266
|
+
return registerCallback(new CallbackRegistryKey(name), callback, { stack });
|
|
267
|
+
}else if (! (name instanceof CallbackRegistryKey)) {
|
|
268
|
+
throw new TypeError('Callback name must be a disposable string/CallbackRegistryKey.');
|
|
254
269
|
} if (! (callback instanceof Function)) {
|
|
255
270
|
throw new TypeError('Callback must be a function.');
|
|
256
271
|
} else if (! _isRegistrationOpen) {
|
|
257
272
|
throw new TypeError('Cannot register new callbacks because registry is closed.');
|
|
258
|
-
} else if (registry.has(name)) {
|
|
273
|
+
} else if (registry.has(name?.toString())) {
|
|
259
274
|
throw new Error(`Handler "${name}" is already registered.`);
|
|
275
|
+
} else if (stack instanceof DisposableStack || stack instanceof AsyncDisposableStack) {
|
|
276
|
+
const key = stack.use(new CallbackRegistryKey(name));
|
|
277
|
+
registry.set(key.toString(), callback);
|
|
278
|
+
|
|
279
|
+
return key;
|
|
260
280
|
} else {
|
|
261
|
-
|
|
262
|
-
|
|
281
|
+
const key = new CallbackRegistryKey(name);
|
|
282
|
+
registry.set(key.toString(), callback);
|
|
283
|
+
|
|
284
|
+
return key;
|
|
263
285
|
}
|
|
264
286
|
}
|
|
265
287
|
|
|
@@ -283,10 +305,10 @@ export function getHost(target) {
|
|
|
283
305
|
}
|
|
284
306
|
}
|
|
285
307
|
|
|
286
|
-
export function on(event, callback, { capture = false, passive = false, once = false, signal } = {}) {
|
|
308
|
+
export function on(event, callback, { capture = false, passive = false, once = false, signal, stack } = {}) {
|
|
287
309
|
if (callback instanceof Function) {
|
|
288
|
-
return on(event, createCallback(callback), { capture, passive, once, signal });
|
|
289
|
-
} else if (typeof callback
|
|
310
|
+
return on(event, createCallback(callback, { stack }), { capture, passive, once, signal });
|
|
311
|
+
} else if (! (callback instanceof String || typeof callback === 'string') || callback.length === 0) {
|
|
290
312
|
throw new TypeError('Callback must be a function or a registered callback string.');
|
|
291
313
|
} else if (typeof event !== 'string' || event.length === 0) {
|
|
292
314
|
throw new TypeError('Event must be a non-empty string.');
|
package/events.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { hasCallback, getCallback } from './callbacks.js';
|
|
2
|
+
import { Signal } from '@shgysk8zer0/signals';
|
|
2
3
|
|
|
3
4
|
const PREFIX = 'data-aegis-event-';
|
|
4
5
|
const EVENT_PREFIX = PREFIX + 'on-';
|
|
@@ -112,7 +113,7 @@ export const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart';
|
|
|
112
113
|
export const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend';
|
|
113
114
|
export const onError = EVENT_PREFIX + 'error';
|
|
114
115
|
|
|
115
|
-
|
|
116
|
+
const eventAttrs = new Signal.State([
|
|
116
117
|
onAbort,
|
|
117
118
|
onBlur,
|
|
118
119
|
onFocus,
|
|
@@ -209,15 +210,15 @@ export const eventAttrs = [
|
|
|
209
210
|
onWebkitanimationstart,
|
|
210
211
|
onWebkittransitionend,
|
|
211
212
|
onError,
|
|
212
|
-
];
|
|
213
|
+
]);
|
|
213
214
|
|
|
214
|
-
|
|
215
|
+
const selector = new Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(', '));
|
|
215
216
|
|
|
216
217
|
const attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;
|
|
217
218
|
|
|
218
219
|
export const eventToProp = event => EVENT_PREFIX + event;
|
|
219
220
|
|
|
220
|
-
export const hasEventAttribute = event => eventAttrs.includes(EVENT_PREFIX + event);
|
|
221
|
+
export const hasEventAttribute = event => eventAttrs.get().includes(EVENT_PREFIX + event);
|
|
221
222
|
|
|
222
223
|
const isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX);
|
|
223
224
|
|
|
@@ -400,13 +401,13 @@ export function registerEventAttribute(attr, {
|
|
|
400
401
|
signal,
|
|
401
402
|
} = {}) {
|
|
402
403
|
const fullAttr = EVENT_PREFIX + attr.toLowerCase();
|
|
404
|
+
const attrs = eventAttrs.get();
|
|
403
405
|
|
|
404
|
-
if (!
|
|
406
|
+
if (! attrs.includes(fullAttr)) {
|
|
405
407
|
const sel = `[${CSS.escape(fullAttr)}]`;
|
|
406
408
|
const prop = attrToProp(fullAttr);
|
|
407
|
-
eventAttrs.
|
|
409
|
+
eventAttrs.set([...attrs, fullAttr]);
|
|
408
410
|
EVENTS[prop] = fullAttr;
|
|
409
|
-
selector += `, ${sel}`;
|
|
410
411
|
|
|
411
412
|
if (addListeners) {
|
|
412
413
|
requestAnimationFrame(() => {
|
|
@@ -556,9 +557,9 @@ export function unregisterSignal(signal) {
|
|
|
556
557
|
* @returns {Element|Document} Returns the passed target node
|
|
557
558
|
*/
|
|
558
559
|
export function attachListeners(target, { signal } = {}) {
|
|
559
|
-
const nodes = target instanceof Element && target.matches(selector)
|
|
560
|
-
? [target, ...target.querySelectorAll(selector)]
|
|
561
|
-
: target.querySelectorAll(selector);
|
|
560
|
+
const nodes = target instanceof Element && target.matches(selector.get())
|
|
561
|
+
? [target, ...target.querySelectorAll(selector.get())]
|
|
562
|
+
: target.querySelectorAll(selector.get());
|
|
562
563
|
|
|
563
564
|
nodes.forEach(el => _addListeners(el, { signal }));
|
|
564
565
|
|
|
@@ -578,7 +579,7 @@ export function observeEvents(root = document) {
|
|
|
578
579
|
childList:true,
|
|
579
580
|
attributes: true,
|
|
580
581
|
attributeOldValue: true,
|
|
581
|
-
attributeFilter: eventAttrs,
|
|
582
|
+
attributeFilter: eventAttrs.get(),
|
|
582
583
|
});
|
|
583
584
|
}
|
|
584
585
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aegisjsproject/callback-registry",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": " A callback registry for AegisJSProject",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aegis",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"run:tests": "node --test *.test.js",
|
|
50
50
|
"clean": "rm -f ./*.cjs",
|
|
51
51
|
"build:js": "npm run clean && rollup -c rollup.config.js",
|
|
52
|
+
"update:importmap": "npx --package=@shgysk8zer0/importmap importmap-html test/index.html",
|
|
52
53
|
"create:lock": "npm i --package-lock-only --ignore-scripts --no-audit --no-fund",
|
|
53
54
|
"version:bump": "npm run version:bump:patch",
|
|
54
55
|
"version:bump:patch": "npm version --no-git-tag-version patch && npm run create:lock",
|
|
@@ -76,11 +77,15 @@
|
|
|
76
77
|
},
|
|
77
78
|
"homepage": "https://github.com/AegisJSProject/callback-registry#readme",
|
|
78
79
|
"devDependencies": {
|
|
79
|
-
"@rollup/plugin-terser": "^0.
|
|
80
|
-
"@shgysk8zer0/eslint-config": "^1.0.
|
|
81
|
-
"@shgysk8zer0/polyfills": "^0.
|
|
82
|
-
"
|
|
80
|
+
"@rollup/plugin-terser": "^1.0.0",
|
|
81
|
+
"@shgysk8zer0/eslint-config": "^1.0.5",
|
|
82
|
+
"@shgysk8zer0/polyfills": "^0.6.2",
|
|
83
|
+
"@shgysk8zer0/rollup-import": "^2.0.2",
|
|
84
|
+
"eslint": "^10.0.2",
|
|
83
85
|
"http-server": "^14.1.1",
|
|
84
|
-
"rollup": "^4.
|
|
86
|
+
"rollup": "^4.59.0"
|
|
87
|
+
},
|
|
88
|
+
"dependencies": {
|
|
89
|
+
"@shgysk8zer0/signals": "^0.0.3"
|
|
85
90
|
}
|
|
86
91
|
}
|