@zero-dependency/dom 1.1.2 → 1.3.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
@@ -26,9 +26,4 @@ export declare function text(text: string): Text;
26
26
  * A non-breaking space
27
27
  */
28
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
- */
33
- export declare function domReady(): Promise<void>;
34
29
  export {};
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
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 this.#e[e]=t,t.push(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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function a(s,e,...t){const n=document.createElement(s);return typeof e=="string"?n.append(c(e)):Array.isArray(e)?n.append(...e):(Object.assign(n,e),Object.assign(n.style,e?.style)),t.length&&n.append(...t),n}function c(s){return document.createTextNode(s)}function p(){return c(" ")}class u{#e={};constructor(){const{history:e,location:t}=window,{pushState:n,replaceState:r}=e;e.pushState=(...o)=>{n.apply(e,o),this.#e?.pushState(t,o[0])},e.replaceState=(...o)=>{r.apply(e,o),this.#e?.replaceState(t,o[0])},window.addEventListener("popstate",o=>{this.#e?.popState(t,o)})}on(e,t){return this.#e[e]=t,()=>this.off(e)}off(e){delete this.#e[e]}}function i(s,e,t){const n=new MutationObserver((r,o)=>{for(const l of r)e(l,o)});return n.observe(s,{childList:!0,subtree:!0,...t}),()=>n.disconnect()}function d(s,e=document.documentElement){return new Promise(t=>{i(e,(n,r)=>{const o=e.querySelector(s);o&&(r.disconnect(),t(o))})})}exports.LocationObserver=u;exports.el=a;exports.nbsp=p;exports.observeElement=i;exports.text=c;exports.waitElement=d;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -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\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 /**\n * Add an event listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n on(t, e) {\n const s = this.#t[t] ?? [];\n return this.#t[t] = s, s.push(e), this;\n }\n /**\n * Alias for `addListener`\n */\n addListener(t, e) {\n return this.on(t, e);\n }\n /**\n * Add an event listener that will be called only once\n * @note The listener is wrapped in a wrapper function, so it cannot be equal to the original listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n once(t, e) {\n const s = (...r) => {\n this.off(t, s), e(...r);\n };\n return this.on(t, s), this;\n }\n /**\n * Emit an event\n * @param event The event name\n * @param args The arguments to pass to the listeners\n * @returns `true` if the event had listeners, `false` otherwise\n */\n emit(t, ...e) {\n const s = this.#t[t] ?? [];\n for (let r = 0; r < s.length; r++)\n s[r](...e);\n return !!s.length;\n }\n /**\n * Remove an event listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n /**\n * Alias for `off`\n */\n removeListener(t, e) {\n return this.off(t, e);\n }\n /**\n * Remove all event listeners\n * @param event The event name\n * @returns The emitter\n */\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n /**\n * Get the list of event names\n * @returns An array of event names\n */\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n /**\n * Get the list of listeners for an event\n * @param event The event name\n * @returns An array of listeners\n */\n listeners(t) {\n return this.#t[t] ?? [];\n }\n /**\n * Get the number of listeners for an event\n * @param event The event name\n * @returns The number of listeners for the event\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","r","LocationObserver","Emitter","history","location","pushState","replaceState","args","event","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","_"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/html.ts","../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","type 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> {\n #events = {} as Record<keyof Events<T>, LocationCallback<any>>\n\n constructor() {\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.#events?.pushState(location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.#events?.replaceState(location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.#events?.popState(location, event)\n })\n }\n\n on<E extends keyof Events<T>>(event: E, listener: Events<T>[E]): () => void {\n this.#events[event] = listener\n return () => this.off(event)\n }\n\n off<E extends keyof Events<T>>(event: E): void {\n delete this.#events[event]\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","LocationObserver","#events","history","location","pushState","replaceState","args","event","listener","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolve","_"],"mappings":"gFAqBgB,SAAAA,EACdC,EACAC,KACGC,EACuB,CACpBH,MAAAA,EAAK,SAAS,cAAcC,CAAG,EAEjC,OAAA,OAAOC,GAAe,SACxBF,EAAG,OAAOI,EAAKF,CAAU,CAAC,EACjB,MAAM,QAAQA,CAAU,EACjCF,EAAG,OAAO,GAAGE,CAAU,GAEhB,OAAA,OAAOF,EAAIE,CAAU,EAC5B,OAAO,OAAOF,EAAG,MAAOE,GAAY,KAAK,GAGvCC,EAAS,QACXH,EAAG,OAAO,GAAGG,CAAQ,EAGhBH,CACT,CAMO,SAASI,EAAKA,EAAoB,CAChC,OAAA,SAAS,eAAeA,CAAI,CACrC,CAKO,SAASC,GAAa,CAC3B,OAAOD,EAAK,GAAQ,CACtB,CCvCO,MAAME,CAAoB,CAC/BC,GAAU,CAAA,EAEV,aAAc,CACN,KAAA,CAAE,QAAAC,EAAS,SAAAC,CAAa,EAAA,OACxB,CAAE,UAAAC,EAAW,aAAAC,CAAiB,EAAAH,EAE5BA,EAAA,UAAY,IAAII,IAAS,CACrBF,EAAA,MAAMF,EAASI,CAAI,EAC7B,KAAKL,IAAS,UAAUE,EAAUG,EAAK,CAAC,CAAC,CAAA,EAGnCJ,EAAA,aAAe,IAAII,IAAS,CACrBD,EAAA,MAAMH,EAASI,CAAI,EAChC,KAAKL,IAAS,aAAaE,EAAUG,EAAK,CAAC,CAAC,CAAA,EAGvC,OAAA,iBAAiB,WAAaC,GAAU,CACxC,KAAAN,IAAS,SAASE,EAAUI,CAAK,CAAA,CACvC,CACH,CAEA,GAA8BA,EAAUC,EAAoC,CACrE,YAAAP,GAAQM,CAAK,EAAIC,EACf,IAAM,KAAK,IAAID,CAAK,CAC7B,CAEA,IAA+BA,EAAgB,CACtC,OAAA,KAAKN,GAAQM,CAAK,CAC3B,CACF,CCvCgB,SAAAE,EACdf,EACAgB,EACAC,EACY,CACZ,MAAMC,EAAU,IAAI,iBAAiB,CAACC,EAAWC,IAAa,CAC5D,UAAWC,KAAYF,EACrBH,EAASK,EAAUD,CAAQ,CAC7B,CACD,EAED,OAAAF,EAAQ,QAAQlB,EAAI,CAClB,UAAW,GACX,QAAS,GACT,GAAGiB,CAAA,CACJ,EAEM,IAAMC,EAAQ,YACvB,CAQO,SAASI,EACdC,EACAC,EAAS,SAAS,gBACN,CACL,OAAA,IAAI,QAASC,GAAY,CACfV,EAAAS,EAAQ,CAACE,EAAGN,IAAa,CAChC,MAAApB,EAAKwB,EAAO,cAAiBD,CAAQ,EACvCvB,IACFoB,EAAS,WAAW,EACpBK,EAAQzB,CAAE,EACZ,CACD,CAAA,CACF,CACH"}
package/dist/index.es.js CHANGED
@@ -1,149 +1,57 @@
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;
1
+ function a(s, e, ...t) {
2
+ const n = document.createElement(s);
3
+ return typeof e == "string" ? n.append(r(e)) : Array.isArray(e) ? n.append(...e) : (Object.assign(n, e), Object.assign(n.style, e?.style)), t.length && n.append(...t), n;
4
4
  }
5
- function i(s) {
5
+ function r(s) {
6
6
  return document.createTextNode(s);
7
7
  }
8
- function h() {
9
- return i(" ");
10
- }
11
- async function d() {
12
- return new Promise((s) => {
13
- document.readyState == "loading" ? document.addEventListener("DOMContentLoaded", () => s(), {
14
- once: !0
15
- }) : s();
16
- });
8
+ function l() {
9
+ return r(" ");
17
10
  }
18
11
  class u {
19
12
  #e = {};
20
- /**
21
- * Add an event listener
22
- * @param event The event name
23
- * @param listener The listener function
24
- * @returns The emitter
25
- */
26
- on(e, n) {
27
- const t = this.#e[e] ?? [];
28
- return this.#e[e] = t, t.push(n), this;
29
- }
30
- /**
31
- * Alias for `addListener`
32
- */
33
- addListener(e, n) {
34
- return this.on(e, n);
35
- }
36
- /**
37
- * Add an event listener that will be called only once
38
- * @note The listener is wrapped in a wrapper function, so it cannot be equal to the original listener
39
- * @param event The event name
40
- * @param listener The listener function
41
- * @returns The emitter
42
- */
43
- once(e, n) {
44
- const t = (...o) => {
45
- this.off(e, t), n(...o);
46
- };
47
- return this.on(e, t), this;
48
- }
49
- /**
50
- * Emit an event
51
- * @param event The event name
52
- * @param args The arguments to pass to the listeners
53
- * @returns `true` if the event had listeners, `false` otherwise
54
- */
55
- emit(e, ...n) {
56
- const t = this.#e[e] ?? [];
57
- for (let o = 0; o < t.length; o++)
58
- t[o](...n);
59
- return !!t.length;
60
- }
61
- /**
62
- * Remove an event listener
63
- * @param event The event name
64
- * @param listener The listener function
65
- * @returns The emitter
66
- */
67
- off(e, n) {
68
- return this.#e[e] && (this.#e[e] = this.#e[e].filter((t) => t !== n)), this;
69
- }
70
- /**
71
- * Alias for `off`
72
- */
73
- removeListener(e, n) {
74
- return this.off(e, n);
75
- }
76
- /**
77
- * Remove all event listeners
78
- * @param event The event name
79
- * @returns The emitter
80
- */
81
- removeAllListeners(e) {
82
- return e ? delete this.#e[e] : this.#e = {}, this;
83
- }
84
- /**
85
- * Get the list of event names
86
- * @returns An array of event names
87
- */
88
- eventNames() {
89
- return Reflect.ownKeys(this.#e);
90
- }
91
- /**
92
- * Get the list of listeners for an event
93
- * @param event The event name
94
- * @returns An array of listeners
95
- */
96
- listeners(e) {
97
- return this.#e[e] ?? [];
98
- }
99
- /**
100
- * Get the number of listeners for an event
101
- * @param event The event name
102
- * @returns The number of listeners for the event
103
- */
104
- listenerCount(e) {
105
- return this.#e[e]?.length ?? 0;
106
- }
107
- }
108
- class p extends u {
109
13
  constructor() {
110
- super();
111
- const { history: e, location: n } = window, { pushState: t, replaceState: o } = e;
112
- e.pushState = (...r) => {
113
- t.apply(e, r), this.emit("pushState", n, r[0]);
114
- }, e.replaceState = (...r) => {
115
- o.apply(e, r), this.emit("replaceState", n, r[0]);
116
- }, window.addEventListener("popstate", (r) => {
117
- this.emit("popState", n, r);
14
+ const { history: e, location: t } = window, { pushState: n, replaceState: c } = e;
15
+ e.pushState = (...o) => {
16
+ n.apply(e, o), this.#e?.pushState(t, o[0]);
17
+ }, e.replaceState = (...o) => {
18
+ c.apply(e, o), this.#e?.replaceState(t, o[0]);
19
+ }, window.addEventListener("popstate", (o) => {
20
+ this.#e?.popState(t, o);
118
21
  });
119
22
  }
23
+ on(e, t) {
24
+ return this.#e[e] = t, () => this.off(e);
25
+ }
26
+ off(e) {
27
+ delete this.#e[e];
28
+ }
120
29
  }
121
- function l(s, e, n) {
122
- const t = new MutationObserver((o, r) => {
123
- for (const c of o)
124
- e(c, r);
30
+ function p(s, e, t) {
31
+ const n = new MutationObserver((c, o) => {
32
+ for (const i of c)
33
+ e(i, o);
125
34
  });
126
- return t.observe(s, {
35
+ return n.observe(s, {
127
36
  childList: !0,
128
37
  subtree: !0,
129
- ...n
130
- }), () => t.disconnect();
38
+ ...t
39
+ }), () => n.disconnect();
131
40
  }
132
41
  function f(s, e = document.documentElement) {
133
- return new Promise((n) => {
134
- l(e, (t, o) => {
135
- const r = e.querySelector(s);
136
- r && (o.disconnect(), n(r));
42
+ return new Promise((t) => {
43
+ p(e, (n, c) => {
44
+ const o = e.querySelector(s);
45
+ o && (c.disconnect(), t(o));
137
46
  });
138
47
  });
139
48
  }
140
49
  export {
141
- p as LocationObserver,
142
- d as domReady,
50
+ u as LocationObserver,
143
51
  a as el,
144
- h as nbsp,
145
- l as observeElement,
146
- i as text,
52
+ l as nbsp,
53
+ p as observeElement,
54
+ r as text,
147
55
  f as waitElement
148
56
  };
149
57
  //# sourceMappingURL=index.es.js.map
@@ -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\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 /**\n * Add an event listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n on(t, e) {\n const s = this.#t[t] ?? [];\n return this.#t[t] = s, s.push(e), this;\n }\n /**\n * Alias for `addListener`\n */\n addListener(t, e) {\n return this.on(t, e);\n }\n /**\n * Add an event listener that will be called only once\n * @note The listener is wrapped in a wrapper function, so it cannot be equal to the original listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n once(t, e) {\n const s = (...r) => {\n this.off(t, s), e(...r);\n };\n return this.on(t, s), this;\n }\n /**\n * Emit an event\n * @param event The event name\n * @param args The arguments to pass to the listeners\n * @returns `true` if the event had listeners, `false` otherwise\n */\n emit(t, ...e) {\n const s = this.#t[t] ?? [];\n for (let r = 0; r < s.length; r++)\n s[r](...e);\n return !!s.length;\n }\n /**\n * Remove an event listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n /**\n * Alias for `off`\n */\n removeListener(t, e) {\n return this.off(t, e);\n }\n /**\n * Remove all event listeners\n * @param event The event name\n * @returns The emitter\n */\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n /**\n * Get the list of event names\n * @returns An array of event names\n */\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n /**\n * Get the list of listeners for an event\n * @param event The event name\n * @returns An array of listeners\n */\n listeners(t) {\n return this.#t[t] ?? [];\n }\n /**\n * Get the number of listeners for an event\n * @param event The event name\n * @returns The number of listeners for the event\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","r","LocationObserver","Emitter","history","location","pushState","replaceState","args","event","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","_"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/html.ts","../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","type 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> {\n #events = {} as Record<keyof Events<T>, LocationCallback<any>>\n\n constructor() {\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.#events?.pushState(location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.#events?.replaceState(location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.#events?.popState(location, event)\n })\n }\n\n on<E extends keyof Events<T>>(event: E, listener: Events<T>[E]): () => void {\n this.#events[event] = listener\n return () => this.off(event)\n }\n\n off<E extends keyof Events<T>>(event: E): void {\n delete this.#events[event]\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","LocationObserver","#events","history","location","pushState","replaceState","args","event","listener","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolve","_"],"mappings":"AAqBgB,SAAAA,EACdC,GACAC,MACGC,GACuB;AACpBH,QAAAA,IAAK,SAAS,cAAcC,CAAG;AAEjC,SAAA,OAAOC,KAAe,WACxBF,EAAG,OAAOI,EAAKF,CAAU,CAAC,IACjB,MAAM,QAAQA,CAAU,IACjCF,EAAG,OAAO,GAAGE,CAAU,KAEhB,OAAA,OAAOF,GAAIE,CAAU,GAC5B,OAAO,OAAOF,EAAG,OAAOE,GAAY,KAAK,IAGvCC,EAAS,UACXH,EAAG,OAAO,GAAGG,CAAQ,GAGhBH;AACT;AAMO,SAASI,EAAKA,GAAoB;AAChC,SAAA,SAAS,eAAeA,CAAI;AACrC;AAKO,SAASC,IAAa;AAC3B,SAAOD,EAAK,GAAQ;AACtB;ACvCO,MAAME,EAAoB;AAAA,EAC/BC,KAAU,CAAA;AAAA,EAEV,cAAc;AACN,UAAA,EAAE,SAAAC,GAAS,UAAAC,EAAa,IAAA,QACxB,EAAE,WAAAC,GAAW,cAAAC,EAAiB,IAAAH;AAE5B,IAAAA,EAAA,YAAY,IAAII,MAAS;AACrB,MAAAF,EAAA,MAAMF,GAASI,CAAI,GAC7B,KAAKL,IAAS,UAAUE,GAAUG,EAAK,CAAC,CAAC;AAAA,IAAA,GAGnCJ,EAAA,eAAe,IAAII,MAAS;AACrB,MAAAD,EAAA,MAAMH,GAASI,CAAI,GAChC,KAAKL,IAAS,aAAaE,GAAUG,EAAK,CAAC,CAAC;AAAA,IAAA,GAGvC,OAAA,iBAAiB,YAAY,CAACC,MAAU;AACxC,WAAAN,IAAS,SAASE,GAAUI,CAAK;AAAA,IAAA,CACvC;AAAA,EACH;AAAA,EAEA,GAA8BA,GAAUC,GAAoC;AACrE,gBAAAP,GAAQM,CAAK,IAAIC,GACf,MAAM,KAAK,IAAID,CAAK;AAAA,EAC7B;AAAA,EAEA,IAA+BA,GAAgB;AACtC,WAAA,KAAKN,GAAQM,CAAK;AAAA,EAC3B;AACF;ACvCgB,SAAAE,EACdf,GACAgB,GACAC,GACY;AACZ,QAAMC,IAAU,IAAI,iBAAiB,CAACC,GAAWC,MAAa;AAC5D,eAAWC,KAAYF;AACrB,MAAAH,EAASK,GAAUD,CAAQ;AAAA,EAC7B,CACD;AAED,SAAAF,EAAQ,QAAQlB,GAAI;AAAA,IAClB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,GAAGiB;AAAA,EAAA,CACJ,GAEM,MAAMC,EAAQ;AACvB;AAQO,SAASI,EACdC,GACAC,IAAS,SAAS,iBACN;AACL,SAAA,IAAI,QAAQ,CAACC,MAAY;AACf,IAAAV,EAAAS,GAAQ,CAACE,GAAGN,MAAa;AAChC,YAAApB,IAAKwB,EAAO,cAAiBD,CAAQ;AAC3C,MAAIvB,MACFoB,EAAS,WAAW,GACpBK,EAAQzB,CAAE;AAAA,IACZ,CACD;AAAA,EAAA,CACF;AACH;"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
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(o,e,...n){const t=document.createElement(o);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(o){return document.createTextNode(o)}function l(){return u(" ")}async function a(){return new Promise(o=>{document.readyState=="loading"?document.addEventListener("DOMContentLoaded",()=>o(),{once:!0}):o()})}class f{#e={};on(e,n){const t=this.#e[e]??[];return this.#e[e]=t,t.push(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=(...i)=>{t.apply(e,i),this.emit("pushState",n,i[0])},e.replaceState=(...i)=>{r.apply(e,i),this.emit("replaceState",n,i[0])},window.addEventListener("popstate",i=>{this.emit("popState",n,i)})}}function d(o,e,n){const t=new MutationObserver((r,i)=>{for(const p of r)e(p,i)});return t.observe(o,{childList:!0,subtree:!0,...n}),()=>t.disconnect()}function m(o,e=document.documentElement){return new Promise(n=>{d(e,(t,r)=>{const i=e.querySelector(o);i&&(r.disconnect(),n(i))})})}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"})});
1
+ (function(i,c){typeof exports=="object"&&typeof module<"u"?c(exports):typeof define=="function"&&define.amd?define(["exports"],c):(i=typeof globalThis<"u"?globalThis:i||self,c(i["@zero-dependency/dom"]={}))})(this,function(i){"use strict";function c(s,e,...t){const n=document.createElement(s);return typeof e=="string"?n.append(d(e)):Array.isArray(e)?n.append(...e):(Object.assign(n,e),Object.assign(n.style,e?.style)),t.length&&n.append(...t),n}function d(s){return document.createTextNode(s)}function u(){return d(" ")}class f{#e={};constructor(){const{history:e,location:t}=window,{pushState:n,replaceState:r}=e;e.pushState=(...o)=>{n.apply(e,o),this.#e?.pushState(t,o[0])},e.replaceState=(...o)=>{r.apply(e,o),this.#e?.replaceState(t,o[0])},window.addEventListener("popstate",o=>{this.#e?.popState(t,o)})}on(e,t){return this.#e[e]=t,()=>this.off(e)}off(e){delete this.#e[e]}}function l(s,e,t){const n=new MutationObserver((r,o)=>{for(const a of r)e(a,o)});return n.observe(s,{childList:!0,subtree:!0,...t}),()=>n.disconnect()}function p(s,e=document.documentElement){return new Promise(t=>{l(e,(n,r)=>{const o=e.querySelector(s);o&&(r.disconnect(),t(o))})})}i.LocationObserver=f,i.el=c,i.nbsp=u,i.observeElement=l,i.text=d,i.waitElement=p,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -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\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 /**\n * Add an event listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n on(t, e) {\n const s = this.#t[t] ?? [];\n return this.#t[t] = s, s.push(e), this;\n }\n /**\n * Alias for `addListener`\n */\n addListener(t, e) {\n return this.on(t, e);\n }\n /**\n * Add an event listener that will be called only once\n * @note The listener is wrapped in a wrapper function, so it cannot be equal to the original listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n once(t, e) {\n const s = (...r) => {\n this.off(t, s), e(...r);\n };\n return this.on(t, s), this;\n }\n /**\n * Emit an event\n * @param event The event name\n * @param args The arguments to pass to the listeners\n * @returns `true` if the event had listeners, `false` otherwise\n */\n emit(t, ...e) {\n const s = this.#t[t] ?? [];\n for (let r = 0; r < s.length; r++)\n s[r](...e);\n return !!s.length;\n }\n /**\n * Remove an event listener\n * @param event The event name\n * @param listener The listener function\n * @returns The emitter\n */\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n /**\n * Alias for `off`\n */\n removeListener(t, e) {\n return this.off(t, e);\n }\n /**\n * Remove all event listeners\n * @param event The event name\n * @returns The emitter\n */\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n /**\n * Get the list of event names\n * @returns An array of event names\n */\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n /**\n * Get the list of listeners for an event\n * @param event The event name\n * @returns An array of listeners\n */\n listeners(t) {\n return this.#t[t] ?? [];\n }\n /**\n * Get the number of listeners for an event\n * @param event The event name\n * @returns The number of listeners for the event\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","LocationObserver","Emitter","history","location","pushState","replaceState","args","event","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","_"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/html.ts","../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","type 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> {\n #events = {} as Record<keyof Events<T>, LocationCallback<any>>\n\n constructor() {\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.#events?.pushState(location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.#events?.replaceState(location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.#events?.popState(location, event)\n })\n }\n\n on<E extends keyof Events<T>>(event: E, listener: Events<T>[E]): () => void {\n this.#events[event] = listener\n return () => this.off(event)\n }\n\n off<E extends keyof Events<T>>(event: E): void {\n delete this.#events[event]\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","LocationObserver","#events","history","location","pushState","replaceState","args","event","listener","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolve","_"],"mappings":"+OAqBgB,SAAAA,EACdC,EACAC,KACGC,EACuB,CACpBH,MAAAA,EAAK,SAAS,cAAcC,CAAG,EAEjC,OAAA,OAAOC,GAAe,SACxBF,EAAG,OAAOI,EAAKF,CAAU,CAAC,EACjB,MAAM,QAAQA,CAAU,EACjCF,EAAG,OAAO,GAAGE,CAAU,GAEhB,OAAA,OAAOF,EAAIE,CAAU,EAC5B,OAAO,OAAOF,EAAG,MAAOE,GAAY,KAAK,GAGvCC,EAAS,QACXH,EAAG,OAAO,GAAGG,CAAQ,EAGhBH,CACT,CAMO,SAASI,EAAKA,EAAoB,CAChC,OAAA,SAAS,eAAeA,CAAI,CACrC,CAKO,SAASC,GAAa,CAC3B,OAAOD,EAAK,GAAQ,CACtB,CCvCO,MAAME,CAAoB,CAC/BC,GAAU,CAAA,EAEV,aAAc,CACN,KAAA,CAAE,QAAAC,EAAS,SAAAC,CAAa,EAAA,OACxB,CAAE,UAAAC,EAAW,aAAAC,CAAiB,EAAAH,EAE5BA,EAAA,UAAY,IAAII,IAAS,CACrBF,EAAA,MAAMF,EAASI,CAAI,EAC7B,KAAKL,IAAS,UAAUE,EAAUG,EAAK,CAAC,CAAC,CAAA,EAGnCJ,EAAA,aAAe,IAAII,IAAS,CACrBD,EAAA,MAAMH,EAASI,CAAI,EAChC,KAAKL,IAAS,aAAaE,EAAUG,EAAK,CAAC,CAAC,CAAA,EAGvC,OAAA,iBAAiB,WAAaC,GAAU,CACxC,KAAAN,IAAS,SAASE,EAAUI,CAAK,CAAA,CACvC,CACH,CAEA,GAA8BA,EAAUC,EAAoC,CACrE,YAAAP,GAAQM,CAAK,EAAIC,EACf,IAAM,KAAK,IAAID,CAAK,CAC7B,CAEA,IAA+BA,EAAgB,CACtC,OAAA,KAAKN,GAAQM,CAAK,CAC3B,CACF,CCvCgB,SAAAE,EACdf,EACAgB,EACAC,EACY,CACZ,MAAMC,EAAU,IAAI,iBAAiB,CAACC,EAAWC,IAAa,CAC5D,UAAWC,KAAYF,EACrBH,EAASK,EAAUD,CAAQ,CAC7B,CACD,EAED,OAAAF,EAAQ,QAAQlB,EAAI,CAClB,UAAW,GACX,QAAS,GACT,GAAGiB,CAAA,CACJ,EAEM,IAAMC,EAAQ,YACvB,CAQO,SAASI,EACdC,EACAC,EAAS,SAAS,gBACN,CACL,OAAA,IAAI,QAASC,GAAY,CACfV,EAAAS,EAAQ,CAACE,EAAGN,IAAa,CAChC,MAAApB,EAAKwB,EAAO,cAAiBD,CAAQ,EACvCvB,IACFoB,EAAS,WAAW,EACpBK,EAAQzB,CAAE,EACZ,CACD,CAAA,CACF,CACH"}
@@ -1,4 +1,3 @@
1
- import { Emitter } from '@zero-dependency/emitter';
2
1
  type LocationCallback<T = any> = (location: Location, args: T) => void;
3
2
  type Events<T> = {
4
3
  pushState: LocationCallback<T>;
@@ -15,7 +14,10 @@ type Events<T> = {
15
14
  * console.log(state.id)
16
15
  * })
17
16
  */
18
- export declare class LocationObserver<T> extends Emitter<Events<T>> {
17
+ export declare class LocationObserver<T> {
18
+ #private;
19
19
  constructor();
20
+ on<E extends keyof Events<T>>(event: E, listener: Events<T>[E]): () => void;
21
+ off<E extends keyof Events<T>>(event: E): void;
20
22
  }
21
23
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zero-dependency/dom",
3
- "version": "1.1.2",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.umd.js",
@@ -33,9 +33,6 @@
33
33
  "vite-plugin-dts": "^2.1.0",
34
34
  "vitest": "^0.29.8"
35
35
  },
36
- "dependencies": {
37
- "@zero-dependency/emitter": "1.1.5"
38
- },
39
36
  "scripts": {
40
37
  "dev": "vite build --watch",
41
38
  "build": "vite build",