@zero-dependency/dom 0.12.0 → 1.0.0

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/dist/html.d.ts CHANGED
@@ -1,9 +1,11 @@
1
- declare type Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{
1
+ type Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{
2
2
  style: Partial<CSSStyleDeclaration>;
3
3
  } & Omit<HTMLElementTagNameMap[T], 'style'>>;
4
- declare type Children = (string | Node | HTMLElement)[];
4
+ type Children = (string | Node | HTMLElement)[];
5
5
  export declare function el<T extends keyof HTMLElementTagNameMap>(tag: T, attributes?: Children | Attributes<T>, ...children: Children): HTMLElementTagNameMap[T];
6
6
  export declare function text(str: string): Text;
7
7
  export declare function nbsp(): Text;
8
8
  export declare function domReady(): Promise<void>;
9
+ export declare function isDisabled(element: HTMLElement): boolean;
10
+ export declare function addEventListener(target: EventTarget, eventName: string, handler: EventListener, options?: AddEventListenerOptions): () => void;
9
11
  export {};
package/dist/index.cjs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  function el(tag, attributes, ...children) {
6
6
  const el2 = document.createElement(tag);
@@ -21,7 +21,7 @@ function text(str) {
21
21
  return document.createTextNode(str);
22
22
  }
23
23
  function nbsp() {
24
- return text("\xA0");
24
+ return text(" ");
25
25
  }
26
26
  async function domReady() {
27
27
  return new Promise((resolve) => {
@@ -34,78 +34,74 @@ async function domReady() {
34
34
  }
35
35
  });
36
36
  }
37
-
38
- function observeElement(el, callback, options) {
39
- const observe = new MutationObserver((mutations, observer) => {
40
- for (const mutation of mutations) {
41
- callback(mutation, observer);
42
- }
43
- });
44
- observe.observe(el, {
45
- childList: true,
46
- subtree: true,
47
- ...options
48
- });
49
- return observe;
37
+ function isDisabled(element) {
38
+ return Boolean(element.getAttribute("disabled")) === true || Boolean(element.getAttribute("aria-disabled")) === true;
50
39
  }
51
-
52
- function waitElement(selector, target = document.documentElement) {
53
- return new Promise((resolve) => {
54
- function resolveElement() {
55
- const el = target.querySelector(selector);
56
- if (el) {
57
- resolve(el);
58
- }
59
- }
60
- observeElement(target, (_, observer) => {
61
- resolveElement();
62
- observer.disconnect();
63
- });
64
- });
40
+ function addEventListener(target, eventName, handler, options) {
41
+ target.addEventListener(eventName, handler, options);
42
+ return () => {
43
+ target.removeEventListener(eventName, handler, options);
44
+ };
65
45
  }
66
46
 
67
- class n {
68
- #t = {};
69
- on(t, e) {
70
- const s = this.#t[t];
71
- return s ? s.push(e) : this.#t[t] = [e], this;
47
+ class Emitter {
48
+ #events = {};
49
+ on(event, listener) {
50
+ const listeners = this.#events[event];
51
+ if (listeners) {
52
+ listeners.push(listener);
53
+ } else {
54
+ this.#events[event] = [listener];
55
+ }
56
+ return this;
72
57
  }
73
- addListener(t, e) {
74
- return this.on(t, e);
58
+ addListener(event, listener) {
59
+ return this.on(event, listener);
75
60
  }
76
- once(t, e) {
77
- const s = (...i) => {
78
- this.off(t, s), e(...i);
61
+ once(event, listener) {
62
+ const onceListener = (...args) => {
63
+ this.off(event, onceListener);
64
+ listener(...args);
79
65
  };
80
- return this.on(t, s), this;
66
+ this.on(event, onceListener);
67
+ return this;
81
68
  }
82
- emit(t, ...e) {
83
- const s = this.#t[t] || [];
84
- for (let i = 0; i < s.length; i++)
85
- s[i](...e);
86
- return Boolean(s.length);
69
+ emit(event, ...args) {
70
+ const listeners = this.#events[event] || [];
71
+ for (let i = 0; i < listeners.length; i++) {
72
+ listeners[i](...args);
73
+ }
74
+ return Boolean(listeners.length);
87
75
  }
88
- off(t, e) {
89
- return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;
76
+ off(event, listener) {
77
+ if (this.#events[event]) {
78
+ this.#events[event] = this.#events[event].filter((v) => v !== listener);
79
+ }
80
+ return this;
90
81
  }
91
- removeListener(t, e) {
92
- return this.off(t, e);
82
+ removeListener(event, listener) {
83
+ return this.off(event, listener);
93
84
  }
94
- removeAllListeners(t) {
95
- return t ? delete this.#t[t] : this.#t = {}, this;
85
+ removeAllListeners(event) {
86
+ if (event) {
87
+ delete this.#events[event];
88
+ } else {
89
+ this.#events = {};
90
+ }
91
+ return this;
96
92
  }
97
93
  eventNames() {
98
- return Reflect.ownKeys(this.#t);
94
+ return Reflect.ownKeys(this.#events);
99
95
  }
100
- listeners(t) {
101
- return this.#t[t];
96
+ listeners(event) {
97
+ return this.#events[event];
102
98
  }
103
- listenerCount(t) {
104
- return this.#t[t]?.length ?? 0;
99
+ listenerCount(event) {
100
+ return this.#events[event]?.length ?? 0;
105
101
  }
106
102
  }
107
103
 
108
- class LocationObserver extends n {
104
+ class LocationObserver extends Emitter {
109
105
  constructor() {
110
106
  super();
111
107
  const { history, location } = window;
@@ -118,15 +114,45 @@ class LocationObserver extends n {
118
114
  replaceState.apply(history, args);
119
115
  this.emit("replaceState", location, args[0]);
120
116
  };
121
- window.addEventListener("popstate", ({ state }) => {
122
- this.emit("popState", location, state);
117
+ window.addEventListener("popstate", (event) => {
118
+ this.emit("popState", location, event);
123
119
  });
124
120
  }
125
121
  }
126
122
 
123
+ function observeElement(el, callback, options) {
124
+ const observe = new MutationObserver((mutations, observer) => {
125
+ for (const mutation of mutations) {
126
+ callback(mutation, observer);
127
+ }
128
+ });
129
+ observe.observe(el, {
130
+ childList: true,
131
+ subtree: true,
132
+ ...options
133
+ });
134
+ return () => observe.disconnect();
135
+ }
136
+ function waitElement(selector, target = document.documentElement) {
137
+ return new Promise((resolve) => {
138
+ function resolveElement() {
139
+ const el = target.querySelector(selector);
140
+ if (el) {
141
+ resolve(el);
142
+ }
143
+ }
144
+ observeElement(target, (_, observer) => {
145
+ resolveElement();
146
+ observer.disconnect();
147
+ });
148
+ });
149
+ }
150
+
127
151
  exports.LocationObserver = LocationObserver;
152
+ exports.addEventListener = addEventListener;
128
153
  exports.domReady = domReady;
129
154
  exports.el = el;
155
+ exports.isDisabled = isDisabled;
130
156
  exports.nbsp = nbsp;
131
157
  exports.observeElement = observeElement;
132
158
  exports.text = text;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/html.ts","../src/observeElement.ts","../src/waitElement.ts","../node_modules/.pnpm/@zero-dependency+emitter@1.1.1/node_modules/@zero-dependency/emitter/dist/index.es.js","../src/locationObserver.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n","export function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n) {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return observe\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n","class n {\n #t = {};\n on(t, e) {\n const s = this.#t[t];\n return s ? s.push(e) : this.#t[t] = [e], this;\n }\n addListener(t, e) {\n return this.on(t, e);\n }\n once(t, e) {\n const s = (...i) => {\n this.off(t, s), e(...i);\n };\n return this.on(t, s), this;\n }\n emit(t, ...e) {\n const s = this.#t[t] || [];\n for (let i = 0; i < s.length; i++)\n s[i](...e);\n return Boolean(s.length);\n }\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n removeListener(t, e) {\n return this.off(t, e);\n }\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n listeners(t) {\n return this.#t[t];\n }\n listenerCount(t) {\n return this.#t[t]?.length ?? 0;\n }\n}\nexport {\n n as Emitter\n};\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback = (location: Location, state: any) => void\n\ntype Events = {\n pushState: LocationCallback\n replaceState: LocationCallback\n popState: LocationCallback\n}\n\nexport class LocationObserver extends Emitter<Events> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', ({ state }) => {\n this.emit('popState', location, state)\n })\n }\n}\n"],"names":["el","Emitter"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/html.ts","../../emitter/dist/index.es.js","../src/location-observer.ts","../src/mutation-observers.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n\nexport function isDisabled(element: HTMLElement): boolean {\n return (\n Boolean(element.getAttribute('disabled')) === true ||\n Boolean(element.getAttribute('aria-disabled')) === true\n )\n}\n\nexport function addEventListener(\n target: EventTarget,\n eventName: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n) {\n target.addEventListener(eventName, handler, options)\n return () => {\n target.removeEventListener(eventName, handler, options)\n }\n}\n","class Emitter {\n #events = {};\n on(event, listener) {\n const listeners = this.#events[event];\n if (listeners) {\n listeners.push(listener);\n } else {\n this.#events[event] = [listener];\n }\n return this;\n }\n addListener(event, listener) {\n return this.on(event, listener);\n }\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n return this;\n }\n emit(event, ...args) {\n const listeners = this.#events[event] || [];\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](...args);\n }\n return Boolean(listeners.length);\n }\n off(event, listener) {\n if (this.#events[event]) {\n this.#events[event] = this.#events[event].filter((v) => v !== listener);\n }\n return this;\n }\n removeListener(event, listener) {\n return this.off(event, listener);\n }\n removeAllListeners(event) {\n if (event) {\n delete this.#events[event];\n } else {\n this.#events = {};\n }\n return this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#events);\n }\n listeners(event) {\n return this.#events[event];\n }\n listenerCount(event) {\n return this.#events[event]?.length ?? 0;\n }\n}\n\nexport { Emitter };\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback<T = any> = (location: Location, args: T) => void\n\ntype Events<T> = {\n pushState: LocationCallback<T>\n replaceState: LocationCallback<T>\n popState: LocationCallback<\n Omit<PopStateEvent, 'state'> & { readonly state: T }\n >\n}\n\nexport class LocationObserver<T> extends Emitter<Events<T>> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.emit('popState', location, event)\n })\n }\n}\n","type Disconnect = () => void\n\nexport function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n): Disconnect {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return () => observe.disconnect()\n}\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n"],"names":["el"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export { el, text, nbsp, domReady } from './html.js';
2
- export { waitElement } from './waitElement.js';
3
- export { LocationObserver } from './locationObserver.js';
4
- export { observeElement } from './observeElement.js';
1
+ export * from './html.js';
2
+ export * from './location-observer.js';
3
+ export * from './mutation-observers.js';
package/dist/index.es.js CHANGED
@@ -17,7 +17,7 @@ function text(str) {
17
17
  return document.createTextNode(str);
18
18
  }
19
19
  function nbsp() {
20
- return text("\xA0");
20
+ return text(" ");
21
21
  }
22
22
  async function domReady() {
23
23
  return new Promise((resolve) => {
@@ -30,78 +30,74 @@ async function domReady() {
30
30
  }
31
31
  });
32
32
  }
33
-
34
- function observeElement(el, callback, options) {
35
- const observe = new MutationObserver((mutations, observer) => {
36
- for (const mutation of mutations) {
37
- callback(mutation, observer);
38
- }
39
- });
40
- observe.observe(el, {
41
- childList: true,
42
- subtree: true,
43
- ...options
44
- });
45
- return observe;
33
+ function isDisabled(element) {
34
+ return Boolean(element.getAttribute("disabled")) === true || Boolean(element.getAttribute("aria-disabled")) === true;
46
35
  }
47
-
48
- function waitElement(selector, target = document.documentElement) {
49
- return new Promise((resolve) => {
50
- function resolveElement() {
51
- const el = target.querySelector(selector);
52
- if (el) {
53
- resolve(el);
54
- }
55
- }
56
- observeElement(target, (_, observer) => {
57
- resolveElement();
58
- observer.disconnect();
59
- });
60
- });
36
+ function addEventListener(target, eventName, handler, options) {
37
+ target.addEventListener(eventName, handler, options);
38
+ return () => {
39
+ target.removeEventListener(eventName, handler, options);
40
+ };
61
41
  }
62
42
 
63
- class n {
64
- #t = {};
65
- on(t, e) {
66
- const s = this.#t[t];
67
- return s ? s.push(e) : this.#t[t] = [e], this;
43
+ class Emitter {
44
+ #events = {};
45
+ on(event, listener) {
46
+ const listeners = this.#events[event];
47
+ if (listeners) {
48
+ listeners.push(listener);
49
+ } else {
50
+ this.#events[event] = [listener];
51
+ }
52
+ return this;
68
53
  }
69
- addListener(t, e) {
70
- return this.on(t, e);
54
+ addListener(event, listener) {
55
+ return this.on(event, listener);
71
56
  }
72
- once(t, e) {
73
- const s = (...i) => {
74
- this.off(t, s), e(...i);
57
+ once(event, listener) {
58
+ const onceListener = (...args) => {
59
+ this.off(event, onceListener);
60
+ listener(...args);
75
61
  };
76
- return this.on(t, s), this;
62
+ this.on(event, onceListener);
63
+ return this;
77
64
  }
78
- emit(t, ...e) {
79
- const s = this.#t[t] || [];
80
- for (let i = 0; i < s.length; i++)
81
- s[i](...e);
82
- return Boolean(s.length);
65
+ emit(event, ...args) {
66
+ const listeners = this.#events[event] || [];
67
+ for (let i = 0; i < listeners.length; i++) {
68
+ listeners[i](...args);
69
+ }
70
+ return Boolean(listeners.length);
83
71
  }
84
- off(t, e) {
85
- return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;
72
+ off(event, listener) {
73
+ if (this.#events[event]) {
74
+ this.#events[event] = this.#events[event].filter((v) => v !== listener);
75
+ }
76
+ return this;
86
77
  }
87
- removeListener(t, e) {
88
- return this.off(t, e);
78
+ removeListener(event, listener) {
79
+ return this.off(event, listener);
89
80
  }
90
- removeAllListeners(t) {
91
- return t ? delete this.#t[t] : this.#t = {}, this;
81
+ removeAllListeners(event) {
82
+ if (event) {
83
+ delete this.#events[event];
84
+ } else {
85
+ this.#events = {};
86
+ }
87
+ return this;
92
88
  }
93
89
  eventNames() {
94
- return Reflect.ownKeys(this.#t);
90
+ return Reflect.ownKeys(this.#events);
95
91
  }
96
- listeners(t) {
97
- return this.#t[t];
92
+ listeners(event) {
93
+ return this.#events[event];
98
94
  }
99
- listenerCount(t) {
100
- return this.#t[t]?.length ?? 0;
95
+ listenerCount(event) {
96
+ return this.#events[event]?.length ?? 0;
101
97
  }
102
98
  }
103
99
 
104
- class LocationObserver extends n {
100
+ class LocationObserver extends Emitter {
105
101
  constructor() {
106
102
  super();
107
103
  const { history, location } = window;
@@ -114,11 +110,39 @@ class LocationObserver extends n {
114
110
  replaceState.apply(history, args);
115
111
  this.emit("replaceState", location, args[0]);
116
112
  };
117
- window.addEventListener("popstate", ({ state }) => {
118
- this.emit("popState", location, state);
113
+ window.addEventListener("popstate", (event) => {
114
+ this.emit("popState", location, event);
119
115
  });
120
116
  }
121
117
  }
122
118
 
123
- export { LocationObserver, domReady, el, nbsp, observeElement, text, waitElement };
119
+ function observeElement(el, callback, options) {
120
+ const observe = new MutationObserver((mutations, observer) => {
121
+ for (const mutation of mutations) {
122
+ callback(mutation, observer);
123
+ }
124
+ });
125
+ observe.observe(el, {
126
+ childList: true,
127
+ subtree: true,
128
+ ...options
129
+ });
130
+ return () => observe.disconnect();
131
+ }
132
+ function waitElement(selector, target = document.documentElement) {
133
+ return new Promise((resolve) => {
134
+ function resolveElement() {
135
+ const el = target.querySelector(selector);
136
+ if (el) {
137
+ resolve(el);
138
+ }
139
+ }
140
+ observeElement(target, (_, observer) => {
141
+ resolveElement();
142
+ observer.disconnect();
143
+ });
144
+ });
145
+ }
146
+
147
+ export { LocationObserver, addEventListener, domReady, el, isDisabled, nbsp, observeElement, text, waitElement };
124
148
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/html.ts","../src/observeElement.ts","../src/waitElement.ts","../node_modules/.pnpm/@zero-dependency+emitter@1.1.1/node_modules/@zero-dependency/emitter/dist/index.es.js","../src/locationObserver.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n","export function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n) {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return observe\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n","class n {\n #t = {};\n on(t, e) {\n const s = this.#t[t];\n return s ? s.push(e) : this.#t[t] = [e], this;\n }\n addListener(t, e) {\n return this.on(t, e);\n }\n once(t, e) {\n const s = (...i) => {\n this.off(t, s), e(...i);\n };\n return this.on(t, s), this;\n }\n emit(t, ...e) {\n const s = this.#t[t] || [];\n for (let i = 0; i < s.length; i++)\n s[i](...e);\n return Boolean(s.length);\n }\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n removeListener(t, e) {\n return this.off(t, e);\n }\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n listeners(t) {\n return this.#t[t];\n }\n listenerCount(t) {\n return this.#t[t]?.length ?? 0;\n }\n}\nexport {\n n as Emitter\n};\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback = (location: Location, state: any) => void\n\ntype Events = {\n pushState: LocationCallback\n replaceState: LocationCallback\n popState: LocationCallback\n}\n\nexport class LocationObserver extends Emitter<Events> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', ({ state }) => {\n this.emit('popState', location, state)\n })\n }\n}\n"],"names":["el","Emitter"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/html.ts","../../emitter/dist/index.es.js","../src/location-observer.ts","../src/mutation-observers.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n\nexport function isDisabled(element: HTMLElement): boolean {\n return (\n Boolean(element.getAttribute('disabled')) === true ||\n Boolean(element.getAttribute('aria-disabled')) === true\n )\n}\n\nexport function addEventListener(\n target: EventTarget,\n eventName: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n) {\n target.addEventListener(eventName, handler, options)\n return () => {\n target.removeEventListener(eventName, handler, options)\n }\n}\n","class Emitter {\n #events = {};\n on(event, listener) {\n const listeners = this.#events[event];\n if (listeners) {\n listeners.push(listener);\n } else {\n this.#events[event] = [listener];\n }\n return this;\n }\n addListener(event, listener) {\n return this.on(event, listener);\n }\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n return this;\n }\n emit(event, ...args) {\n const listeners = this.#events[event] || [];\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](...args);\n }\n return Boolean(listeners.length);\n }\n off(event, listener) {\n if (this.#events[event]) {\n this.#events[event] = this.#events[event].filter((v) => v !== listener);\n }\n return this;\n }\n removeListener(event, listener) {\n return this.off(event, listener);\n }\n removeAllListeners(event) {\n if (event) {\n delete this.#events[event];\n } else {\n this.#events = {};\n }\n return this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#events);\n }\n listeners(event) {\n return this.#events[event];\n }\n listenerCount(event) {\n return this.#events[event]?.length ?? 0;\n }\n}\n\nexport { Emitter };\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback<T = any> = (location: Location, args: T) => void\n\ntype Events<T> = {\n pushState: LocationCallback<T>\n replaceState: LocationCallback<T>\n popState: LocationCallback<\n Omit<PopStateEvent, 'state'> & { readonly state: T }\n >\n}\n\nexport class LocationObserver<T> extends Emitter<Events<T>> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.emit('popState', location, event)\n })\n }\n}\n","type Disconnect = () => void\n\nexport function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n): Disconnect {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return () => observe.disconnect()\n}\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n"],"names":["el"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -23,7 +23,7 @@
23
23
  return document.createTextNode(str);
24
24
  }
25
25
  function nbsp() {
26
- return text("\xA0");
26
+ return text(" ");
27
27
  }
28
28
  async function domReady() {
29
29
  return new Promise((resolve) => {
@@ -36,78 +36,74 @@
36
36
  }
37
37
  });
38
38
  }
39
-
40
- function observeElement(el, callback, options) {
41
- const observe = new MutationObserver((mutations, observer) => {
42
- for (const mutation of mutations) {
43
- callback(mutation, observer);
44
- }
45
- });
46
- observe.observe(el, {
47
- childList: true,
48
- subtree: true,
49
- ...options
50
- });
51
- return observe;
39
+ function isDisabled(element) {
40
+ return Boolean(element.getAttribute("disabled")) === true || Boolean(element.getAttribute("aria-disabled")) === true;
52
41
  }
53
-
54
- function waitElement(selector, target = document.documentElement) {
55
- return new Promise((resolve) => {
56
- function resolveElement() {
57
- const el = target.querySelector(selector);
58
- if (el) {
59
- resolve(el);
60
- }
61
- }
62
- observeElement(target, (_, observer) => {
63
- resolveElement();
64
- observer.disconnect();
65
- });
66
- });
42
+ function addEventListener(target, eventName, handler, options) {
43
+ target.addEventListener(eventName, handler, options);
44
+ return () => {
45
+ target.removeEventListener(eventName, handler, options);
46
+ };
67
47
  }
68
48
 
69
- class n {
70
- #t = {};
71
- on(t, e) {
72
- const s = this.#t[t];
73
- return s ? s.push(e) : this.#t[t] = [e], this;
49
+ class Emitter {
50
+ #events = {};
51
+ on(event, listener) {
52
+ const listeners = this.#events[event];
53
+ if (listeners) {
54
+ listeners.push(listener);
55
+ } else {
56
+ this.#events[event] = [listener];
57
+ }
58
+ return this;
74
59
  }
75
- addListener(t, e) {
76
- return this.on(t, e);
60
+ addListener(event, listener) {
61
+ return this.on(event, listener);
77
62
  }
78
- once(t, e) {
79
- const s = (...i) => {
80
- this.off(t, s), e(...i);
63
+ once(event, listener) {
64
+ const onceListener = (...args) => {
65
+ this.off(event, onceListener);
66
+ listener(...args);
81
67
  };
82
- return this.on(t, s), this;
68
+ this.on(event, onceListener);
69
+ return this;
83
70
  }
84
- emit(t, ...e) {
85
- const s = this.#t[t] || [];
86
- for (let i = 0; i < s.length; i++)
87
- s[i](...e);
88
- return Boolean(s.length);
71
+ emit(event, ...args) {
72
+ const listeners = this.#events[event] || [];
73
+ for (let i = 0; i < listeners.length; i++) {
74
+ listeners[i](...args);
75
+ }
76
+ return Boolean(listeners.length);
89
77
  }
90
- off(t, e) {
91
- return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;
78
+ off(event, listener) {
79
+ if (this.#events[event]) {
80
+ this.#events[event] = this.#events[event].filter((v) => v !== listener);
81
+ }
82
+ return this;
92
83
  }
93
- removeListener(t, e) {
94
- return this.off(t, e);
84
+ removeListener(event, listener) {
85
+ return this.off(event, listener);
95
86
  }
96
- removeAllListeners(t) {
97
- return t ? delete this.#t[t] : this.#t = {}, this;
87
+ removeAllListeners(event) {
88
+ if (event) {
89
+ delete this.#events[event];
90
+ } else {
91
+ this.#events = {};
92
+ }
93
+ return this;
98
94
  }
99
95
  eventNames() {
100
- return Reflect.ownKeys(this.#t);
96
+ return Reflect.ownKeys(this.#events);
101
97
  }
102
- listeners(t) {
103
- return this.#t[t];
98
+ listeners(event) {
99
+ return this.#events[event];
104
100
  }
105
- listenerCount(t) {
106
- return this.#t[t]?.length ?? 0;
101
+ listenerCount(event) {
102
+ return this.#events[event]?.length ?? 0;
107
103
  }
108
104
  }
109
105
 
110
- class LocationObserver extends n {
106
+ class LocationObserver extends Emitter {
111
107
  constructor() {
112
108
  super();
113
109
  const { history, location } = window;
@@ -120,21 +116,51 @@
120
116
  replaceState.apply(history, args);
121
117
  this.emit("replaceState", location, args[0]);
122
118
  };
123
- window.addEventListener("popstate", ({ state }) => {
124
- this.emit("popState", location, state);
119
+ window.addEventListener("popstate", (event) => {
120
+ this.emit("popState", location, event);
125
121
  });
126
122
  }
127
123
  }
128
124
 
125
+ function observeElement(el, callback, options) {
126
+ const observe = new MutationObserver((mutations, observer) => {
127
+ for (const mutation of mutations) {
128
+ callback(mutation, observer);
129
+ }
130
+ });
131
+ observe.observe(el, {
132
+ childList: true,
133
+ subtree: true,
134
+ ...options
135
+ });
136
+ return () => observe.disconnect();
137
+ }
138
+ function waitElement(selector, target = document.documentElement) {
139
+ return new Promise((resolve) => {
140
+ function resolveElement() {
141
+ const el = target.querySelector(selector);
142
+ if (el) {
143
+ resolve(el);
144
+ }
145
+ }
146
+ observeElement(target, (_, observer) => {
147
+ resolveElement();
148
+ observer.disconnect();
149
+ });
150
+ });
151
+ }
152
+
129
153
  exports.LocationObserver = LocationObserver;
154
+ exports.addEventListener = addEventListener;
130
155
  exports.domReady = domReady;
131
156
  exports.el = el;
157
+ exports.isDisabled = isDisabled;
132
158
  exports.nbsp = nbsp;
133
159
  exports.observeElement = observeElement;
134
160
  exports.text = text;
135
161
  exports.waitElement = waitElement;
136
162
 
137
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
163
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
138
164
 
139
165
  }));
140
166
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/html.ts","../src/observeElement.ts","../src/waitElement.ts","../node_modules/.pnpm/@zero-dependency+emitter@1.1.1/node_modules/@zero-dependency/emitter/dist/index.es.js","../src/locationObserver.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n","export function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n) {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return observe\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n","class n {\n #t = {};\n on(t, e) {\n const s = this.#t[t];\n return s ? s.push(e) : this.#t[t] = [e], this;\n }\n addListener(t, e) {\n return this.on(t, e);\n }\n once(t, e) {\n const s = (...i) => {\n this.off(t, s), e(...i);\n };\n return this.on(t, s), this;\n }\n emit(t, ...e) {\n const s = this.#t[t] || [];\n for (let i = 0; i < s.length; i++)\n s[i](...e);\n return Boolean(s.length);\n }\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n removeListener(t, e) {\n return this.off(t, e);\n }\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n listeners(t) {\n return this.#t[t];\n }\n listenerCount(t) {\n return this.#t[t]?.length ?? 0;\n }\n}\nexport {\n n as Emitter\n};\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback = (location: Location, state: any) => void\n\ntype Events = {\n pushState: LocationCallback\n replaceState: LocationCallback\n popState: LocationCallback\n}\n\nexport class LocationObserver extends Emitter<Events> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', ({ state }) => {\n this.emit('popState', location, state)\n })\n }\n}\n"],"names":["el","Emitter"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/html.ts","../../emitter/dist/index.es.js","../src/location-observer.ts","../src/mutation-observers.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n\nexport function isDisabled(element: HTMLElement): boolean {\n return (\n Boolean(element.getAttribute('disabled')) === true ||\n Boolean(element.getAttribute('aria-disabled')) === true\n )\n}\n\nexport function addEventListener(\n target: EventTarget,\n eventName: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n) {\n target.addEventListener(eventName, handler, options)\n return () => {\n target.removeEventListener(eventName, handler, options)\n }\n}\n","class Emitter {\n #events = {};\n on(event, listener) {\n const listeners = this.#events[event];\n if (listeners) {\n listeners.push(listener);\n } else {\n this.#events[event] = [listener];\n }\n return this;\n }\n addListener(event, listener) {\n return this.on(event, listener);\n }\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n return this;\n }\n emit(event, ...args) {\n const listeners = this.#events[event] || [];\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](...args);\n }\n return Boolean(listeners.length);\n }\n off(event, listener) {\n if (this.#events[event]) {\n this.#events[event] = this.#events[event].filter((v) => v !== listener);\n }\n return this;\n }\n removeListener(event, listener) {\n return this.off(event, listener);\n }\n removeAllListeners(event) {\n if (event) {\n delete this.#events[event];\n } else {\n this.#events = {};\n }\n return this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#events);\n }\n listeners(event) {\n return this.#events[event];\n }\n listenerCount(event) {\n return this.#events[event]?.length ?? 0;\n }\n}\n\nexport { Emitter };\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback<T = any> = (location: Location, args: T) => void\n\ntype Events<T> = {\n pushState: LocationCallback<T>\n replaceState: LocationCallback<T>\n popState: LocationCallback<\n Omit<PopStateEvent, 'state'> & { readonly state: T }\n >\n}\n\nexport class LocationObserver<T> extends Emitter<Events<T>> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.emit('popState', location, event)\n })\n }\n}\n","type Disconnect = () => void\n\nexport function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n): Disconnect {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return () => observe.disconnect()\n}\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n"],"names":["el"],"mappings":";;;;;;EAOgB,SAAA,EAAA,CACd,GACA,EAAA,UAAA,EAAA,GACG,QACuB,EAAA;EAC1B,EAAMA,MAAAA,GAAAA,GAAK,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CAAA;EAErC,EAAI,IAAA,OAAO,eAAe,QAAU,EAAA;EAClC,IAAAA,GAAG,CAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAC,CAAA,CAAA;EAAA,GACjB,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,UAAU,CAAG,EAAA;EACpC,IAAAA,GAAAA,CAAG,MAAO,CAAA,GAAG,UAAU,CAAA,CAAA;EAAA,GAClB,MAAA;EACL,IAAO,MAAA,CAAA,MAAA,CAAOA,KAAI,UAAU,CAAA,CAAA;EAC5B,IAAA,MAAA,CAAO,MAAOA,CAAAA,GAAAA,CAAG,KAAO,EAAA,UAAA,EAAY,KAAK,CAAA,CAAA;EAAA,GAC3C;EAEA,EAAA,IAAI,SAAS,MAAQ,EAAA;EACnB,IAAAA,GAAAA,CAAG,MAAO,CAAA,GAAG,QAAQ,CAAA,CAAA;EAAA,GACvB;EAEA,EAAOA,OAAAA,GAAAA,CAAAA;EACT,CAAA;EAEO,SAAS,KAAK,GAAmB,EAAA;EACtC,EAAO,OAAA,QAAA,CAAS,eAAe,GAAG,CAAA,CAAA;EACpC,CAAA;EAEO,SAAS,IAAa,GAAA;EAC3B,EAAA,OAAO,KAAK,GAAQ,CAAA,CAAA;EACtB,CAAA;EAEA,eAAsB,QAA0B,GAAA;EAC9C,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;EAC9B,IAAI,IAAA,QAAA,CAAS,cAAc,SAAW,EAAA;EACpC,MAAA,QAAA,CAAS,gBAAiB,CAAA,kBAAA,EAAoB,MAAM,OAAA,EAAW,EAAA;EAAA,QAC7D,IAAM,EAAA,IAAA;EAAA,OACP,CAAA,CAAA;EAAA,KACI,MAAA;EACL,MAAQ,OAAA,EAAA,CAAA;EAAA,KACV;EAAA,GACD,CAAA,CAAA;EACH,CAAA;EAEO,SAAS,WAAW,OAA+B,EAAA;EACxD,EAAA,OACE,OAAQ,CAAA,OAAA,CAAQ,YAAa,CAAA,UAAU,CAAC,CAAA,KAAM,IAC9C,IAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA,CAAa,eAAe,CAAC,CAAM,KAAA,IAAA,CAAA;EAEvD,CAAA;EAEO,SAAS,gBACd,CAAA,MAAA,EACA,SACA,EAAA,OAAA,EACA,OACA,EAAA;EACA,EAAO,MAAA,CAAA,gBAAA,CAAiB,SAAW,EAAA,OAAA,EAAS,OAAO,CAAA,CAAA;EACnD,EAAA,OAAO,MAAM;EACX,IAAO,MAAA,CAAA,mBAAA,CAAoB,SAAW,EAAA,OAAA,EAAS,OAAO,CAAA,CAAA;EAAA,GACxD,CAAA;EACF;;ECnEA,MAAM,OAAO,CAAC;EACd,EAAE,OAAO,GAAG,EAAE,CAAC;EACf,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE;EACtB,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EAC1C,IAAI,IAAI,SAAS,EAAE;EACnB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;EAC/B,KAAK,MAAM;EACX,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;EACvC,KAAK;EACL,IAAI,OAAO,IAAI,CAAC;EAChB,GAAG;EACH,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE;EAC/B,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;EACpC,GAAG;EACH,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE;EACxB,IAAI,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,KAAK;EACtC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;EACpC,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;EACxB,KAAK,CAAC;EACN,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;EACjC,IAAI,OAAO,IAAI,CAAC;EAChB,GAAG;EACH,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE;EACvB,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;EAChD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EAC/C,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;EAC5B,KAAK;EACL,IAAI,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;EACrC,GAAG;EACH,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE;EACvB,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;EAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC;EAC9E,KAAK;EACL,IAAI,OAAO,IAAI,CAAC;EAChB,GAAG;EACH,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE;EAClC,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;EACrC,GAAG;EACH,EAAE,kBAAkB,CAAC,KAAK,EAAE;EAC5B,IAAI,IAAI,KAAK,EAAE;EACf,MAAM,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EACjC,KAAK,MAAM;EACX,MAAM,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;EACxB,KAAK;EACL,IAAI,OAAO,IAAI,CAAC;EAChB,GAAG;EACH,EAAE,UAAU,GAAG;EACf,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;EACzC,GAAG;EACH,EAAE,SAAS,CAAC,KAAK,EAAE;EACnB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/B,GAAG;EACH,EAAE,aAAa,CAAC,KAAK,EAAE;EACvB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;EAC5C,GAAG;EACH;;EC3CO,MAAM,yBAA4B,OAAmB,CAAA;EAAA,EAC1D,WAAc,GAAA;EACZ,IAAM,KAAA,EAAA,CAAA;EAEN,IAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,MAAA,CAAA;EAC9B,IAAM,MAAA,EAAE,SAAW,EAAA,YAAA,EAAiB,GAAA,OAAA,CAAA;EAEpC,IAAQ,OAAA,CAAA,SAAA,GAAY,IAAI,IAAS,KAAA;EAC/B,MAAU,SAAA,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA;EAC7B,MAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,QAAU,EAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;EAAA,KAC1C,CAAA;EAEA,IAAQ,OAAA,CAAA,YAAA,GAAe,IAAI,IAAS,KAAA;EAClC,MAAa,YAAA,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA;EAChC,MAAA,IAAA,CAAK,IAAK,CAAA,cAAA,EAAgB,QAAU,EAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;EAAA,KAC7C,CAAA;EAEA,IAAO,MAAA,CAAA,gBAAA,CAAiB,UAAY,EAAA,CAAC,KAAU,KAAA;EAC7C,MAAK,IAAA,CAAA,IAAA,CAAK,UAAY,EAAA,QAAA,EAAU,KAAK,CAAA,CAAA;EAAA,KACtC,CAAA,CAAA;EAAA,GACH;EACF;;EC/BgB,SAAA,cAAA,CACd,EACA,EAAA,QAAA,EACA,OACY,EAAA;EACZ,EAAA,MAAM,OAAU,GAAA,IAAI,gBAAiB,CAAA,CAAC,WAAW,QAAa,KAAA;EAC5D,IAAA,KAAA,MAAW,YAAY,SAAW,EAAA;EAChC,MAAA,QAAA,CAAS,UAAU,QAAQ,CAAA,CAAA;EAAA,KAC7B;EAAA,GACD,CAAA,CAAA;EAED,EAAA,OAAA,CAAQ,QAAQ,EAAI,EAAA;EAAA,IAClB,SAAW,EAAA,IAAA;EAAA,IACX,OAAS,EAAA,IAAA;EAAA,IACT,GAAG,OAAA;EAAA,GACJ,CAAA,CAAA;EAED,EAAO,OAAA,MAAM,QAAQ,UAAW,EAAA,CAAA;EAClC,CAAA;EAEO,SAAS,WACd,CAAA,QAAA,EACA,MAAS,GAAA,QAAA,CAAS,eACN,EAAA;EACZ,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;EAC9B,IAAA,SAAS,cAAiB,GAAA;EACxB,MAAM,MAAA,EAAA,GAAK,MAAO,CAAA,aAAA,CAAiB,QAAQ,CAAA,CAAA;EAC3C,MAAA,IAAI,EAAI,EAAA;EACN,QAAA,OAAA,CAAQ,EAAE,CAAA,CAAA;EAAA,OACZ;EAAA,KACF;EAEA,IAAe,cAAA,CAAA,MAAA,EAAQ,CAAC,CAAA,EAAG,QAAa,KAAA;EACtC,MAAe,cAAA,EAAA,CAAA;EACf,MAAA,QAAA,CAAS,UAAW,EAAA,CAAA;EAAA,KACrB,CAAA,CAAA;EAAA,GACF,CAAA,CAAA;EACH;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ import { Emitter } from '@zero-dependency/emitter';
2
+ type LocationCallback<T = any> = (location: Location, args: T) => void;
3
+ type Events<T> = {
4
+ pushState: LocationCallback<T>;
5
+ replaceState: LocationCallback<T>;
6
+ popState: LocationCallback<Omit<PopStateEvent, 'state'> & {
7
+ readonly state: T;
8
+ }>;
9
+ };
10
+ export declare class LocationObserver<T> extends Emitter<Events<T>> {
11
+ constructor();
12
+ }
13
+ export {};
@@ -0,0 +1,4 @@
1
+ type Disconnect = () => void;
2
+ export declare function observeElement<T extends Element = Element>(el: T, callback: (mutation: MutationRecord, observer: MutationObserver) => void, options?: MutationObserverInit): Disconnect;
3
+ export declare function waitElement<T extends Element = Element>(selector: string, target?: HTMLElement): Promise<T>;
4
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zero-dependency/dom",
3
- "version": "0.12.0",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.umd.js",
@@ -22,19 +22,19 @@
22
22
  "url": "https://crashmax.ru"
23
23
  },
24
24
  "devDependencies": {
25
- "@crashmax/prettier-config": "^2.1.0",
26
- "@crashmax/tsconfig": "^1.0.2",
27
- "@types/node": "^18.11.9",
28
- "@vitest/coverage-c8": "^0.25.2",
29
- "@vitest/ui": "^0.25.2",
30
- "jsdom": "^20.0.3",
31
- "typescript": "^4.9.3",
32
- "vite": "^3.2.4",
33
- "vite-plugin-dts": "^1.7.1",
34
- "vitest": "^0.25.2"
25
+ "@crashmax/prettier-config": "^3.2.1",
26
+ "@crashmax/tsconfig": "^2.0.1",
27
+ "@types/node": "^18.15.11",
28
+ "@vitest/coverage-c8": "^0.29.8",
29
+ "@vitest/ui": "^0.29.8",
30
+ "jsdom": "^21.1.1",
31
+ "typescript": "^5.0.2",
32
+ "vite": "^4.2.1",
33
+ "vite-plugin-dts": "^2.1.0",
34
+ "vitest": "^0.29.8"
35
35
  },
36
36
  "dependencies": {
37
- "@zero-dependency/emitter": "1.1.1"
37
+ "@zero-dependency/emitter": "1.1.3"
38
38
  },
39
39
  "scripts": {
40
40
  "dev": "vite build --watch",
@@ -1,11 +0,0 @@
1
- import { Emitter } from '@zero-dependency/emitter';
2
- declare type LocationCallback = (location: Location, state: any) => void;
3
- declare type Events = {
4
- pushState: LocationCallback;
5
- replaceState: LocationCallback;
6
- popState: LocationCallback;
7
- };
8
- export declare class LocationObserver extends Emitter<Events> {
9
- constructor();
10
- }
11
- export {};
@@ -1 +0,0 @@
1
- export declare function observeElement<T extends Element = Element>(el: T, callback: (mutation: MutationRecord, observer: MutationObserver) => void, options?: MutationObserverInit): MutationObserver;
@@ -1 +0,0 @@
1
- export declare function waitElement<T extends Element = Element>(selector: string, target?: HTMLElement): Promise<T>;