@zero-dependency/dom 0.11.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/html.d.ts +4 -2
- package/dist/index.cjs.js +159 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.es.js +121 -138
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +165 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/location-observer.d.ts +13 -0
- package/dist/mutation-observers.d.ts +4 -0
- package/package.json +12 -12
- package/dist/fetcher.d.ts +0 -32
- package/dist/locationObserver.d.ts +0 -12
- package/dist/observeElement.d.ts +0 -1
- package/dist/waitElement.d.ts +0 -1
package/dist/html.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
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
5
|
export declare function el<T extends keyof HTMLElementTagNameMap>(tag: T, attributes?: Children | Attributes<T>, ...children: Children): HTMLElementTagNameMap[T];
|
|
6
6
|
export declare function text(str: string): Text;
|
|
7
7
|
export declare function nbsp(): Text;
|
|
8
8
|
export declare function domReady(): Promise<void>;
|
|
9
|
+
export declare function isDisabled(element: HTMLElement): boolean;
|
|
10
|
+
export declare function addEventListener(target: EventTarget, eventName: string, handler: EventListener, options?: AddEventListenerOptions): () => void;
|
|
9
11
|
export {};
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,160 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
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;
|
|
2
160
|
//# 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","../src/fetcher.ts","../src/observeElement.ts","../src/waitElement.ts","../node_modules/.pnpm/@zero-dependency+emitter@1.1.1/node_modules/@zero-dependency/emitter/dist/index.es.js","../src/locationObserver.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n","interface FetcherInit\n extends Pick<\n RequestInit,\n 'headers' | 'credentials' | 'mode' | 'cache' | 'redirect' | 'referrerPolicy'\n > {}\n\ninterface FetcherRequest extends Omit<RequestInit, 'method'> {}\n\nconst methods = [\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE'\n] as const\n\ntype RequestMethods = typeof methods[number]\ntype FetcherMethod = <T>(path: string, init?: FetcherRequest) => Promise<T>\n\nexport class Fetcher {\n get: FetcherMethod\n post: FetcherMethod\n put: FetcherMethod\n patch: FetcherMethod\n delete: FetcherMethod\n\n constructor(\n private readonly baseURL: string,\n private readonly baseInit?: FetcherInit\n ) {\n for (const method of methods) {\n // @ts-ignore\n this[method.toLowerCase()] = (path: string, init?: FetcherRequest) => {\n return this.request(path, { ...init, method })\n }\n }\n }\n\n extends(path: string, baseInit?: FetcherInit): Fetcher {\n const { url, init } = this.fetcherParameters(path, baseInit)\n return new Fetcher(url, init)\n }\n\n async request<T>(\n path: string,\n initRequest: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const { url, init } = this.fetcherParameters(path, initRequest)\n return await fetcher<T>(url, init)\n }\n\n private fetcherParameters(path: string, baseInit?: FetcherInit) {\n const url = combineURLs(this.baseURL, path)\n const headers = combineHeaders(this.baseInit?.headers, baseInit?.headers)\n const init = { ...this.baseInit, ...baseInit, headers }\n return { url, init }\n }\n}\n\nexport async function fetcher<T = unknown>(\n ...args: Parameters<typeof fetch>\n): Promise<T> {\n const response = await fetch(...args)\n const data = (await response.json()) as T\n\n if (response.ok) {\n return data\n }\n\n throw new FetcherError({\n response,\n data\n })\n}\n\nexport class FetcherError<T> extends Error {\n response: Response\n data: T\n\n constructor({ response, data }: { response: Response; data: T }) {\n super(response.statusText)\n\n this.name = 'FetcherError'\n this.response = response\n this.data = data\n }\n}\n\n// https://github.com/axios/axios/blob/v1.x/lib/helpers/combineURLs.js\nfunction combineURLs(baseURL: string, path: string): string {\n return path\n ? baseURL.replace(/\\/+$/, '') + '/' + path.replace(/^\\/+/, '')\n : baseURL\n}\n\nfunction combineHeaders(...sources: HeadersInit[]): Headers {\n const result: Record<string, string> = {}\n\n for (const source of sources) {\n const headers = new Headers(source)\n\n for (const [key, value] of headers.entries()) {\n if (value === undefined || value === null) {\n delete result[key]\n } else {\n result[key] = value\n }\n }\n }\n\n return new Headers(result)\n}\n","export function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n) {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return observe\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n","class n {\n #t = {};\n on(t, e) {\n const s = this.#t[t];\n return s ? s.push(e) : this.#t[t] = [e], this;\n }\n addListener(t, e) {\n return this.on(t, e);\n }\n once(t, e) {\n const s = (...i) => {\n this.off(t, s), e(...i);\n };\n return this.on(t, s), this;\n }\n emit(t, ...e) {\n const s = this.#t[t] || [];\n for (let i = 0; i < s.length; i++)\n s[i](...e);\n return Boolean(s.length);\n }\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n removeListener(t, e) {\n return this.off(t, e);\n }\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n listeners(t) {\n return this.#t[t];\n }\n listenerCount(t) {\n return this.#t[t]?.length ?? 0;\n }\n}\nexport {\n n as Emitter\n};\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback = (location: Location, state: any) => void\n\ntype Events = {\n pushState: LocationCallback\n replaceState: LocationCallback\n popState: LocationCallback\n}\n\nclass LocationObserver extends Emitter<Events> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', ({ state }) => {\n this.emit('popState', location, state)\n })\n }\n}\n\nexport const locationObserver = new LocationObserver()\n"],"names":["el","tag","attributes","children","text","str","nbsp","domReady","resolve","methods","Fetcher","baseURL","baseInit","method","path","init","url","initRequest","fetcher","combineURLs","headers","combineHeaders","args","response","data","FetcherError","sources","result","source","key","value","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolveElement","_","n","#t","t","e","s","i","LocationObserver","Emitter","history","location","pushState","replaceState","state","locationObserver"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/html.ts","../../emitter/dist/index.es.js","../src/location-observer.ts","../src/mutation-observers.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n\nexport function isDisabled(element: HTMLElement): boolean {\n return (\n Boolean(element.getAttribute('disabled')) === true ||\n Boolean(element.getAttribute('aria-disabled')) === true\n )\n}\n\nexport function addEventListener(\n target: EventTarget,\n eventName: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n) {\n target.addEventListener(eventName, handler, options)\n return () => {\n target.removeEventListener(eventName, handler, options)\n }\n}\n","class Emitter {\n #events = {};\n on(event, listener) {\n const listeners = this.#events[event];\n if (listeners) {\n listeners.push(listener);\n } else {\n this.#events[event] = [listener];\n }\n return this;\n }\n addListener(event, listener) {\n return this.on(event, listener);\n }\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n return this;\n }\n emit(event, ...args) {\n const listeners = this.#events[event] || [];\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](...args);\n }\n return Boolean(listeners.length);\n }\n off(event, listener) {\n if (this.#events[event]) {\n this.#events[event] = this.#events[event].filter((v) => v !== listener);\n }\n return this;\n }\n removeListener(event, listener) {\n return this.off(event, listener);\n }\n removeAllListeners(event) {\n if (event) {\n delete this.#events[event];\n } else {\n this.#events = {};\n }\n return this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#events);\n }\n listeners(event) {\n return this.#events[event];\n }\n listenerCount(event) {\n return this.#events[event]?.length ?? 0;\n }\n}\n\nexport { Emitter };\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback<T = any> = (location: Location, args: T) => void\n\ntype Events<T> = {\n pushState: LocationCallback<T>\n replaceState: LocationCallback<T>\n popState: LocationCallback<\n Omit<PopStateEvent, 'state'> & { readonly state: T }\n >\n}\n\nexport class LocationObserver<T> extends Emitter<Events<T>> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.emit('popState', location, event)\n })\n }\n}\n","type Disconnect = () => void\n\nexport function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n): Disconnect {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return () => observe.disconnect()\n}\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n"],"names":["el"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export { locationObserver } from './locationObserver.js';
|
|
5
|
-
export { observeElement } from './observeElement.js';
|
|
1
|
+
export * from './html.js';
|
|
2
|
+
export * from './location-observer.js';
|
|
3
|
+
export * from './mutation-observers.js';
|
package/dist/index.es.js
CHANGED
|
@@ -1,165 +1,148 @@
|
|
|
1
|
-
function
|
|
2
|
-
const
|
|
3
|
-
|
|
1
|
+
function el(tag, attributes, ...children) {
|
|
2
|
+
const el2 = document.createElement(tag);
|
|
3
|
+
if (typeof attributes === "string") {
|
|
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;
|
|
4
15
|
}
|
|
5
|
-
function
|
|
6
|
-
return document.createTextNode(
|
|
16
|
+
function text(str) {
|
|
17
|
+
return document.createTextNode(str);
|
|
7
18
|
}
|
|
8
|
-
function
|
|
9
|
-
return
|
|
19
|
+
function nbsp() {
|
|
20
|
+
return text(" ");
|
|
10
21
|
}
|
|
11
|
-
async function
|
|
12
|
-
return new Promise((
|
|
13
|
-
document.readyState == "loading"
|
|
14
|
-
|
|
15
|
-
|
|
22
|
+
async function domReady() {
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
if (document.readyState == "loading") {
|
|
25
|
+
document.addEventListener("DOMContentLoaded", () => resolve(), {
|
|
26
|
+
once: true
|
|
27
|
+
});
|
|
28
|
+
} else {
|
|
29
|
+
resolve();
|
|
30
|
+
}
|
|
16
31
|
});
|
|
17
32
|
}
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"POST",
|
|
21
|
-
"PUT",
|
|
22
|
-
"PATCH",
|
|
23
|
-
"DELETE"
|
|
24
|
-
];
|
|
25
|
-
class c {
|
|
26
|
-
constructor(e, t) {
|
|
27
|
-
this.baseURL = e, this.baseInit = t;
|
|
28
|
-
for (const n of u)
|
|
29
|
-
this[n.toLowerCase()] = (s, o) => this.request(s, { ...o, method: n });
|
|
30
|
-
}
|
|
31
|
-
get;
|
|
32
|
-
post;
|
|
33
|
-
put;
|
|
34
|
-
patch;
|
|
35
|
-
delete;
|
|
36
|
-
extends(e, t) {
|
|
37
|
-
const { url: n, init: s } = this.fetcherParameters(e, t);
|
|
38
|
-
return new c(n, s);
|
|
39
|
-
}
|
|
40
|
-
async request(e, t) {
|
|
41
|
-
const { url: n, init: s } = this.fetcherParameters(e, t);
|
|
42
|
-
return await h(n, s);
|
|
43
|
-
}
|
|
44
|
-
fetcherParameters(e, t) {
|
|
45
|
-
const n = d(this.baseURL, e), s = f(this.baseInit?.headers, t?.headers), o = { ...this.baseInit, ...t, headers: s };
|
|
46
|
-
return { url: n, init: o };
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
async function h(...r) {
|
|
50
|
-
const e = await fetch(...r), t = await e.json();
|
|
51
|
-
if (e.ok)
|
|
52
|
-
return t;
|
|
53
|
-
throw new l({
|
|
54
|
-
response: e,
|
|
55
|
-
data: t
|
|
56
|
-
});
|
|
33
|
+
function isDisabled(element) {
|
|
34
|
+
return Boolean(element.getAttribute("disabled")) === true || Boolean(element.getAttribute("aria-disabled")) === true;
|
|
57
35
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
36
|
+
function addEventListener(target, eventName, handler, options) {
|
|
37
|
+
target.addEventListener(eventName, handler, options);
|
|
38
|
+
return () => {
|
|
39
|
+
target.removeEventListener(eventName, handler, options);
|
|
40
|
+
};
|
|
64
41
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
return new Headers(e);
|
|
76
|
-
}
|
|
77
|
-
function p(r, e, t) {
|
|
78
|
-
const n = new MutationObserver((s, o) => {
|
|
79
|
-
for (const a of s)
|
|
80
|
-
e(a, o);
|
|
81
|
-
});
|
|
82
|
-
return n.observe(r, {
|
|
83
|
-
childList: !0,
|
|
84
|
-
subtree: !0,
|
|
85
|
-
...t
|
|
86
|
-
}), n;
|
|
87
|
-
}
|
|
88
|
-
function L(r, e = document.documentElement) {
|
|
89
|
-
return new Promise((t) => {
|
|
90
|
-
function n() {
|
|
91
|
-
const s = e.querySelector(r);
|
|
92
|
-
s && t(s);
|
|
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];
|
|
93
51
|
}
|
|
94
|
-
|
|
95
|
-
n(), o.disconnect();
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
class m {
|
|
100
|
-
#e = {};
|
|
101
|
-
on(e, t) {
|
|
102
|
-
const n = this.#e[e];
|
|
103
|
-
return n ? n.push(t) : this.#e[e] = [t], this;
|
|
52
|
+
return this;
|
|
104
53
|
}
|
|
105
|
-
addListener(
|
|
106
|
-
return this.on(
|
|
54
|
+
addListener(event, listener) {
|
|
55
|
+
return this.on(event, listener);
|
|
107
56
|
}
|
|
108
|
-
once(
|
|
109
|
-
const
|
|
110
|
-
this.off(
|
|
57
|
+
once(event, listener) {
|
|
58
|
+
const onceListener = (...args) => {
|
|
59
|
+
this.off(event, onceListener);
|
|
60
|
+
listener(...args);
|
|
111
61
|
};
|
|
112
|
-
|
|
62
|
+
this.on(event, onceListener);
|
|
63
|
+
return this;
|
|
113
64
|
}
|
|
114
|
-
emit(
|
|
115
|
-
const
|
|
116
|
-
for (let
|
|
117
|
-
|
|
118
|
-
|
|
65
|
+
emit(event, ...args) {
|
|
66
|
+
const listeners = this.#events[event] || [];
|
|
67
|
+
for (let i = 0; i < listeners.length; i++) {
|
|
68
|
+
listeners[i](...args);
|
|
69
|
+
}
|
|
70
|
+
return Boolean(listeners.length);
|
|
119
71
|
}
|
|
120
|
-
off(
|
|
121
|
-
|
|
72
|
+
off(event, listener) {
|
|
73
|
+
if (this.#events[event]) {
|
|
74
|
+
this.#events[event] = this.#events[event].filter((v) => v !== listener);
|
|
75
|
+
}
|
|
76
|
+
return this;
|
|
122
77
|
}
|
|
123
|
-
removeListener(
|
|
124
|
-
return this.off(
|
|
78
|
+
removeListener(event, listener) {
|
|
79
|
+
return this.off(event, listener);
|
|
125
80
|
}
|
|
126
|
-
removeAllListeners(
|
|
127
|
-
|
|
81
|
+
removeAllListeners(event) {
|
|
82
|
+
if (event) {
|
|
83
|
+
delete this.#events[event];
|
|
84
|
+
} else {
|
|
85
|
+
this.#events = {};
|
|
86
|
+
}
|
|
87
|
+
return this;
|
|
128
88
|
}
|
|
129
89
|
eventNames() {
|
|
130
|
-
return Reflect.ownKeys(this.#
|
|
90
|
+
return Reflect.ownKeys(this.#events);
|
|
131
91
|
}
|
|
132
|
-
listeners(
|
|
133
|
-
return this.#
|
|
92
|
+
listeners(event) {
|
|
93
|
+
return this.#events[event];
|
|
134
94
|
}
|
|
135
|
-
listenerCount(
|
|
136
|
-
return this.#
|
|
95
|
+
listenerCount(event) {
|
|
96
|
+
return this.#events[event]?.length ?? 0;
|
|
137
97
|
}
|
|
138
98
|
}
|
|
139
|
-
|
|
99
|
+
|
|
100
|
+
class LocationObserver extends Emitter {
|
|
140
101
|
constructor() {
|
|
141
102
|
super();
|
|
142
|
-
const { history
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
103
|
+
const { history, location } = window;
|
|
104
|
+
const { pushState, replaceState } = history;
|
|
105
|
+
history.pushState = (...args) => {
|
|
106
|
+
pushState.apply(history, args);
|
|
107
|
+
this.emit("pushState", location, args[0]);
|
|
108
|
+
};
|
|
109
|
+
history.replaceState = (...args) => {
|
|
110
|
+
replaceState.apply(history, args);
|
|
111
|
+
this.emit("replaceState", location, args[0]);
|
|
112
|
+
};
|
|
113
|
+
window.addEventListener("popstate", (event) => {
|
|
114
|
+
this.emit("popState", location, event);
|
|
149
115
|
});
|
|
150
116
|
}
|
|
151
117
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
118
|
+
|
|
119
|
+
function observeElement(el, callback, options) {
|
|
120
|
+
const observe = new MutationObserver((mutations, observer) => {
|
|
121
|
+
for (const mutation of mutations) {
|
|
122
|
+
callback(mutation, observer);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
observe.observe(el, {
|
|
126
|
+
childList: true,
|
|
127
|
+
subtree: true,
|
|
128
|
+
...options
|
|
129
|
+
});
|
|
130
|
+
return () => observe.disconnect();
|
|
131
|
+
}
|
|
132
|
+
function waitElement(selector, target = document.documentElement) {
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
function resolveElement() {
|
|
135
|
+
const el = target.querySelector(selector);
|
|
136
|
+
if (el) {
|
|
137
|
+
resolve(el);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
observeElement(target, (_, observer) => {
|
|
141
|
+
resolveElement();
|
|
142
|
+
observer.disconnect();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export { LocationObserver, addEventListener, domReady, el, isDisabled, nbsp, observeElement, text, waitElement };
|
|
165
148
|
//# 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","../src/fetcher.ts","../src/observeElement.ts","../src/waitElement.ts","../node_modules/.pnpm/@zero-dependency+emitter@1.1.1/node_modules/@zero-dependency/emitter/dist/index.es.js","../src/locationObserver.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n","interface FetcherInit\n extends Pick<\n RequestInit,\n 'headers' | 'credentials' | 'mode' | 'cache' | 'redirect' | 'referrerPolicy'\n > {}\n\ninterface FetcherRequest extends Omit<RequestInit, 'method'> {}\n\nconst methods = [\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE'\n] as const\n\ntype RequestMethods = typeof methods[number]\ntype FetcherMethod = <T>(path: string, init?: FetcherRequest) => Promise<T>\n\nexport class Fetcher {\n get: FetcherMethod\n post: FetcherMethod\n put: FetcherMethod\n patch: FetcherMethod\n delete: FetcherMethod\n\n constructor(\n private readonly baseURL: string,\n private readonly baseInit?: FetcherInit\n ) {\n for (const method of methods) {\n // @ts-ignore\n this[method.toLowerCase()] = (path: string, init?: FetcherRequest) => {\n return this.request(path, { ...init, method })\n }\n }\n }\n\n extends(path: string, baseInit?: FetcherInit): Fetcher {\n const { url, init } = this.fetcherParameters(path, baseInit)\n return new Fetcher(url, init)\n }\n\n async request<T>(\n path: string,\n initRequest: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const { url, init } = this.fetcherParameters(path, initRequest)\n return await fetcher<T>(url, init)\n }\n\n private fetcherParameters(path: string, baseInit?: FetcherInit) {\n const url = combineURLs(this.baseURL, path)\n const headers = combineHeaders(this.baseInit?.headers, baseInit?.headers)\n const init = { ...this.baseInit, ...baseInit, headers }\n return { url, init }\n }\n}\n\nexport async function fetcher<T = unknown>(\n ...args: Parameters<typeof fetch>\n): Promise<T> {\n const response = await fetch(...args)\n const data = (await response.json()) as T\n\n if (response.ok) {\n return data\n }\n\n throw new FetcherError({\n response,\n data\n })\n}\n\nexport class FetcherError<T> extends Error {\n response: Response\n data: T\n\n constructor({ response, data }: { response: Response; data: T }) {\n super(response.statusText)\n\n this.name = 'FetcherError'\n this.response = response\n this.data = data\n }\n}\n\n// https://github.com/axios/axios/blob/v1.x/lib/helpers/combineURLs.js\nfunction combineURLs(baseURL: string, path: string): string {\n return path\n ? baseURL.replace(/\\/+$/, '') + '/' + path.replace(/^\\/+/, '')\n : baseURL\n}\n\nfunction combineHeaders(...sources: HeadersInit[]): Headers {\n const result: Record<string, string> = {}\n\n for (const source of sources) {\n const headers = new Headers(source)\n\n for (const [key, value] of headers.entries()) {\n if (value === undefined || value === null) {\n delete result[key]\n } else {\n result[key] = value\n }\n }\n }\n\n return new Headers(result)\n}\n","export function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n) {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return observe\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n","class n {\n #t = {};\n on(t, e) {\n const s = this.#t[t];\n return s ? s.push(e) : this.#t[t] = [e], this;\n }\n addListener(t, e) {\n return this.on(t, e);\n }\n once(t, e) {\n const s = (...i) => {\n this.off(t, s), e(...i);\n };\n return this.on(t, s), this;\n }\n emit(t, ...e) {\n const s = this.#t[t] || [];\n for (let i = 0; i < s.length; i++)\n s[i](...e);\n return Boolean(s.length);\n }\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n removeListener(t, e) {\n return this.off(t, e);\n }\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n listeners(t) {\n return this.#t[t];\n }\n listenerCount(t) {\n return this.#t[t]?.length ?? 0;\n }\n}\nexport {\n n as Emitter\n};\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback = (location: Location, state: any) => void\n\ntype Events = {\n pushState: LocationCallback\n replaceState: LocationCallback\n popState: LocationCallback\n}\n\nclass LocationObserver extends Emitter<Events> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', ({ state }) => {\n this.emit('popState', location, state)\n })\n }\n}\n\nexport const locationObserver = new LocationObserver()\n"],"names":["el","tag","attributes","children","text","str","nbsp","domReady","resolve","methods","Fetcher","baseURL","baseInit","method","path","init","url","initRequest","fetcher","combineURLs","headers","combineHeaders","args","response","data","FetcherError","sources","result","source","key","value","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolveElement","_","n","#t","t","e","s","i","LocationObserver","Emitter","history","location","pushState","replaceState","state","locationObserver"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/html.ts","../../emitter/dist/index.es.js","../src/location-observer.ts","../src/mutation-observers.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n\nexport function isDisabled(element: HTMLElement): boolean {\n return (\n Boolean(element.getAttribute('disabled')) === true ||\n Boolean(element.getAttribute('aria-disabled')) === true\n )\n}\n\nexport function addEventListener(\n target: EventTarget,\n eventName: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n) {\n target.addEventListener(eventName, handler, options)\n return () => {\n target.removeEventListener(eventName, handler, options)\n }\n}\n","class Emitter {\n #events = {};\n on(event, listener) {\n const listeners = this.#events[event];\n if (listeners) {\n listeners.push(listener);\n } else {\n this.#events[event] = [listener];\n }\n return this;\n }\n addListener(event, listener) {\n return this.on(event, listener);\n }\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n return this;\n }\n emit(event, ...args) {\n const listeners = this.#events[event] || [];\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](...args);\n }\n return Boolean(listeners.length);\n }\n off(event, listener) {\n if (this.#events[event]) {\n this.#events[event] = this.#events[event].filter((v) => v !== listener);\n }\n return this;\n }\n removeListener(event, listener) {\n return this.off(event, listener);\n }\n removeAllListeners(event) {\n if (event) {\n delete this.#events[event];\n } else {\n this.#events = {};\n }\n return this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#events);\n }\n listeners(event) {\n return this.#events[event];\n }\n listenerCount(event) {\n return this.#events[event]?.length ?? 0;\n }\n}\n\nexport { Emitter };\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback<T = any> = (location: Location, args: T) => void\n\ntype Events<T> = {\n pushState: LocationCallback<T>\n replaceState: LocationCallback<T>\n popState: LocationCallback<\n Omit<PopStateEvent, 'state'> & { readonly state: T }\n >\n}\n\nexport class LocationObserver<T> extends Emitter<Events<T>> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.emit('popState', location, event)\n })\n }\n}\n","type Disconnect = () => void\n\nexport function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n): Disconnect {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return () => observe.disconnect()\n}\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n"],"names":["el"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,166 @@
|
|
|
1
|
-
(function
|
|
1
|
+
(function (global, factory) {
|
|
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
|
+
}));
|
|
2
166
|
//# 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","../src/fetcher.ts","../src/observeElement.ts","../src/waitElement.ts","../node_modules/.pnpm/@zero-dependency+emitter@1.1.1/node_modules/@zero-dependency/emitter/dist/index.es.js","../src/locationObserver.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n","interface FetcherInit\n extends Pick<\n RequestInit,\n 'headers' | 'credentials' | 'mode' | 'cache' | 'redirect' | 'referrerPolicy'\n > {}\n\ninterface FetcherRequest extends Omit<RequestInit, 'method'> {}\n\nconst methods = [\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE'\n] as const\n\ntype RequestMethods = typeof methods[number]\ntype FetcherMethod = <T>(path: string, init?: FetcherRequest) => Promise<T>\n\nexport class Fetcher {\n get: FetcherMethod\n post: FetcherMethod\n put: FetcherMethod\n patch: FetcherMethod\n delete: FetcherMethod\n\n constructor(\n private readonly baseURL: string,\n private readonly baseInit?: FetcherInit\n ) {\n for (const method of methods) {\n // @ts-ignore\n this[method.toLowerCase()] = (path: string, init?: FetcherRequest) => {\n return this.request(path, { ...init, method })\n }\n }\n }\n\n extends(path: string, baseInit?: FetcherInit): Fetcher {\n const { url, init } = this.fetcherParameters(path, baseInit)\n return new Fetcher(url, init)\n }\n\n async request<T>(\n path: string,\n initRequest: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const { url, init } = this.fetcherParameters(path, initRequest)\n return await fetcher<T>(url, init)\n }\n\n private fetcherParameters(path: string, baseInit?: FetcherInit) {\n const url = combineURLs(this.baseURL, path)\n const headers = combineHeaders(this.baseInit?.headers, baseInit?.headers)\n const init = { ...this.baseInit, ...baseInit, headers }\n return { url, init }\n }\n}\n\nexport async function fetcher<T = unknown>(\n ...args: Parameters<typeof fetch>\n): Promise<T> {\n const response = await fetch(...args)\n const data = (await response.json()) as T\n\n if (response.ok) {\n return data\n }\n\n throw new FetcherError({\n response,\n data\n })\n}\n\nexport class FetcherError<T> extends Error {\n response: Response\n data: T\n\n constructor({ response, data }: { response: Response; data: T }) {\n super(response.statusText)\n\n this.name = 'FetcherError'\n this.response = response\n this.data = data\n }\n}\n\n// https://github.com/axios/axios/blob/v1.x/lib/helpers/combineURLs.js\nfunction combineURLs(baseURL: string, path: string): string {\n return path\n ? baseURL.replace(/\\/+$/, '') + '/' + path.replace(/^\\/+/, '')\n : baseURL\n}\n\nfunction combineHeaders(...sources: HeadersInit[]): Headers {\n const result: Record<string, string> = {}\n\n for (const source of sources) {\n const headers = new Headers(source)\n\n for (const [key, value] of headers.entries()) {\n if (value === undefined || value === null) {\n delete result[key]\n } else {\n result[key] = value\n }\n }\n }\n\n return new Headers(result)\n}\n","export function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n) {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return observe\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n","class n {\n #t = {};\n on(t, e) {\n const s = this.#t[t];\n return s ? s.push(e) : this.#t[t] = [e], this;\n }\n addListener(t, e) {\n return this.on(t, e);\n }\n once(t, e) {\n const s = (...i) => {\n this.off(t, s), e(...i);\n };\n return this.on(t, s), this;\n }\n emit(t, ...e) {\n const s = this.#t[t] || [];\n for (let i = 0; i < s.length; i++)\n s[i](...e);\n return Boolean(s.length);\n }\n off(t, e) {\n return this.#t[t] && (this.#t[t] = this.#t[t].filter((s) => s !== e)), this;\n }\n removeListener(t, e) {\n return this.off(t, e);\n }\n removeAllListeners(t) {\n return t ? delete this.#t[t] : this.#t = {}, this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#t);\n }\n listeners(t) {\n return this.#t[t];\n }\n listenerCount(t) {\n return this.#t[t]?.length ?? 0;\n }\n}\nexport {\n n as Emitter\n};\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback = (location: Location, state: any) => void\n\ntype Events = {\n pushState: LocationCallback\n replaceState: LocationCallback\n popState: LocationCallback\n}\n\nclass LocationObserver extends Emitter<Events> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', ({ state }) => {\n this.emit('popState', location, state)\n })\n }\n}\n\nexport const locationObserver = new LocationObserver()\n"],"names":["el","tag","attributes","children","text","str","nbsp","domReady","resolve","methods","Fetcher","baseURL","baseInit","method","path","init","url","initRequest","fetcher","combineURLs","headers","combineHeaders","args","response","data","FetcherError","sources","result","source","key","value","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolveElement","_","n","#t","t","e","s","i","LocationObserver","Emitter","history","location","pushState","replaceState","state","locationObserver"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/html.ts","../../emitter/dist/index.es.js","../src/location-observer.ts","../src/mutation-observers.ts"],"sourcesContent":["// prettier-ignore\ntype Attributes<T extends keyof HTMLElementTagNameMap> = Partial<{\n style: Partial<CSSStyleDeclaration>\n} & Omit<HTMLElementTagNameMap[T], 'style'>>\n\ntype Children = (string | Node | HTMLElement)[]\n\nexport function el<T extends keyof HTMLElementTagNameMap>(\n tag: T,\n attributes?: Children | Attributes<T>,\n ...children: Children\n): HTMLElementTagNameMap[T] {\n const el = document.createElement(tag)\n\n if (typeof attributes === 'string') {\n el.append(text(attributes))\n } else if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\n }\n\n if (children.length) {\n el.append(...children)\n }\n\n return el\n}\n\nexport function text(str: string): Text {\n return document.createTextNode(str)\n}\n\nexport function nbsp(): Text {\n return text('\\u00a0')\n}\n\nexport async function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), {\n once: true\n })\n } else {\n resolve()\n }\n })\n}\n\nexport function isDisabled(element: HTMLElement): boolean {\n return (\n Boolean(element.getAttribute('disabled')) === true ||\n Boolean(element.getAttribute('aria-disabled')) === true\n )\n}\n\nexport function addEventListener(\n target: EventTarget,\n eventName: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n) {\n target.addEventListener(eventName, handler, options)\n return () => {\n target.removeEventListener(eventName, handler, options)\n }\n}\n","class Emitter {\n #events = {};\n on(event, listener) {\n const listeners = this.#events[event];\n if (listeners) {\n listeners.push(listener);\n } else {\n this.#events[event] = [listener];\n }\n return this;\n }\n addListener(event, listener) {\n return this.on(event, listener);\n }\n once(event, listener) {\n const onceListener = (...args) => {\n this.off(event, onceListener);\n listener(...args);\n };\n this.on(event, onceListener);\n return this;\n }\n emit(event, ...args) {\n const listeners = this.#events[event] || [];\n for (let i = 0; i < listeners.length; i++) {\n listeners[i](...args);\n }\n return Boolean(listeners.length);\n }\n off(event, listener) {\n if (this.#events[event]) {\n this.#events[event] = this.#events[event].filter((v) => v !== listener);\n }\n return this;\n }\n removeListener(event, listener) {\n return this.off(event, listener);\n }\n removeAllListeners(event) {\n if (event) {\n delete this.#events[event];\n } else {\n this.#events = {};\n }\n return this;\n }\n eventNames() {\n return Reflect.ownKeys(this.#events);\n }\n listeners(event) {\n return this.#events[event];\n }\n listenerCount(event) {\n return this.#events[event]?.length ?? 0;\n }\n}\n\nexport { Emitter };\n//# sourceMappingURL=index.es.js.map\n","import { Emitter } from '@zero-dependency/emitter'\n\ntype LocationCallback<T = any> = (location: Location, args: T) => void\n\ntype Events<T> = {\n pushState: LocationCallback<T>\n replaceState: LocationCallback<T>\n popState: LocationCallback<\n Omit<PopStateEvent, 'state'> & { readonly state: T }\n >\n}\n\nexport class LocationObserver<T> extends Emitter<Events<T>> {\n constructor() {\n super()\n\n const { history, location } = window\n const { pushState, replaceState } = history\n\n history.pushState = (...args) => {\n pushState.apply(history, args)\n this.emit('pushState', location, args[0])\n }\n\n history.replaceState = (...args) => {\n replaceState.apply(history, args)\n this.emit('replaceState', location, args[0])\n }\n\n window.addEventListener('popstate', (event) => {\n this.emit('popState', location, event)\n })\n }\n}\n","type Disconnect = () => void\n\nexport function observeElement<T extends Element = Element>(\n el: T,\n callback: (mutation: MutationRecord, observer: MutationObserver) => void,\n options?: MutationObserverInit\n): Disconnect {\n const observe = new MutationObserver((mutations, observer) => {\n for (const mutation of mutations) {\n callback(mutation, observer)\n }\n })\n\n observe.observe(el, {\n childList: true,\n subtree: true,\n ...options\n })\n\n return () => observe.disconnect()\n}\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.documentElement\n): Promise<T> {\n return new Promise((resolve) => {\n function resolveElement() {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n }\n }\n\n observeElement(target, (_, observer) => {\n resolveElement()\n observer.disconnect()\n })\n })\n}\n"],"names":["el"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Emitter } from '@zero-dependency/emitter';
|
|
2
|
+
type LocationCallback<T = any> = (location: Location, args: T) => void;
|
|
3
|
+
type Events<T> = {
|
|
4
|
+
pushState: LocationCallback<T>;
|
|
5
|
+
replaceState: LocationCallback<T>;
|
|
6
|
+
popState: LocationCallback<Omit<PopStateEvent, 'state'> & {
|
|
7
|
+
readonly state: T;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
export declare class LocationObserver<T> extends Emitter<Events<T>> {
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type Disconnect = () => void;
|
|
2
|
+
export declare function observeElement<T extends Element = Element>(el: T, callback: (mutation: MutationRecord, observer: MutationObserver) => void, options?: MutationObserverInit): Disconnect;
|
|
3
|
+
export declare function waitElement<T extends Element = Element>(selector: string, target?: HTMLElement): Promise<T>;
|
|
4
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zero-dependency/dom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"main": "./dist/index.umd.js",
|
|
@@ -22,19 +22,19 @@
|
|
|
22
22
|
"url": "https://crashmax.ru"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@crashmax/prettier-config": "^2.1
|
|
26
|
-
"@crashmax/tsconfig": "^
|
|
27
|
-
"@types/node": "^18.11
|
|
28
|
-
"@vitest/coverage-c8": "^0.
|
|
29
|
-
"@vitest/ui": "^0.
|
|
30
|
-
"jsdom": "^
|
|
31
|
-
"typescript": "^
|
|
32
|
-
"vite": "^
|
|
33
|
-
"vite-plugin-dts": "^1.
|
|
34
|
-
"vitest": "^0.
|
|
25
|
+
"@crashmax/prettier-config": "^3.2.1",
|
|
26
|
+
"@crashmax/tsconfig": "^2.0.1",
|
|
27
|
+
"@types/node": "^18.15.11",
|
|
28
|
+
"@vitest/coverage-c8": "^0.29.8",
|
|
29
|
+
"@vitest/ui": "^0.29.8",
|
|
30
|
+
"jsdom": "^21.1.1",
|
|
31
|
+
"typescript": "^5.0.2",
|
|
32
|
+
"vite": "^4.2.1",
|
|
33
|
+
"vite-plugin-dts": "^2.1.0",
|
|
34
|
+
"vitest": "^0.29.8"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@zero-dependency/emitter": "1.1.
|
|
37
|
+
"@zero-dependency/emitter": "1.1.3"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
40
|
"dev": "vite build --watch",
|
package/dist/fetcher.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
interface FetcherInit extends Pick<RequestInit, 'headers' | 'credentials' | 'mode' | 'cache' | 'redirect' | 'referrerPolicy'> {
|
|
2
|
-
}
|
|
3
|
-
interface FetcherRequest extends Omit<RequestInit, 'method'> {
|
|
4
|
-
}
|
|
5
|
-
declare const methods: readonly ["GET", "POST", "PUT", "PATCH", "DELETE"];
|
|
6
|
-
declare type RequestMethods = typeof methods[number];
|
|
7
|
-
declare type FetcherMethod = <T>(path: string, init?: FetcherRequest) => Promise<T>;
|
|
8
|
-
export declare class Fetcher {
|
|
9
|
-
private readonly baseURL;
|
|
10
|
-
private readonly baseInit?;
|
|
11
|
-
get: FetcherMethod;
|
|
12
|
-
post: FetcherMethod;
|
|
13
|
-
put: FetcherMethod;
|
|
14
|
-
patch: FetcherMethod;
|
|
15
|
-
delete: FetcherMethod;
|
|
16
|
-
constructor(baseURL: string, baseInit?: FetcherInit);
|
|
17
|
-
extends(path: string, baseInit?: FetcherInit): Fetcher;
|
|
18
|
-
request<T>(path: string, initRequest: FetcherRequest & {
|
|
19
|
-
method: RequestMethods;
|
|
20
|
-
}): Promise<T>;
|
|
21
|
-
private fetcherParameters;
|
|
22
|
-
}
|
|
23
|
-
export declare function fetcher<T = unknown>(...args: Parameters<typeof fetch>): Promise<T>;
|
|
24
|
-
export declare class FetcherError<T> extends Error {
|
|
25
|
-
response: Response;
|
|
26
|
-
data: T;
|
|
27
|
-
constructor({ response, data }: {
|
|
28
|
-
response: Response;
|
|
29
|
-
data: T;
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Emitter } from '@zero-dependency/emitter';
|
|
2
|
-
declare type LocationCallback = (location: Location, state: any) => void;
|
|
3
|
-
declare type Events = {
|
|
4
|
-
pushState: LocationCallback;
|
|
5
|
-
replaceState: LocationCallback;
|
|
6
|
-
popState: LocationCallback;
|
|
7
|
-
};
|
|
8
|
-
declare class LocationObserver extends Emitter<Events> {
|
|
9
|
-
constructor();
|
|
10
|
-
}
|
|
11
|
-
export declare const locationObserver: LocationObserver;
|
|
12
|
-
export {};
|
package/dist/observeElement.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function observeElement<T extends Element = Element>(el: T, callback: (mutation: MutationRecord, observer: MutationObserver) => void, options?: MutationObserverInit): MutationObserver;
|
package/dist/waitElement.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function waitElement<T extends Element = Element>(selector: string, target?: HTMLElement): Promise<T>;
|