@x-oasis/bind-events 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @x-oasis/bind-events
2
+
3
+ ## Installation
4
+
5
+ ```bash
6
+ $ npm i @x-oasis/bind-events
7
+ ```
8
+
9
+ ## How to use
10
+
11
+ ```typescript
12
+ import bindEvents from '@x-oasis/bind-events'
13
+ ```
14
+
15
+ ## How to run test
16
+
17
+ ```bash
18
+ $ pnpm test
19
+ ```
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function _extends() {
6
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
7
+ for (var i = 1; i < arguments.length; i++) {
8
+ var source = arguments[i];
9
+ for (var key in source) {
10
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
11
+ target[key] = source[key];
12
+ }
13
+ }
14
+ }
15
+ return target;
16
+ };
17
+ return _extends.apply(this, arguments);
18
+ }
19
+
20
+ function getOptions(shared, fromBinding) {
21
+ return _extends({}, shared, fromBinding);
22
+ }
23
+ function bindEvents(el, bindings, sharedOptions) {
24
+ var empty = [];
25
+ var nextBindings = empty.concat(bindings);
26
+ var unBindings = nextBindings.map(function (binding) {
27
+ var options = getOptions(sharedOptions, binding.options);
28
+ el.addEventListener(binding.eventName, binding.fn, options);
29
+ return function unbind() {
30
+ el.removeEventListener(binding.eventName, binding.fn, options);
31
+ };
32
+ });
33
+ return function unbindAll() {
34
+ unBindings.forEach(function (unbind) {
35
+ return unbind();
36
+ });
37
+ };
38
+ }
39
+ function bindEventsOnce(el, bindings, sharedOptions) {
40
+ var empty = [];
41
+ var nextBindings = empty.concat(bindings);
42
+ var unBindings = nextBindings.map(function (binding) {
43
+ var options = getOptions(sharedOptions, binding.options);
44
+ var unbind = function unbind() {};
45
+ var wrappedFn = function wrappedFn(e) {
46
+ binding.fn.call(null, e);
47
+ unbind();
48
+ };
49
+ el.addEventListener(binding.eventName, wrappedFn, options);
50
+ unbind = function unbind() {
51
+ return el.removeEventListener(binding.eventName, wrappedFn, options);
52
+ };
53
+ return unbind;
54
+ });
55
+ return function unbindAll() {
56
+ unBindings.forEach(function (unbind) {
57
+ return unbind();
58
+ });
59
+ };
60
+ }
61
+
62
+ exports.bindEventsOnce = bindEventsOnce;
63
+ exports.default = bindEvents;
64
+ //# sourceMappingURL=bind-events.cjs.development.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-events.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["// addEventListener<K extends keyof WindowEventMap>\n// (type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n\n// export interface Binding <K extends keyof WindowEventMap>{\n// eventName: K;\n// fn: (this: Window, ev: WindowEventMap[K]) => any;\n// options?: boolean | AddEventListenerOptions\n// }\nexport interface Binding {\n eventName: string;\n fn: (e: MouseEvent) => any;\n options?: AddEventListenerOptions;\n}\n\n// https://github.com/atlassian/react-beautiful-dnd/blob/master/src/view/event-bindings/bind-events.js\n\nfunction getOptions(\n shared?: AddEventListenerOptions,\n fromBinding?: AddEventListenerOptions\n) {\n return {\n ...shared,\n ...fromBinding,\n };\n}\n\nexport default function bindEvents(\n el: HTMLElement | Window | Document,\n bindings: Binding[] | Binding,\n sharedOptions?: AddEventListenerOptions\n) {\n const empty = [] as Binding[];\n const nextBindings = empty.concat(bindings);\n const unBindings = nextBindings.map((binding) => {\n const options = getOptions(sharedOptions, binding.options);\n // ts-hint: https://github.com/microsoft/TypeScript/issues/28357#issuecomment-436484705\n el.addEventListener(\n binding.eventName,\n binding.fn as EventListener,\n options\n );\n\n return function unbind() {\n el.removeEventListener(\n binding.eventName,\n binding.fn as EventListener,\n options\n );\n };\n });\n\n // Return a function to unbind events\n return function unbindAll() {\n unBindings.forEach((unbind) => unbind());\n };\n}\n\n// once event triggered. it will be teardown first...\nexport function bindEventsOnce(\n el: HTMLElement,\n bindings: Binding[] | Binding,\n sharedOptions?: AddEventListenerOptions\n) {\n const empty = [] as Binding[];\n const nextBindings = empty.concat(bindings);\n const unBindings = nextBindings.map((binding) => {\n const options = getOptions(sharedOptions, binding.options);\n let unbind = () => {};\n\n const wrappedFn = (e: MouseEvent) => {\n binding.fn.call(null, e);\n unbind();\n };\n\n el.addEventListener(binding.eventName, wrappedFn as EventListener, options);\n\n unbind = () =>\n el.removeEventListener(\n binding.eventName,\n wrappedFn as EventListener,\n options\n );\n\n return unbind;\n });\n\n // Return a function to unbind events\n return function unbindAll() {\n unBindings.forEach((unbind) => unbind());\n };\n}\n"],"names":["getOptions","shared","fromBinding","_extends","bindEvents","el","bindings","sharedOptions","empty","nextBindings","concat","unBindings","map","binding","options","addEventListener","eventName","fn","unbind","removeEventListener","unbindAll","forEach","bindEventsOnce","wrappedFn","e","call"],"mappings":";;;;;;;;;;;;;;;;;;;AAgBA,SAASA,UAAUA,CACjBC,MAAgC,EAChCC,WAAqC;EAErC,OAAAC,QAAA,KACKF,MAAM,EACNC,WAAW;AAElB;SAEwBE,UAAUA,CAChCC,EAAmC,EACnCC,QAA6B,EAC7BC,aAAuC;EAEvC,IAAMC,KAAK,GAAG,EAAe;EAC7B,IAAMC,YAAY,GAAGD,KAAK,CAACE,MAAM,CAACJ,QAAQ,CAAC;EAC3C,IAAMK,UAAU,GAAGF,YAAY,CAACG,GAAG,CAAC,UAACC,OAAO;IAC1C,IAAMC,OAAO,GAAGd,UAAU,CAACO,aAAa,EAAEM,OAAO,CAACC,OAAO,CAAC;IAE1DT,EAAE,CAACU,gBAAgB,CACjBF,OAAO,CAACG,SAAS,EACjBH,OAAO,CAACI,EAAmB,EAC3BH,OAAO,CACR;IAED,OAAO,SAASI,MAAMA;MACpBb,EAAE,CAACc,mBAAmB,CACpBN,OAAO,CAACG,SAAS,EACjBH,OAAO,CAACI,EAAmB,EAC3BH,OAAO,CACR;KACF;GACF,CAAC;EAGF,OAAO,SAASM,SAASA;IACvBT,UAAU,CAACU,OAAO,CAAC,UAACH,MAAM;MAAA,OAAKA,MAAM,EAAE;MAAC;GACzC;AACH;SAGgBI,cAAcA,CAC5BjB,EAAe,EACfC,QAA6B,EAC7BC,aAAuC;EAEvC,IAAMC,KAAK,GAAG,EAAe;EAC7B,IAAMC,YAAY,GAAGD,KAAK,CAACE,MAAM,CAACJ,QAAQ,CAAC;EAC3C,IAAMK,UAAU,GAAGF,YAAY,CAACG,GAAG,CAAC,UAACC,OAAO;IAC1C,IAAMC,OAAO,GAAGd,UAAU,CAACO,aAAa,EAAEM,OAAO,CAACC,OAAO,CAAC;IAC1D,IAAII,MAAM,GAAG,SAAAA,WAAQ;IAErB,IAAMK,SAAS,GAAG,SAAZA,SAASA,CAAIC,CAAa;MAC9BX,OAAO,CAACI,EAAE,CAACQ,IAAI,CAAC,IAAI,EAAED,CAAC,CAAC;MACxBN,MAAM,EAAE;KACT;IAEDb,EAAE,CAACU,gBAAgB,CAACF,OAAO,CAACG,SAAS,EAAEO,SAA0B,EAAET,OAAO,CAAC;IAE3EI,MAAM,GAAG,SAAAA;MAAA,OACPb,EAAE,CAACc,mBAAmB,CACpBN,OAAO,CAACG,SAAS,EACjBO,SAA0B,EAC1BT,OAAO,CACR;;IAEH,OAAOI,MAAM;GACd,CAAC;EAGF,OAAO,SAASE,SAASA;IACvBT,UAAU,CAACU,OAAO,CAAC,UAACH,MAAM;MAAA,OAAKA,MAAM,EAAE;MAAC;GACzC;AACH;;;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";function n(){return(n=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r])}return n}).apply(this,arguments)}function e(e,t){return n({},e,t)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.bindEventsOnce=function(n,t,r){var o=[].concat(t).map((function(t){var o=e(r,t.options),u=function(){},c=function(n){t.fn.call(null,n),u()};return n.addEventListener(t.eventName,c,o),u=function(){return n.removeEventListener(t.eventName,c,o)}}));return function(){o.forEach((function(n){return n()}))}},exports.default=function(n,t,r){var o=[].concat(t).map((function(t){var o=e(r,t.options);return n.addEventListener(t.eventName,t.fn,o),function(){n.removeEventListener(t.eventName,t.fn,o)}}));return function(){o.forEach((function(n){return n()}))}};
2
+ //# sourceMappingURL=bind-events.cjs.production.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-events.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["// addEventListener<K extends keyof WindowEventMap>\n// (type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n\n// export interface Binding <K extends keyof WindowEventMap>{\n// eventName: K;\n// fn: (this: Window, ev: WindowEventMap[K]) => any;\n// options?: boolean | AddEventListenerOptions\n// }\nexport interface Binding {\n eventName: string;\n fn: (e: MouseEvent) => any;\n options?: AddEventListenerOptions;\n}\n\n// https://github.com/atlassian/react-beautiful-dnd/blob/master/src/view/event-bindings/bind-events.js\n\nfunction getOptions(\n shared?: AddEventListenerOptions,\n fromBinding?: AddEventListenerOptions\n) {\n return {\n ...shared,\n ...fromBinding,\n };\n}\n\nexport default function bindEvents(\n el: HTMLElement | Window | Document,\n bindings: Binding[] | Binding,\n sharedOptions?: AddEventListenerOptions\n) {\n const empty = [] as Binding[];\n const nextBindings = empty.concat(bindings);\n const unBindings = nextBindings.map((binding) => {\n const options = getOptions(sharedOptions, binding.options);\n // ts-hint: https://github.com/microsoft/TypeScript/issues/28357#issuecomment-436484705\n el.addEventListener(\n binding.eventName,\n binding.fn as EventListener,\n options\n );\n\n return function unbind() {\n el.removeEventListener(\n binding.eventName,\n binding.fn as EventListener,\n options\n );\n };\n });\n\n // Return a function to unbind events\n return function unbindAll() {\n unBindings.forEach((unbind) => unbind());\n };\n}\n\n// once event triggered. it will be teardown first...\nexport function bindEventsOnce(\n el: HTMLElement,\n bindings: Binding[] | Binding,\n sharedOptions?: AddEventListenerOptions\n) {\n const empty = [] as Binding[];\n const nextBindings = empty.concat(bindings);\n const unBindings = nextBindings.map((binding) => {\n const options = getOptions(sharedOptions, binding.options);\n let unbind = () => {};\n\n const wrappedFn = (e: MouseEvent) => {\n binding.fn.call(null, e);\n unbind();\n };\n\n el.addEventListener(binding.eventName, wrappedFn as EventListener, options);\n\n unbind = () =>\n el.removeEventListener(\n binding.eventName,\n wrappedFn as EventListener,\n options\n );\n\n return unbind;\n });\n\n // Return a function to unbind events\n return function unbindAll() {\n unBindings.forEach((unbind) => unbind());\n };\n}\n"],"names":["getOptions","shared","fromBinding","_extends","el","bindings","sharedOptions","unBindings","concat","map","binding","options","unbind","wrappedFn","e","fn","call","addEventListener","eventName","removeEventListener","forEach"],"mappings":"gPAgBA,SAASA,EACPC,EACAC,GAEA,OAAAC,KACKF,EACAC,0FAqCLE,EACAC,EACAC,GAEA,IAEMC,EAFQ,GACaC,OAAOH,GACFI,KAAI,SAACC,GACnC,IAAMC,EAAUX,EAAWM,EAAeI,EAAQC,SAC9CC,EAAS,aAEPC,EAAY,SAACC,GACjBJ,EAAQK,GAAGC,KAAK,KAAMF,GACtBF,KAYF,OATAR,EAAGa,iBAAiBP,EAAQQ,UAAWL,EAA4BF,GAEnEC,EAAS,WAAA,OACPR,EAAGe,oBACDT,EAAQQ,UACRL,EACAF,OAON,OAAO,WACLJ,EAAWa,SAAQ,SAACR,GAAM,OAAKA,kCA7DjCR,EACAC,EACAC,GAEA,IAEMC,EAFQ,GACaC,OAAOH,GACFI,KAAI,SAACC,GACnC,IAAMC,EAAUX,EAAWM,EAAeI,EAAQC,SAQlD,OANAP,EAAGa,iBACDP,EAAQQ,UACRR,EAAQK,GACRJ,GAGK,WACLP,EAAGe,oBACDT,EAAQQ,UACRR,EAAQK,GACRJ,OAMN,OAAO,WACLJ,EAAWa,SAAQ,SAACR,GAAM,OAAKA"}
@@ -0,0 +1,60 @@
1
+ function _extends() {
2
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
3
+ for (var i = 1; i < arguments.length; i++) {
4
+ var source = arguments[i];
5
+ for (var key in source) {
6
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
7
+ target[key] = source[key];
8
+ }
9
+ }
10
+ }
11
+ return target;
12
+ };
13
+ return _extends.apply(this, arguments);
14
+ }
15
+
16
+ function getOptions(shared, fromBinding) {
17
+ return _extends({}, shared, fromBinding);
18
+ }
19
+ function bindEvents(el, bindings, sharedOptions) {
20
+ var empty = [];
21
+ var nextBindings = empty.concat(bindings);
22
+ var unBindings = nextBindings.map(function (binding) {
23
+ var options = getOptions(sharedOptions, binding.options);
24
+ el.addEventListener(binding.eventName, binding.fn, options);
25
+ return function unbind() {
26
+ el.removeEventListener(binding.eventName, binding.fn, options);
27
+ };
28
+ });
29
+ return function unbindAll() {
30
+ unBindings.forEach(function (unbind) {
31
+ return unbind();
32
+ });
33
+ };
34
+ }
35
+ function bindEventsOnce(el, bindings, sharedOptions) {
36
+ var empty = [];
37
+ var nextBindings = empty.concat(bindings);
38
+ var unBindings = nextBindings.map(function (binding) {
39
+ var options = getOptions(sharedOptions, binding.options);
40
+ var unbind = function unbind() {};
41
+ var wrappedFn = function wrappedFn(e) {
42
+ binding.fn.call(null, e);
43
+ unbind();
44
+ };
45
+ el.addEventListener(binding.eventName, wrappedFn, options);
46
+ unbind = function unbind() {
47
+ return el.removeEventListener(binding.eventName, wrappedFn, options);
48
+ };
49
+ return unbind;
50
+ });
51
+ return function unbindAll() {
52
+ unBindings.forEach(function (unbind) {
53
+ return unbind();
54
+ });
55
+ };
56
+ }
57
+
58
+ export default bindEvents;
59
+ export { bindEventsOnce };
60
+ //# sourceMappingURL=bind-events.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-events.esm.js","sources":["../src/index.ts"],"sourcesContent":["// addEventListener<K extends keyof WindowEventMap>\n// (type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n\n// export interface Binding <K extends keyof WindowEventMap>{\n// eventName: K;\n// fn: (this: Window, ev: WindowEventMap[K]) => any;\n// options?: boolean | AddEventListenerOptions\n// }\nexport interface Binding {\n eventName: string;\n fn: (e: MouseEvent) => any;\n options?: AddEventListenerOptions;\n}\n\n// https://github.com/atlassian/react-beautiful-dnd/blob/master/src/view/event-bindings/bind-events.js\n\nfunction getOptions(\n shared?: AddEventListenerOptions,\n fromBinding?: AddEventListenerOptions\n) {\n return {\n ...shared,\n ...fromBinding,\n };\n}\n\nexport default function bindEvents(\n el: HTMLElement | Window | Document,\n bindings: Binding[] | Binding,\n sharedOptions?: AddEventListenerOptions\n) {\n const empty = [] as Binding[];\n const nextBindings = empty.concat(bindings);\n const unBindings = nextBindings.map((binding) => {\n const options = getOptions(sharedOptions, binding.options);\n // ts-hint: https://github.com/microsoft/TypeScript/issues/28357#issuecomment-436484705\n el.addEventListener(\n binding.eventName,\n binding.fn as EventListener,\n options\n );\n\n return function unbind() {\n el.removeEventListener(\n binding.eventName,\n binding.fn as EventListener,\n options\n );\n };\n });\n\n // Return a function to unbind events\n return function unbindAll() {\n unBindings.forEach((unbind) => unbind());\n };\n}\n\n// once event triggered. it will be teardown first...\nexport function bindEventsOnce(\n el: HTMLElement,\n bindings: Binding[] | Binding,\n sharedOptions?: AddEventListenerOptions\n) {\n const empty = [] as Binding[];\n const nextBindings = empty.concat(bindings);\n const unBindings = nextBindings.map((binding) => {\n const options = getOptions(sharedOptions, binding.options);\n let unbind = () => {};\n\n const wrappedFn = (e: MouseEvent) => {\n binding.fn.call(null, e);\n unbind();\n };\n\n el.addEventListener(binding.eventName, wrappedFn as EventListener, options);\n\n unbind = () =>\n el.removeEventListener(\n binding.eventName,\n wrappedFn as EventListener,\n options\n );\n\n return unbind;\n });\n\n // Return a function to unbind events\n return function unbindAll() {\n unBindings.forEach((unbind) => unbind());\n };\n}\n"],"names":["getOptions","shared","fromBinding","_extends","bindEvents","el","bindings","sharedOptions","empty","nextBindings","concat","unBindings","map","binding","options","addEventListener","eventName","fn","unbind","removeEventListener","unbindAll","forEach","bindEventsOnce","wrappedFn","e","call"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAASA,UAAUA,CACjBC,MAAgC,EAChCC,WAAqC;EAErC,OAAAC,QAAA,KACKF,MAAM,EACNC,WAAW;AAElB;SAEwBE,UAAUA,CAChCC,EAAmC,EACnCC,QAA6B,EAC7BC,aAAuC;EAEvC,IAAMC,KAAK,GAAG,EAAe;EAC7B,IAAMC,YAAY,GAAGD,KAAK,CAACE,MAAM,CAACJ,QAAQ,CAAC;EAC3C,IAAMK,UAAU,GAAGF,YAAY,CAACG,GAAG,CAAC,UAACC,OAAO;IAC1C,IAAMC,OAAO,GAAGd,UAAU,CAACO,aAAa,EAAEM,OAAO,CAACC,OAAO,CAAC;IAE1DT,EAAE,CAACU,gBAAgB,CACjBF,OAAO,CAACG,SAAS,EACjBH,OAAO,CAACI,EAAmB,EAC3BH,OAAO,CACR;IAED,OAAO,SAASI,MAAMA;MACpBb,EAAE,CAACc,mBAAmB,CACpBN,OAAO,CAACG,SAAS,EACjBH,OAAO,CAACI,EAAmB,EAC3BH,OAAO,CACR;KACF;GACF,CAAC;EAGF,OAAO,SAASM,SAASA;IACvBT,UAAU,CAACU,OAAO,CAAC,UAACH,MAAM;MAAA,OAAKA,MAAM,EAAE;MAAC;GACzC;AACH;SAGgBI,cAAcA,CAC5BjB,EAAe,EACfC,QAA6B,EAC7BC,aAAuC;EAEvC,IAAMC,KAAK,GAAG,EAAe;EAC7B,IAAMC,YAAY,GAAGD,KAAK,CAACE,MAAM,CAACJ,QAAQ,CAAC;EAC3C,IAAMK,UAAU,GAAGF,YAAY,CAACG,GAAG,CAAC,UAACC,OAAO;IAC1C,IAAMC,OAAO,GAAGd,UAAU,CAACO,aAAa,EAAEM,OAAO,CAACC,OAAO,CAAC;IAC1D,IAAII,MAAM,GAAG,SAAAA,WAAQ;IAErB,IAAMK,SAAS,GAAG,SAAZA,SAASA,CAAIC,CAAa;MAC9BX,OAAO,CAACI,EAAE,CAACQ,IAAI,CAAC,IAAI,EAAED,CAAC,CAAC;MACxBN,MAAM,EAAE;KACT;IAEDb,EAAE,CAACU,gBAAgB,CAACF,OAAO,CAACG,SAAS,EAAEO,SAA0B,EAAET,OAAO,CAAC;IAE3EI,MAAM,GAAG,SAAAA;MAAA,OACPb,EAAE,CAACc,mBAAmB,CACpBN,OAAO,CAACG,SAAS,EACjBO,SAA0B,EAC1BT,OAAO,CACR;;IAEH,OAAOI,MAAM;GACd,CAAC;EAGF,OAAO,SAASE,SAASA;IACvBT,UAAU,CAACU,OAAO,CAAC,UAACH,MAAM;MAAA,OAAKA,MAAM,EAAE;MAAC;GACzC;AACH;;;;;"}
@@ -0,0 +1,7 @@
1
+ export interface Binding {
2
+ eventName: string;
3
+ fn: (e: MouseEvent) => any;
4
+ options?: AddEventListenerOptions;
5
+ }
6
+ export default function bindEvents(el: HTMLElement | Window | Document, bindings: Binding[] | Binding, sharedOptions?: AddEventListenerOptions): () => void;
7
+ export declare function bindEventsOnce(el: HTMLElement, bindings: Binding[] | Binding, sharedOptions?: AddEventListenerOptions): () => void;
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+
2
+ 'use strict'
3
+
4
+ if (process.env.NODE_ENV === 'production') {
5
+ module.exports = require('./bind-events.cjs.production.min.js')
6
+ } else {
7
+ module.exports = require('./bind-events.cjs.development.js')
8
+ }
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@x-oasis/bind-events",
3
+ "version": "0.1.34",
4
+ "description": "bind-events function",
5
+ "main": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "module": "dist/bind-events.esm.js",
8
+ "files": [
9
+ "dist",
10
+ "index.ts",
11
+ "src"
12
+ ],
13
+ "author": "",
14
+ "license": "ISC",
15
+ "devDependencies": {
16
+ "tsdx": "^0.14.1"
17
+ },
18
+ "scripts": {
19
+ "build": "tsdx build --tsconfig tsconfig.build.json",
20
+ "clean": "rimraf ./dist",
21
+ "test": "vitest",
22
+ "compile": "tsc -p tsconfig.build.json"
23
+ }
24
+ }
package/src/index.ts ADDED
@@ -0,0 +1,91 @@
1
+ // addEventListener<K extends keyof WindowEventMap>
2
+ // (type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3
+
4
+ // export interface Binding <K extends keyof WindowEventMap>{
5
+ // eventName: K;
6
+ // fn: (this: Window, ev: WindowEventMap[K]) => any;
7
+ // options?: boolean | AddEventListenerOptions
8
+ // }
9
+ export interface Binding {
10
+ eventName: string;
11
+ fn: (e: MouseEvent) => any;
12
+ options?: AddEventListenerOptions;
13
+ }
14
+
15
+ // https://github.com/atlassian/react-beautiful-dnd/blob/master/src/view/event-bindings/bind-events.js
16
+
17
+ function getOptions(
18
+ shared?: AddEventListenerOptions,
19
+ fromBinding?: AddEventListenerOptions
20
+ ) {
21
+ return {
22
+ ...shared,
23
+ ...fromBinding,
24
+ };
25
+ }
26
+
27
+ export default function bindEvents(
28
+ el: HTMLElement | Window | Document,
29
+ bindings: Binding[] | Binding,
30
+ sharedOptions?: AddEventListenerOptions
31
+ ) {
32
+ const empty = [] as Binding[];
33
+ const nextBindings = empty.concat(bindings);
34
+ const unBindings = nextBindings.map((binding) => {
35
+ const options = getOptions(sharedOptions, binding.options);
36
+ // ts-hint: https://github.com/microsoft/TypeScript/issues/28357#issuecomment-436484705
37
+ el.addEventListener(
38
+ binding.eventName,
39
+ binding.fn as EventListener,
40
+ options
41
+ );
42
+
43
+ return function unbind() {
44
+ el.removeEventListener(
45
+ binding.eventName,
46
+ binding.fn as EventListener,
47
+ options
48
+ );
49
+ };
50
+ });
51
+
52
+ // Return a function to unbind events
53
+ return function unbindAll() {
54
+ unBindings.forEach((unbind) => unbind());
55
+ };
56
+ }
57
+
58
+ // once event triggered. it will be teardown first...
59
+ export function bindEventsOnce(
60
+ el: HTMLElement,
61
+ bindings: Binding[] | Binding,
62
+ sharedOptions?: AddEventListenerOptions
63
+ ) {
64
+ const empty = [] as Binding[];
65
+ const nextBindings = empty.concat(bindings);
66
+ const unBindings = nextBindings.map((binding) => {
67
+ const options = getOptions(sharedOptions, binding.options);
68
+ let unbind = () => {};
69
+
70
+ const wrappedFn = (e: MouseEvent) => {
71
+ binding.fn.call(null, e);
72
+ unbind();
73
+ };
74
+
75
+ el.addEventListener(binding.eventName, wrappedFn as EventListener, options);
76
+
77
+ unbind = () =>
78
+ el.removeEventListener(
79
+ binding.eventName,
80
+ wrappedFn as EventListener,
81
+ options
82
+ );
83
+
84
+ return unbind;
85
+ });
86
+
87
+ // Return a function to unbind events
88
+ return function unbindAll() {
89
+ unBindings.forEach((unbind) => unbind());
90
+ };
91
+ }