@zero-dependency/dom 1.0.0 → 1.1.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/README.md +20 -0
- package/dist/html.d.ts +27 -4
- package/dist/index.cjs.js +1 -159
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +70 -119
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -165
- package/dist/index.umd.js.map +1 -1
- package/dist/location-observer.d.ts +8 -0
- package/dist/mutation-observers.d.ts +13 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,3 +19,23 @@ pnpm add @zero-dependency/dom
|
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
## Usage
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { el, observeElement, waitElement } from '@zero-dependency/dom'
|
|
25
|
+
|
|
26
|
+
// createElement
|
|
27
|
+
const element = el('div', { class: 'foo' }, 'Hello World')
|
|
28
|
+
document.body.appendChild(element)
|
|
29
|
+
|
|
30
|
+
// observeElement
|
|
31
|
+
observeElement(element, (mutation, observer) => {
|
|
32
|
+
console.log(mutation.target.textContent) // 'hello world'
|
|
33
|
+
observer.disconnect()
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
element.textContent = element.textContent.toLowerCase() // 'hello world'
|
|
37
|
+
|
|
38
|
+
// waitElement
|
|
39
|
+
const el = await waitElement('div.card')
|
|
40
|
+
console.log(el) // <div class="card">...</div>
|
|
41
|
+
```
|
package/dist/html.d.ts
CHANGED
|
@@ -2,10 +2,33 @@ type Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{
|
|
|
2
2
|
style: Partial<CSSStyleDeclaration>;
|
|
3
3
|
} & Omit<HTMLElementTagNameMap[T], 'style'>>;
|
|
4
4
|
type Children = (string | Node | HTMLElement)[];
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Create an element
|
|
7
|
+
* @param tag The tag name of the element to create
|
|
8
|
+
* @param attributes The attributes or children to set on the element
|
|
9
|
+
* @param children The children to append to the element
|
|
10
|
+
* @returns The created element
|
|
11
|
+
* @example
|
|
12
|
+
* el('div', { id: 'foo' }, 'Hello world')
|
|
13
|
+
* el('div', 'Hello world')
|
|
14
|
+
* el('div', [el('span', 'Hello'), el('span', 'world')])
|
|
15
|
+
* el('div', el('span', 'Hello world'))
|
|
16
|
+
* el('div', el('span', 'Hello'), el('span', 'world'))
|
|
17
|
+
* el('div', el('span', 'Hello world'), 'world')
|
|
18
|
+
*/
|
|
19
|
+
export declare function el<T extends keyof HTMLElementTagNameMap>(tag: T, attributes?: Attributes<T> | Children, ...children: Children): HTMLElementTagNameMap[T];
|
|
20
|
+
/**
|
|
21
|
+
* Create a text node
|
|
22
|
+
* @param text The string to create a text node from
|
|
23
|
+
*/
|
|
24
|
+
export declare function text(text: string): Text;
|
|
25
|
+
/**
|
|
26
|
+
* A non-breaking space
|
|
27
|
+
*/
|
|
7
28
|
export declare function nbsp(): Text;
|
|
29
|
+
/**
|
|
30
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event
|
|
31
|
+
* @returns A promise that resolves when the DOM is ready
|
|
32
|
+
*/
|
|
8
33
|
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;
|
|
11
34
|
export {};
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,160 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
-
|
|
5
|
-
function el(tag, attributes, ...children) {
|
|
6
|
-
const el2 = document.createElement(tag);
|
|
7
|
-
if (typeof attributes === "string") {
|
|
8
|
-
el2.append(text(attributes));
|
|
9
|
-
} else if (Array.isArray(attributes)) {
|
|
10
|
-
el2.append(...attributes);
|
|
11
|
-
} else {
|
|
12
|
-
Object.assign(el2, attributes);
|
|
13
|
-
Object.assign(el2.style, attributes?.style);
|
|
14
|
-
}
|
|
15
|
-
if (children.length) {
|
|
16
|
-
el2.append(...children);
|
|
17
|
-
}
|
|
18
|
-
return el2;
|
|
19
|
-
}
|
|
20
|
-
function text(str) {
|
|
21
|
-
return document.createTextNode(str);
|
|
22
|
-
}
|
|
23
|
-
function nbsp() {
|
|
24
|
-
return text(" ");
|
|
25
|
-
}
|
|
26
|
-
async function domReady() {
|
|
27
|
-
return new Promise((resolve) => {
|
|
28
|
-
if (document.readyState == "loading") {
|
|
29
|
-
document.addEventListener("DOMContentLoaded", () => resolve(), {
|
|
30
|
-
once: true
|
|
31
|
-
});
|
|
32
|
-
} else {
|
|
33
|
-
resolve();
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
function isDisabled(element) {
|
|
38
|
-
return Boolean(element.getAttribute("disabled")) === true || Boolean(element.getAttribute("aria-disabled")) === true;
|
|
39
|
-
}
|
|
40
|
-
function addEventListener(target, eventName, handler, options) {
|
|
41
|
-
target.addEventListener(eventName, handler, options);
|
|
42
|
-
return () => {
|
|
43
|
-
target.removeEventListener(eventName, handler, options);
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
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;
|
|
57
|
-
}
|
|
58
|
-
addListener(event, listener) {
|
|
59
|
-
return this.on(event, listener);
|
|
60
|
-
}
|
|
61
|
-
once(event, listener) {
|
|
62
|
-
const onceListener = (...args) => {
|
|
63
|
-
this.off(event, onceListener);
|
|
64
|
-
listener(...args);
|
|
65
|
-
};
|
|
66
|
-
this.on(event, onceListener);
|
|
67
|
-
return this;
|
|
68
|
-
}
|
|
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);
|
|
75
|
-
}
|
|
76
|
-
off(event, listener) {
|
|
77
|
-
if (this.#events[event]) {
|
|
78
|
-
this.#events[event] = this.#events[event].filter((v) => v !== listener);
|
|
79
|
-
}
|
|
80
|
-
return this;
|
|
81
|
-
}
|
|
82
|
-
removeListener(event, listener) {
|
|
83
|
-
return this.off(event, listener);
|
|
84
|
-
}
|
|
85
|
-
removeAllListeners(event) {
|
|
86
|
-
if (event) {
|
|
87
|
-
delete this.#events[event];
|
|
88
|
-
} else {
|
|
89
|
-
this.#events = {};
|
|
90
|
-
}
|
|
91
|
-
return this;
|
|
92
|
-
}
|
|
93
|
-
eventNames() {
|
|
94
|
-
return Reflect.ownKeys(this.#events);
|
|
95
|
-
}
|
|
96
|
-
listeners(event) {
|
|
97
|
-
return this.#events[event];
|
|
98
|
-
}
|
|
99
|
-
listenerCount(event) {
|
|
100
|
-
return this.#events[event]?.length ?? 0;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
class LocationObserver extends Emitter {
|
|
105
|
-
constructor() {
|
|
106
|
-
super();
|
|
107
|
-
const { history, location } = window;
|
|
108
|
-
const { pushState, replaceState } = history;
|
|
109
|
-
history.pushState = (...args) => {
|
|
110
|
-
pushState.apply(history, args);
|
|
111
|
-
this.emit("pushState", location, args[0]);
|
|
112
|
-
};
|
|
113
|
-
history.replaceState = (...args) => {
|
|
114
|
-
replaceState.apply(history, args);
|
|
115
|
-
this.emit("replaceState", location, args[0]);
|
|
116
|
-
};
|
|
117
|
-
window.addEventListener("popstate", (event) => {
|
|
118
|
-
this.emit("popState", location, event);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
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
|
-
|
|
151
|
-
exports.LocationObserver = LocationObserver;
|
|
152
|
-
exports.addEventListener = addEventListener;
|
|
153
|
-
exports.domReady = domReady;
|
|
154
|
-
exports.el = el;
|
|
155
|
-
exports.isDisabled = isDisabled;
|
|
156
|
-
exports.nbsp = nbsp;
|
|
157
|
-
exports.observeElement = observeElement;
|
|
158
|
-
exports.text = text;
|
|
159
|
-
exports.waitElement = waitElement;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function l(s,e,...n){const t=document.createElement(s);return typeof e=="string"?t.append(i(e)):Array.isArray(e)?t.append(...e):(Object.assign(t,e),Object.assign(t.style,e?.style)),n.length&&t.append(...n),t}function i(s){return document.createTextNode(s)}function a(){return i(" ")}async function d(){return new Promise(s=>{document.readyState=="loading"?document.addEventListener("DOMContentLoaded",()=>s(),{once:!0}):s()})}class h{#e={};on(e,n){const t=this.#e[e];return t?t.push(n):this.#e[e]=[n],this}addListener(e,n){return this.on(e,n)}once(e,n){const t=(...o)=>{this.off(e,t),n(...o)};return this.on(e,t),this}emit(e,...n){const t=this.#e[e]||[];for(let o=0;o<t.length;o++)t[o](...n);return!!t.length}off(e,n){return this.#e[e]&&(this.#e[e]=this.#e[e].filter(t=>t!==n)),this}removeListener(e,n){return this.off(e,n)}removeAllListeners(e){return e?delete this.#e[e]:this.#e={},this}eventNames(){return Reflect.ownKeys(this.#e)}listeners(e){return this.#e[e]}listenerCount(e){return this.#e[e]?.length??0}}class p extends h{constructor(){super();const{history:e,location:n}=window,{pushState:t,replaceState:o}=e;e.pushState=(...r)=>{t.apply(e,r),this.emit("pushState",n,r[0])},e.replaceState=(...r)=>{o.apply(e,r),this.emit("replaceState",n,r[0])},window.addEventListener("popstate",r=>{this.emit("popState",n,r)})}}function c(s,e,n){const t=new MutationObserver((o,r)=>{for(const u of o)e(u,r)});return t.observe(s,{childList:!0,subtree:!0,...n}),()=>t.disconnect()}function m(s,e=document.documentElement){return new Promise(n=>{c(e,(t,o)=>{const r=e.querySelector(s);r&&(o.disconnect(),n(r))})})}exports.LocationObserver=p;exports.domReady=d;exports.el=l;exports.nbsp=a;exports.observeElement=c;exports.text=i;exports.waitElement=m;
|
|
160
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";;;;AAOgB,SAAA,EAAA,CACd,GACA,EAAA,UAAA,EAAA,GACG,QACuB,EAAA;AAC1B,EAAMA,MAAAA,GAAAA,GAAK,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CAAA;AAErC,EAAI,IAAA,OAAO,eAAe,QAAU,EAAA;AAClC,IAAAA,GAAG,CAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAC,CAAA,CAAA;AAAA,GACjB,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,UAAU,CAAG,EAAA;AACpC,IAAAA,GAAAA,CAAG,MAAO,CAAA,GAAG,UAAU,CAAA,CAAA;AAAA,GAClB,MAAA;AACL,IAAO,MAAA,CAAA,MAAA,CAAOA,KAAI,UAAU,CAAA,CAAA;AAC5B,IAAA,MAAA,CAAO,MAAOA,CAAAA,GAAAA,CAAG,KAAO,EAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAAA,GAC3C;AAEA,EAAA,IAAI,SAAS,MAAQ,EAAA;AACnB,IAAAA,GAAAA,CAAG,MAAO,CAAA,GAAG,QAAQ,CAAA,CAAA;AAAA,GACvB;AAEA,EAAOA,OAAAA,GAAAA,CAAAA;AACT,CAAA;AAEO,SAAS,KAAK,GAAmB,EAAA;AACtC,EAAO,OAAA,QAAA,CAAS,eAAe,GAAG,CAAA,CAAA;AACpC,CAAA;AAEO,SAAS,IAAa,GAAA;AAC3B,EAAA,OAAO,KAAK,GAAQ,CAAA,CAAA;AACtB,CAAA;AAEA,eAAsB,QAA0B,GAAA;AAC9C,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,IAAI,IAAA,QAAA,CAAS,cAAc,SAAW,EAAA;AACpC,MAAA,QAAA,CAAS,gBAAiB,CAAA,kBAAA,EAAoB,MAAM,OAAA,EAAW,EAAA;AAAA,QAC7D,IAAM,EAAA,IAAA;AAAA,OACP,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAQ,OAAA,EAAA,CAAA;AAAA,KACV;AAAA,GACD,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,WAAW,OAA+B,EAAA;AACxD,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;AAEvD,CAAA;AAEO,SAAS,gBACd,CAAA,MAAA,EACA,SACA,EAAA,OAAA,EACA,OACA,EAAA;AACA,EAAO,MAAA,CAAA,gBAAA,CAAiB,SAAW,EAAA,OAAA,EAAS,OAAO,CAAA,CAAA;AACnD,EAAA,OAAO,MAAM;AACX,IAAO,MAAA,CAAA,mBAAA,CAAoB,SAAW,EAAA,OAAA,EAAS,OAAO,CAAA,CAAA;AAAA,GACxD,CAAA;AACF;;ACnEA,MAAM,OAAO,CAAC;AACd,EAAE,OAAO,GAAG,EAAE,CAAC;AACf,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE;AACtB,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvC,KAAK;AACL,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE;AAC/B,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACpC,GAAG;AACH,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE;AACxB,IAAI,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,KAAK;AACtC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACpC,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,KAAK,CAAC;AACN,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACjC,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE;AACvB,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAChD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/C,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5B,KAAK;AACL,IAAI,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE;AACvB,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,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;AAC9E,KAAK;AACL,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE;AAClC,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,kBAAkB,CAAC,KAAK,EAAE;AAC5B,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACjC,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AACxB,KAAK;AACL,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,EAAE,UAAU,GAAG;AACf,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,GAAG;AACH,EAAE,SAAS,CAAC,KAAK,EAAE;AACnB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/B,GAAG;AACH,EAAE,aAAa,CAAC,KAAK,EAAE;AACvB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;AAC5C,GAAG;AACH;;AC3CO,MAAM,yBAA4B,OAAmB,CAAA;AAAA,EAC1D,WAAc,GAAA;AACZ,IAAM,KAAA,EAAA,CAAA;AAEN,IAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,MAAA,CAAA;AAC9B,IAAM,MAAA,EAAE,SAAW,EAAA,YAAA,EAAiB,GAAA,OAAA,CAAA;AAEpC,IAAQ,OAAA,CAAA,SAAA,GAAY,IAAI,IAAS,KAAA;AAC/B,MAAU,SAAA,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA;AAC7B,MAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,QAAU,EAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAAA,KAC1C,CAAA;AAEA,IAAQ,OAAA,CAAA,YAAA,GAAe,IAAI,IAAS,KAAA;AAClC,MAAa,YAAA,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA;AAChC,MAAA,IAAA,CAAK,IAAK,CAAA,cAAA,EAAgB,QAAU,EAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAAA,KAC7C,CAAA;AAEA,IAAO,MAAA,CAAA,gBAAA,CAAiB,UAAY,EAAA,CAAC,KAAU,KAAA;AAC7C,MAAK,IAAA,CAAA,IAAA,CAAK,UAAY,EAAA,QAAA,EAAU,KAAK,CAAA,CAAA;AAAA,KACtC,CAAA,CAAA;AAAA,GACH;AACF;;AC/BgB,SAAA,cAAA,CACd,EACA,EAAA,QAAA,EACA,OACY,EAAA;AACZ,EAAA,MAAM,OAAU,GAAA,IAAI,gBAAiB,CAAA,CAAC,WAAW,QAAa,KAAA;AAC5D,IAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAChC,MAAA,QAAA,CAAS,UAAU,QAAQ,CAAA,CAAA;AAAA,KAC7B;AAAA,GACD,CAAA,CAAA;AAED,EAAA,OAAA,CAAQ,QAAQ,EAAI,EAAA;AAAA,IAClB,SAAW,EAAA,IAAA;AAAA,IACX,OAAS,EAAA,IAAA;AAAA,IACT,GAAG,OAAA;AAAA,GACJ,CAAA,CAAA;AAED,EAAO,OAAA,MAAM,QAAQ,UAAW,EAAA,CAAA;AAClC,CAAA;AAEO,SAAS,WACd,CAAA,QAAA,EACA,MAAS,GAAA,QAAA,CAAS,eACN,EAAA;AACZ,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,IAAA,SAAS,cAAiB,GAAA;AACxB,MAAM,MAAA,EAAA,GAAK,MAAO,CAAA,aAAA,CAAiB,QAAQ,CAAA,CAAA;AAC3C,MAAA,IAAI,EAAI,EAAA;AACN,QAAA,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,OACZ;AAAA,KACF;AAEA,IAAe,cAAA,CAAA,MAAA,EAAQ,CAAC,CAAA,EAAG,QAAa,KAAA;AACtC,MAAe,cAAA,EAAA,CAAA;AACf,MAAA,QAAA,CAAS,UAAW,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH;;;;;;;;;;;;"}
|
|
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\n/**\n * Create an element\n * @param tag The tag name of the element to create\n * @param attributes The attributes or children to set on the element\n * @param children The children to append to the element\n * @returns The created element\n * @example\n * el('div', { id: 'foo' }, 'Hello world')\n * el('div', 'Hello world')\n * el('div', [el('span', 'Hello'), el('span', 'world')])\n * el('div', el('span', 'Hello world'))\n * el('div', el('span', 'Hello'), el('span', 'world'))\n * el('div', el('span', 'Hello world'), 'world')\n */\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Attributes<T> | Children,\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\n/**\n * Create a text node\n * @param text The string to create a text node from\n */\nexport function text(text: string): Text {\n return document.createTextNode(text)\n}\n\n/**\n * A non-breaking space\n */\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event\n * @returns A promise that resolves when the DOM is ready\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","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 !!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<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\n/**\n * Observe changes to the location\n * @example\n * const observer = new LocationObserver<{ id: string }>()\n * observer.on('pushState', (location, state) => {\n * console.log(state.id)\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\n/**\n * Observe mutations on an element\n * @param el The element to observe\n * @param callback The callback to call when a mutation occurs\n * @param options The options to pass to the `MutationObserver`\n * @returns A function to disconnect the observer\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\n/**\n * Wait for an element to appear in the DOM\n * @param selector The selector to wait for\n * @param target The element to search in\n * @returns A promise that resolves when the element is found\n */\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n observeElement(target, (_, observer) => {\n const el = target.querySelector<T>(selector)\n if (el) {\n observer.disconnect()\n resolve(el)\n }\n })\n })\n}\n"],"names":["el","tag","attributes","children","text","nbsp","domReady","resolve","n","#t","t","e","s","i","LocationObserver","Emitter","history","location","pushState","replaceState","args","event","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","_"],"mappings":"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"}
|
package/dist/index.es.js
CHANGED
|
@@ -1,148 +1,99 @@
|
|
|
1
|
-
function
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
el2.append(text(attributes));
|
|
5
|
-
} else if (Array.isArray(attributes)) {
|
|
6
|
-
el2.append(...attributes);
|
|
7
|
-
} else {
|
|
8
|
-
Object.assign(el2, attributes);
|
|
9
|
-
Object.assign(el2.style, attributes?.style);
|
|
10
|
-
}
|
|
11
|
-
if (children.length) {
|
|
12
|
-
el2.append(...children);
|
|
13
|
-
}
|
|
14
|
-
return el2;
|
|
1
|
+
function a(s, e, ...n) {
|
|
2
|
+
const t = document.createElement(s);
|
|
3
|
+
return typeof e == "string" ? t.append(i(e)) : Array.isArray(e) ? t.append(...e) : (Object.assign(t, e), Object.assign(t.style, e?.style)), n.length && t.append(...n), t;
|
|
15
4
|
}
|
|
16
|
-
function
|
|
17
|
-
return document.createTextNode(
|
|
5
|
+
function i(s) {
|
|
6
|
+
return document.createTextNode(s);
|
|
18
7
|
}
|
|
19
|
-
function
|
|
20
|
-
return
|
|
8
|
+
function h() {
|
|
9
|
+
return i(" ");
|
|
21
10
|
}
|
|
22
|
-
async function
|
|
23
|
-
return new Promise((
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
});
|
|
28
|
-
} else {
|
|
29
|
-
resolve();
|
|
30
|
-
}
|
|
11
|
+
async function d() {
|
|
12
|
+
return new Promise((s) => {
|
|
13
|
+
document.readyState == "loading" ? document.addEventListener("DOMContentLoaded", () => s(), {
|
|
14
|
+
once: !0
|
|
15
|
+
}) : s();
|
|
31
16
|
});
|
|
32
17
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return () => {
|
|
39
|
-
target.removeEventListener(eventName, handler, options);
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
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;
|
|
18
|
+
class u {
|
|
19
|
+
#e = {};
|
|
20
|
+
on(e, n) {
|
|
21
|
+
const t = this.#e[e];
|
|
22
|
+
return t ? t.push(n) : this.#e[e] = [n], this;
|
|
53
23
|
}
|
|
54
|
-
addListener(
|
|
55
|
-
return this.on(
|
|
24
|
+
addListener(e, n) {
|
|
25
|
+
return this.on(e, n);
|
|
56
26
|
}
|
|
57
|
-
once(
|
|
58
|
-
const
|
|
59
|
-
this.off(
|
|
60
|
-
listener(...args);
|
|
27
|
+
once(e, n) {
|
|
28
|
+
const t = (...o) => {
|
|
29
|
+
this.off(e, t), n(...o);
|
|
61
30
|
};
|
|
62
|
-
this.on(
|
|
63
|
-
return this;
|
|
31
|
+
return this.on(e, t), this;
|
|
64
32
|
}
|
|
65
|
-
emit(
|
|
66
|
-
const
|
|
67
|
-
for (let
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return Boolean(listeners.length);
|
|
33
|
+
emit(e, ...n) {
|
|
34
|
+
const t = this.#e[e] || [];
|
|
35
|
+
for (let o = 0; o < t.length; o++)
|
|
36
|
+
t[o](...n);
|
|
37
|
+
return !!t.length;
|
|
71
38
|
}
|
|
72
|
-
off(
|
|
73
|
-
|
|
74
|
-
this.#events[event] = this.#events[event].filter((v) => v !== listener);
|
|
75
|
-
}
|
|
76
|
-
return this;
|
|
39
|
+
off(e, n) {
|
|
40
|
+
return this.#e[e] && (this.#e[e] = this.#e[e].filter((t) => t !== n)), this;
|
|
77
41
|
}
|
|
78
|
-
removeListener(
|
|
79
|
-
return this.off(
|
|
42
|
+
removeListener(e, n) {
|
|
43
|
+
return this.off(e, n);
|
|
80
44
|
}
|
|
81
|
-
removeAllListeners(
|
|
82
|
-
|
|
83
|
-
delete this.#events[event];
|
|
84
|
-
} else {
|
|
85
|
-
this.#events = {};
|
|
86
|
-
}
|
|
87
|
-
return this;
|
|
45
|
+
removeAllListeners(e) {
|
|
46
|
+
return e ? delete this.#e[e] : this.#e = {}, this;
|
|
88
47
|
}
|
|
89
48
|
eventNames() {
|
|
90
|
-
return Reflect.ownKeys(this.#
|
|
49
|
+
return Reflect.ownKeys(this.#e);
|
|
91
50
|
}
|
|
92
|
-
listeners(
|
|
93
|
-
return this.#
|
|
51
|
+
listeners(e) {
|
|
52
|
+
return this.#e[e];
|
|
94
53
|
}
|
|
95
|
-
listenerCount(
|
|
96
|
-
return this.#
|
|
54
|
+
listenerCount(e) {
|
|
55
|
+
return this.#e[e]?.length ?? 0;
|
|
97
56
|
}
|
|
98
57
|
}
|
|
99
|
-
|
|
100
|
-
class LocationObserver extends Emitter {
|
|
58
|
+
class p extends u {
|
|
101
59
|
constructor() {
|
|
102
60
|
super();
|
|
103
|
-
const { history, location } = window;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
this.emit("
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
replaceState.apply(history, args);
|
|
111
|
-
this.emit("replaceState", location, args[0]);
|
|
112
|
-
};
|
|
113
|
-
window.addEventListener("popstate", (event) => {
|
|
114
|
-
this.emit("popState", location, event);
|
|
61
|
+
const { history: e, location: n } = window, { pushState: t, replaceState: o } = e;
|
|
62
|
+
e.pushState = (...r) => {
|
|
63
|
+
t.apply(e, r), this.emit("pushState", n, r[0]);
|
|
64
|
+
}, e.replaceState = (...r) => {
|
|
65
|
+
o.apply(e, r), this.emit("replaceState", n, r[0]);
|
|
66
|
+
}, window.addEventListener("popstate", (r) => {
|
|
67
|
+
this.emit("popState", n, r);
|
|
115
68
|
});
|
|
116
69
|
}
|
|
117
70
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
callback(mutation, observer);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
observe.observe(el, {
|
|
126
|
-
childList: true,
|
|
127
|
-
subtree: true,
|
|
128
|
-
...options
|
|
71
|
+
function l(s, e, n) {
|
|
72
|
+
const t = new MutationObserver((o, r) => {
|
|
73
|
+
for (const c of o)
|
|
74
|
+
e(c, r);
|
|
129
75
|
});
|
|
130
|
-
return (
|
|
76
|
+
return t.observe(s, {
|
|
77
|
+
childList: !0,
|
|
78
|
+
subtree: !0,
|
|
79
|
+
...n
|
|
80
|
+
}), () => t.disconnect();
|
|
131
81
|
}
|
|
132
|
-
function
|
|
133
|
-
return new Promise((
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
resolve(el);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
observeElement(target, (_, observer) => {
|
|
141
|
-
resolveElement();
|
|
142
|
-
observer.disconnect();
|
|
82
|
+
function f(s, e = document.documentElement) {
|
|
83
|
+
return new Promise((n) => {
|
|
84
|
+
l(e, (t, o) => {
|
|
85
|
+
const r = e.querySelector(s);
|
|
86
|
+
r && (o.disconnect(), n(r));
|
|
143
87
|
});
|
|
144
88
|
});
|
|
145
89
|
}
|
|
146
|
-
|
|
147
|
-
|
|
90
|
+
export {
|
|
91
|
+
p as LocationObserver,
|
|
92
|
+
d as domReady,
|
|
93
|
+
a as el,
|
|
94
|
+
h as nbsp,
|
|
95
|
+
l as observeElement,
|
|
96
|
+
i as text,
|
|
97
|
+
f as waitElement
|
|
98
|
+
};
|
|
148
99
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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\n/**\n * Create an element\n * @param tag The tag name of the element to create\n * @param attributes The attributes or children to set on the element\n * @param children The children to append to the element\n * @returns The created element\n * @example\n * el('div', { id: 'foo' }, 'Hello world')\n * el('div', 'Hello world')\n * el('div', [el('span', 'Hello'), el('span', 'world')])\n * el('div', el('span', 'Hello world'))\n * el('div', el('span', 'Hello'), el('span', 'world'))\n * el('div', el('span', 'Hello world'), 'world')\n */\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Attributes<T> | Children,\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\n/**\n * Create a text node\n * @param text The string to create a text node from\n */\nexport function text(text: string): Text {\n return document.createTextNode(text)\n}\n\n/**\n * A non-breaking space\n */\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event\n * @returns A promise that resolves when the DOM is ready\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","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 !!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<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\n/**\n * Observe changes to the location\n * @example\n * const observer = new LocationObserver<{ id: string }>()\n * observer.on('pushState', (location, state) => {\n * console.log(state.id)\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\n/**\n * Observe mutations on an element\n * @param el The element to observe\n * @param callback The callback to call when a mutation occurs\n * @param options The options to pass to the `MutationObserver`\n * @returns A function to disconnect the observer\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\n/**\n * Wait for an element to appear in the DOM\n * @param selector The selector to wait for\n * @param target The element to search in\n * @returns A promise that resolves when the element is found\n */\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n observeElement(target, (_, observer) => {\n const el = target.querySelector<T>(selector)\n if (el) {\n observer.disconnect()\n resolve(el)\n }\n })\n })\n}\n"],"names":["el","tag","attributes","children","text","nbsp","domReady","resolve","n","#t","t","e","s","i","LocationObserver","Emitter","history","location","pushState","replaceState","args","event","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","_"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,166 +1,2 @@
|
|
|
1
|
-
(function (
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@zero-dependency/dom"] = {}));
|
|
5
|
-
})(this, (function (exports) { 'use strict';
|
|
6
|
-
|
|
7
|
-
function el(tag, attributes, ...children) {
|
|
8
|
-
const el2 = document.createElement(tag);
|
|
9
|
-
if (typeof attributes === "string") {
|
|
10
|
-
el2.append(text(attributes));
|
|
11
|
-
} else if (Array.isArray(attributes)) {
|
|
12
|
-
el2.append(...attributes);
|
|
13
|
-
} else {
|
|
14
|
-
Object.assign(el2, attributes);
|
|
15
|
-
Object.assign(el2.style, attributes?.style);
|
|
16
|
-
}
|
|
17
|
-
if (children.length) {
|
|
18
|
-
el2.append(...children);
|
|
19
|
-
}
|
|
20
|
-
return el2;
|
|
21
|
-
}
|
|
22
|
-
function text(str) {
|
|
23
|
-
return document.createTextNode(str);
|
|
24
|
-
}
|
|
25
|
-
function nbsp() {
|
|
26
|
-
return text(" ");
|
|
27
|
-
}
|
|
28
|
-
async function domReady() {
|
|
29
|
-
return new Promise((resolve) => {
|
|
30
|
-
if (document.readyState == "loading") {
|
|
31
|
-
document.addEventListener("DOMContentLoaded", () => resolve(), {
|
|
32
|
-
once: true
|
|
33
|
-
});
|
|
34
|
-
} else {
|
|
35
|
-
resolve();
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function isDisabled(element) {
|
|
40
|
-
return Boolean(element.getAttribute("disabled")) === true || Boolean(element.getAttribute("aria-disabled")) === true;
|
|
41
|
-
}
|
|
42
|
-
function addEventListener(target, eventName, handler, options) {
|
|
43
|
-
target.addEventListener(eventName, handler, options);
|
|
44
|
-
return () => {
|
|
45
|
-
target.removeEventListener(eventName, handler, options);
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
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;
|
|
59
|
-
}
|
|
60
|
-
addListener(event, listener) {
|
|
61
|
-
return this.on(event, listener);
|
|
62
|
-
}
|
|
63
|
-
once(event, listener) {
|
|
64
|
-
const onceListener = (...args) => {
|
|
65
|
-
this.off(event, onceListener);
|
|
66
|
-
listener(...args);
|
|
67
|
-
};
|
|
68
|
-
this.on(event, onceListener);
|
|
69
|
-
return this;
|
|
70
|
-
}
|
|
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);
|
|
77
|
-
}
|
|
78
|
-
off(event, listener) {
|
|
79
|
-
if (this.#events[event]) {
|
|
80
|
-
this.#events[event] = this.#events[event].filter((v) => v !== listener);
|
|
81
|
-
}
|
|
82
|
-
return this;
|
|
83
|
-
}
|
|
84
|
-
removeListener(event, listener) {
|
|
85
|
-
return this.off(event, listener);
|
|
86
|
-
}
|
|
87
|
-
removeAllListeners(event) {
|
|
88
|
-
if (event) {
|
|
89
|
-
delete this.#events[event];
|
|
90
|
-
} else {
|
|
91
|
-
this.#events = {};
|
|
92
|
-
}
|
|
93
|
-
return this;
|
|
94
|
-
}
|
|
95
|
-
eventNames() {
|
|
96
|
-
return Reflect.ownKeys(this.#events);
|
|
97
|
-
}
|
|
98
|
-
listeners(event) {
|
|
99
|
-
return this.#events[event];
|
|
100
|
-
}
|
|
101
|
-
listenerCount(event) {
|
|
102
|
-
return this.#events[event]?.length ?? 0;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
class LocationObserver extends Emitter {
|
|
107
|
-
constructor() {
|
|
108
|
-
super();
|
|
109
|
-
const { history, location } = window;
|
|
110
|
-
const { pushState, replaceState } = history;
|
|
111
|
-
history.pushState = (...args) => {
|
|
112
|
-
pushState.apply(history, args);
|
|
113
|
-
this.emit("pushState", location, args[0]);
|
|
114
|
-
};
|
|
115
|
-
history.replaceState = (...args) => {
|
|
116
|
-
replaceState.apply(history, args);
|
|
117
|
-
this.emit("replaceState", location, args[0]);
|
|
118
|
-
};
|
|
119
|
-
window.addEventListener("popstate", (event) => {
|
|
120
|
-
this.emit("popState", location, event);
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
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
|
-
|
|
153
|
-
exports.LocationObserver = LocationObserver;
|
|
154
|
-
exports.addEventListener = addEventListener;
|
|
155
|
-
exports.domReady = domReady;
|
|
156
|
-
exports.el = el;
|
|
157
|
-
exports.isDisabled = isDisabled;
|
|
158
|
-
exports.nbsp = nbsp;
|
|
159
|
-
exports.observeElement = observeElement;
|
|
160
|
-
exports.text = text;
|
|
161
|
-
exports.waitElement = waitElement;
|
|
162
|
-
|
|
163
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
164
|
-
|
|
165
|
-
}));
|
|
1
|
+
(function(s,c){typeof exports=="object"&&typeof module<"u"?c(exports):typeof define=="function"&&define.amd?define(["exports"],c):(s=typeof globalThis<"u"?globalThis:s||self,c(s["@zero-dependency/dom"]={}))})(this,function(s){"use strict";function c(i,e,...n){const t=document.createElement(i);return typeof e=="string"?t.append(u(e)):Array.isArray(e)?t.append(...e):(Object.assign(t,e),Object.assign(t.style,e?.style)),n.length&&t.append(...n),t}function u(i){return document.createTextNode(i)}function l(){return u(" ")}async function a(){return new Promise(i=>{document.readyState=="loading"?document.addEventListener("DOMContentLoaded",()=>i(),{once:!0}):i()})}class f{#e={};on(e,n){const t=this.#e[e];return t?t.push(n):this.#e[e]=[n],this}addListener(e,n){return this.on(e,n)}once(e,n){const t=(...r)=>{this.off(e,t),n(...r)};return this.on(e,t),this}emit(e,...n){const t=this.#e[e]||[];for(let r=0;r<t.length;r++)t[r](...n);return!!t.length}off(e,n){return this.#e[e]&&(this.#e[e]=this.#e[e].filter(t=>t!==n)),this}removeListener(e,n){return this.off(e,n)}removeAllListeners(e){return e?delete this.#e[e]:this.#e={},this}eventNames(){return Reflect.ownKeys(this.#e)}listeners(e){return this.#e[e]}listenerCount(e){return this.#e[e]?.length??0}}class h extends f{constructor(){super();const{history:e,location:n}=window,{pushState:t,replaceState:r}=e;e.pushState=(...o)=>{t.apply(e,o),this.emit("pushState",n,o[0])},e.replaceState=(...o)=>{r.apply(e,o),this.emit("replaceState",n,o[0])},window.addEventListener("popstate",o=>{this.emit("popState",n,o)})}}function d(i,e,n){const t=new MutationObserver((r,o)=>{for(const p of r)e(p,o)});return t.observe(i,{childList:!0,subtree:!0,...n}),()=>t.disconnect()}function m(i,e=document.documentElement){return new Promise(n=>{d(e,(t,r)=>{const o=e.querySelector(i);o&&(r.disconnect(),n(o))})})}s.LocationObserver=h,s.domReady=a,s.el=c,s.nbsp=l,s.observeElement=d,s.text=u,s.waitElement=m,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})});
|
|
166
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":"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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\n/**\n * Create an element\n * @param tag The tag name of the element to create\n * @param attributes The attributes or children to set on the element\n * @param children The children to append to the element\n * @returns The created element\n * @example\n * el('div', { id: 'foo' }, 'Hello world')\n * el('div', 'Hello world')\n * el('div', [el('span', 'Hello'), el('span', 'world')])\n * el('div', el('span', 'Hello world'))\n * el('div', el('span', 'Hello'), el('span', 'world'))\n * el('div', el('span', 'Hello world'), 'world')\n */\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Attributes<T> | Children,\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\n/**\n * Create a text node\n * @param text The string to create a text node from\n */\nexport function text(text: string): Text {\n return document.createTextNode(text)\n}\n\n/**\n * A non-breaking space\n */\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event\n * @returns A promise that resolves when the DOM is ready\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","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 !!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<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\n/**\n * Observe changes to the location\n * @example\n * const observer = new LocationObserver<{ id: string }>()\n * observer.on('pushState', (location, state) => {\n * console.log(state.id)\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\n/**\n * Observe mutations on an element\n * @param el The element to observe\n * @param callback The callback to call when a mutation occurs\n * @param options The options to pass to the `MutationObserver`\n * @returns A function to disconnect the observer\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\n/**\n * Wait for an element to appear in the DOM\n * @param selector The selector to wait for\n * @param target The element to search in\n * @returns A promise that resolves when the element is found\n */\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n observeElement(target, (_, observer) => {\n const el = target.querySelector<T>(selector)\n if (el) {\n observer.disconnect()\n resolve(el)\n }\n })\n })\n}\n"],"names":["el","tag","attributes","children","text","nbsp","domReady","resolve","n","#t","t","e","s","i","LocationObserver","Emitter","history","location","pushState","replaceState","args","event","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","_"],"mappings":"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"}
|
|
@@ -7,6 +7,14 @@ type Events<T> = {
|
|
|
7
7
|
readonly state: T;
|
|
8
8
|
}>;
|
|
9
9
|
};
|
|
10
|
+
/**
|
|
11
|
+
* Observe changes to the location
|
|
12
|
+
* @example
|
|
13
|
+
* const observer = new LocationObserver<{ id: string }>()
|
|
14
|
+
* observer.on('pushState', (location, state) => {
|
|
15
|
+
* console.log(state.id)
|
|
16
|
+
* })
|
|
17
|
+
*/
|
|
10
18
|
export declare class LocationObserver<T> extends Emitter<Events<T>> {
|
|
11
19
|
constructor();
|
|
12
20
|
}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
type Disconnect = () => void;
|
|
2
|
+
/**
|
|
3
|
+
* Observe mutations on an element
|
|
4
|
+
* @param el The element to observe
|
|
5
|
+
* @param callback The callback to call when a mutation occurs
|
|
6
|
+
* @param options The options to pass to the `MutationObserver`
|
|
7
|
+
* @returns A function to disconnect the observer
|
|
8
|
+
*/
|
|
2
9
|
export declare function observeElement<T extends Element = Element>(el: T, callback: (mutation: MutationRecord, observer: MutationObserver) => void, options?: MutationObserverInit): Disconnect;
|
|
10
|
+
/**
|
|
11
|
+
* Wait for an element to appear in the DOM
|
|
12
|
+
* @param selector The selector to wait for
|
|
13
|
+
* @param target The element to search in
|
|
14
|
+
* @returns A promise that resolves when the element is found
|
|
15
|
+
*/
|
|
3
16
|
export declare function waitElement<T extends Element = Element>(selector: string, target?: HTMLElement): Promise<T>;
|
|
4
17
|
export {};
|