@zero-dependency/dom 0.9.0 → 0.10.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/fetcher.d.ts +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.es.js +111 -59
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/locationObserver.d.ts +12 -0
- package/dist/observeElement.d.ts +1 -1
- package/package.json +4 -1
package/dist/fetcher.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class Fetcher {
|
|
|
12
12
|
put: <T>(path: string, init?: FetcherRequest) => Promise<T>;
|
|
13
13
|
patch: <T>(path: string, init?: FetcherRequest) => Promise<T>;
|
|
14
14
|
delete: <T>(path: string, init?: FetcherRequest) => Promise<T>;
|
|
15
|
-
constructor(baseURL: string, baseInit?: FetcherInit
|
|
15
|
+
constructor(baseURL: string, baseInit?: FetcherInit);
|
|
16
16
|
request<T>(path: string, init: FetcherRequest & {
|
|
17
17
|
method: RequestMethods;
|
|
18
18
|
}): Promise<T>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { observeElement } from './observeElement.js';
|
|
2
|
-
export { waitElement } from './waitElement.js';
|
|
3
1
|
export { el, text, nbsp, domReady } from './html.js';
|
|
4
2
|
export { fetcher, Fetcher, FetcherError } from './fetcher.js';
|
|
3
|
+
export { waitElement } from './waitElement.js';
|
|
4
|
+
export { locationObserver } from './locationObserver.js';
|
|
5
|
+
export { observeElement } from './observeElement.js';
|
package/dist/index.es.js
CHANGED
|
@@ -1,57 +1,32 @@
|
|
|
1
|
-
function
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
const c = o.target.querySelector(s);
|
|
5
|
-
c && e(c);
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
return n.observe(t, {
|
|
9
|
-
attributes: !0,
|
|
10
|
-
childList: !0,
|
|
11
|
-
subtree: !0
|
|
12
|
-
}), n;
|
|
13
|
-
}
|
|
14
|
-
function l(s, e = document.body) {
|
|
15
|
-
return new Promise((t) => {
|
|
16
|
-
const n = e.querySelector(s);
|
|
17
|
-
n ? t(n) : a(
|
|
18
|
-
s,
|
|
19
|
-
(r, o) => {
|
|
20
|
-
o.disconnect(), t(r);
|
|
21
|
-
},
|
|
22
|
-
e
|
|
23
|
-
);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
function m(s, e, ...t) {
|
|
27
|
-
const n = document.createElement(s);
|
|
28
|
-
return Array.isArray(e) ? n.append(...e) : (Object.assign(n, e), Object.assign(n.style, e?.style), n.append(...t)), n;
|
|
1
|
+
function m(r, e, ...t) {
|
|
2
|
+
const s = document.createElement(r);
|
|
3
|
+
return Array.isArray(e) ? s.append(...e) : (Object.assign(s, e), Object.assign(s.style, e?.style), s.append(...t)), s;
|
|
29
4
|
}
|
|
30
|
-
function
|
|
31
|
-
return document.createTextNode(
|
|
5
|
+
function c(r) {
|
|
6
|
+
return document.createTextNode(r);
|
|
32
7
|
}
|
|
33
|
-
function
|
|
34
|
-
return
|
|
8
|
+
function w() {
|
|
9
|
+
return c("\xA0");
|
|
35
10
|
}
|
|
36
|
-
async function
|
|
37
|
-
return new Promise((
|
|
38
|
-
document.readyState == "loading" ? document.addEventListener("DOMContentLoaded", () =>
|
|
11
|
+
async function y() {
|
|
12
|
+
return new Promise((r) => {
|
|
13
|
+
document.readyState == "loading" ? document.addEventListener("DOMContentLoaded", () => r(), {
|
|
39
14
|
once: !0
|
|
40
|
-
}) :
|
|
15
|
+
}) : r();
|
|
41
16
|
});
|
|
42
17
|
}
|
|
43
|
-
const
|
|
18
|
+
const a = [
|
|
44
19
|
"GET",
|
|
45
20
|
"POST",
|
|
46
21
|
"PUT",
|
|
47
22
|
"PATCH",
|
|
48
23
|
"DELETE"
|
|
49
24
|
];
|
|
50
|
-
class
|
|
25
|
+
class E {
|
|
51
26
|
constructor(e, t) {
|
|
52
27
|
this.baseURL = e, this.baseInit = t;
|
|
53
|
-
for (const
|
|
54
|
-
this[
|
|
28
|
+
for (const s of a)
|
|
29
|
+
this[s.toLowerCase()] = (n, o) => this.request(n, { ...o, method: s });
|
|
55
30
|
}
|
|
56
31
|
get;
|
|
57
32
|
post;
|
|
@@ -59,44 +34,121 @@ class w {
|
|
|
59
34
|
patch;
|
|
60
35
|
delete;
|
|
61
36
|
async request(e, t) {
|
|
62
|
-
const
|
|
63
|
-
return await
|
|
37
|
+
const s = new URL(e, this.baseURL), n = l(this.baseInit?.headers, t.headers);
|
|
38
|
+
return await u(s, { ...this.baseInit, ...t, headers: n });
|
|
64
39
|
}
|
|
65
40
|
}
|
|
66
|
-
async function
|
|
67
|
-
const e = await fetch(...
|
|
41
|
+
async function u(...r) {
|
|
42
|
+
const e = await fetch(...r), t = await e.json();
|
|
68
43
|
if (e.ok)
|
|
69
44
|
return t;
|
|
70
|
-
throw new
|
|
45
|
+
throw new h({
|
|
71
46
|
response: e,
|
|
72
47
|
data: t
|
|
73
48
|
});
|
|
74
49
|
}
|
|
75
|
-
class
|
|
50
|
+
class h extends Error {
|
|
76
51
|
response;
|
|
77
52
|
data;
|
|
78
53
|
constructor({ response: e, data: t }) {
|
|
79
54
|
super(e.statusText), this.name = "FetcherError", this.response = e, this.data = t;
|
|
80
55
|
}
|
|
81
56
|
}
|
|
82
|
-
function
|
|
57
|
+
function l(...r) {
|
|
83
58
|
const e = {};
|
|
84
|
-
for (const t of
|
|
85
|
-
const
|
|
86
|
-
for (const [
|
|
87
|
-
o == null ? delete e[
|
|
59
|
+
for (const t of r) {
|
|
60
|
+
const s = new Headers(t);
|
|
61
|
+
for (const [n, o] of s.entries())
|
|
62
|
+
o == null ? delete e[n] : e[n] = o;
|
|
88
63
|
}
|
|
89
64
|
return new Headers(e);
|
|
90
65
|
}
|
|
66
|
+
function d(r, e, t) {
|
|
67
|
+
const s = new MutationObserver((n, o) => {
|
|
68
|
+
for (const i of n)
|
|
69
|
+
e(i, o);
|
|
70
|
+
});
|
|
71
|
+
return s.observe(r, {
|
|
72
|
+
childList: !0,
|
|
73
|
+
subtree: !0,
|
|
74
|
+
...t
|
|
75
|
+
}), s;
|
|
76
|
+
}
|
|
77
|
+
function v(r, e = document.documentElement) {
|
|
78
|
+
return new Promise((t) => {
|
|
79
|
+
function s() {
|
|
80
|
+
const n = e.querySelector(r);
|
|
81
|
+
n && t(n);
|
|
82
|
+
}
|
|
83
|
+
d(e, (n, o) => {
|
|
84
|
+
s(), o.disconnect();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
class f {
|
|
89
|
+
#e = {};
|
|
90
|
+
on(e, t) {
|
|
91
|
+
const s = this.#e[e];
|
|
92
|
+
return s ? s.push(t) : this.#e[e] = [t], this;
|
|
93
|
+
}
|
|
94
|
+
addListener(e, t) {
|
|
95
|
+
return this.on(e, t);
|
|
96
|
+
}
|
|
97
|
+
once(e, t) {
|
|
98
|
+
const s = (...n) => {
|
|
99
|
+
this.off(e, s), t(...n);
|
|
100
|
+
};
|
|
101
|
+
return this.on(e, s), this;
|
|
102
|
+
}
|
|
103
|
+
emit(e, ...t) {
|
|
104
|
+
const s = this.#e[e] || [];
|
|
105
|
+
for (let n = 0; n < s.length; n++)
|
|
106
|
+
s[n](...t);
|
|
107
|
+
return Boolean(s.length);
|
|
108
|
+
}
|
|
109
|
+
off(e, t) {
|
|
110
|
+
return this.#e[e] && (this.#e[e] = this.#e[e].filter((s) => s !== t)), this;
|
|
111
|
+
}
|
|
112
|
+
removeListener(e, t) {
|
|
113
|
+
return this.off(e, t);
|
|
114
|
+
}
|
|
115
|
+
removeAllListeners(e) {
|
|
116
|
+
return e ? delete this.#e[e] : this.#e = {}, this;
|
|
117
|
+
}
|
|
118
|
+
eventNames() {
|
|
119
|
+
return Reflect.ownKeys(this.#e);
|
|
120
|
+
}
|
|
121
|
+
listeners(e) {
|
|
122
|
+
return this.#e[e];
|
|
123
|
+
}
|
|
124
|
+
listenerCount(e) {
|
|
125
|
+
return this.#e[e]?.length ?? 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
class p extends f {
|
|
129
|
+
constructor() {
|
|
130
|
+
super();
|
|
131
|
+
const { history: e, location: t } = window, { pushState: s, replaceState: n } = e;
|
|
132
|
+
e.pushState = (...o) => {
|
|
133
|
+
s.apply(e, o), this.emit("pushState", t, o[0]);
|
|
134
|
+
}, e.replaceState = (...o) => {
|
|
135
|
+
n.apply(e, o), this.emit("replaceState", t, o[0]);
|
|
136
|
+
}, window.addEventListener("popstate", ({ state: o }) => {
|
|
137
|
+
this.emit("popState", t, o);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const L = new p();
|
|
91
142
|
export {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
143
|
+
E as Fetcher,
|
|
144
|
+
h as FetcherError,
|
|
145
|
+
y as domReady,
|
|
95
146
|
m as el,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
147
|
+
u as fetcher,
|
|
148
|
+
L as locationObserver,
|
|
149
|
+
w as nbsp,
|
|
150
|
+
d as observeElement,
|
|
151
|
+
c as text,
|
|
152
|
+
v as waitElement
|
|
101
153
|
};
|
|
102
154
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/observeElement.ts","../src/waitElement.ts","../src/html.ts","../src/fetcher.ts"],"sourcesContent":["export function observeElement<T extends Element = Element>(\n selector: string,\n callback: (el: T) => void,\n target = document.body\n): MutationObserver {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n const el = (mutation.target as T).querySelector<T>(selector)\n if (el) {\n callback(el)\n }\n }\n })\n\n observer.observe(target, {\n attributes: true,\n childList: true,\n subtree: true\n })\n\n return observer\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.body\n): Promise<T> {\n return new Promise((resolve) => {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n } else {\n observeElement<T>(\n selector,\n (el, observer) => {\n observer.disconnect()\n resolve(el)\n },\n target\n )\n }\n })\n}\n","// 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 if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\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]\n\nexport class Fetcher {\n get: <T>(path: string, init?: FetcherRequest) => Promise<T>\n post: <T>(path: string, init?: FetcherRequest) => Promise<T>\n put: <T>(path: string, init?: FetcherRequest) => Promise<T>\n patch: <T>(path: string, init?: FetcherRequest) => Promise<T>\n delete: <T>(path: string, init?: FetcherRequest) => Promise<T>\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 this.request(path, { ...init, method })\n }\n }\n\n async request<T>(\n path: string,\n init: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const url = new URL(path, this.baseURL)\n const headers = mergeHeaders(this.baseInit?.headers!, init.headers!)\n return await fetcher<T>(url, { ...this.baseInit, ...init, headers })\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\nfunction mergeHeaders(...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"],"names":["observeElement","selector","callback","target","observer","mutations","mutation","el","waitElement","resolve","tag","attributes","children","text","str","nbsp","domReady","methods","Fetcher","baseURL","baseInit","method","path","init","url","headers","mergeHeaders","fetcher","args","response","data","FetcherError","sources","result","source","key","value"],"mappings":"AAAO,SAASA,EACdC,GACAC,GACAC,IAAS,SAAS,MACA;AAClB,QAAMC,IAAW,IAAI,iBAAiB,CAACC,MAAc;AACnD,eAAWC,KAAYD,GAAW;AAChC,YAAME,IAAMD,EAAS,OAAa,cAAiBL,CAAQ;AAC3D,MAAIM,KACFL,EAASK,CAAE;AAAA,IAEf;AAAA,EAAA,CACD;AAED,SAAAH,EAAS,QAAQD,GAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA,CACV,GAEMC;AACT;ACnBO,SAASI,EACdP,GACAE,IAAS,SAAS,MACN;AACL,SAAA,IAAI,QAAQ,CAACM,MAAY;AACxB,UAAAF,IAAKJ,EAAO,cAAiBF,CAAQ;AAC3C,IAAIM,IACFE,EAAQF,CAAE,IAEVP;AAAA,MACEC;AAAA,MACA,CAACM,GAAIH,MAAa;AAChB,QAAAA,EAAS,WAAW,GACpBK,EAAQF,CAAE;AAAA,MACZ;AAAA,MACAJ;AAAA,IAAA;AAAA,EAEJ,CACD;AACH;ACdgB,SAAAI,EACdG,GACAC,MACGC,GACuB;AACpBL,QAAAA,IAAK,SAAS,cAAcG,CAAG;AACjC,SAAA,MAAM,QAAQC,CAAU,IAC1BJ,EAAG,OAAO,GAAGI,CAAU,KAEhB,OAAA,OAAOJ,GAAII,CAAU,GAC5B,OAAO,OAAOJ,EAAG,OAAOI,GAAY,KAAK,GACzCJ,EAAG,OAAO,GAAGK,CAAQ,IAGhBL;AACT;AAEO,SAASM,EAAKC,GAAmB;AAC/B,SAAA,SAAS,eAAeA,CAAG;AACpC;AAEO,SAASC,IAAa;AAC3B,SAAOF,EAAK,MAAQ;AACtB;AAEA,eAAsBG,IAA0B;AACvC,SAAA,IAAI,QAAQ,CAACP,MAAY;AAC1B,IAAA,SAAS,cAAc,YACzB,SAAS,iBAAiB,oBAAoB,MAAMA,EAAA,GAAW;AAAA,MAC7D,MAAM;AAAA,IAAA,CACP,IAEOA;EACV,CACD;AACH;AClCA,MAAMQ,IAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAMC,EAAQ;AAAA,EAOnB,YACmBC,GACAC,GACjB;AAFiB,SAAA,UAAAD,GACA,KAAA,WAAAC;AAEjB,eAAWC,KAAUJ;AAEnB,WAAKI,EAAO,YAAiB,KAAA,CAACC,GAAcC,MAC1C,KAAK,QAAQD,GAAM,EAAE,GAAGC,GAAM,QAAAF,EAAQ,CAAA;AAAA,EAE5C;AAAA,EAfA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAaA,MAAM,QACJC,GACAC,GACY;AACZ,UAAMC,IAAM,IAAI,IAAIF,GAAM,KAAK,OAAO,GAChCG,IAAUC,EAAa,KAAK,UAAU,SAAUH,EAAK,OAAQ;AAC5D,WAAA,MAAMI,EAAWH,GAAK,EAAE,GAAG,KAAK,UAAU,GAAGD,GAAM,SAAAE,EAAA,CAAS;AAAA,EACrE;AACF;AAEA,eAAsBE,KACjBC,GACS;AACZ,QAAMC,IAAW,MAAM,MAAM,GAAGD,CAAI,GAC9BE,IAAQ,MAAMD,EAAS;AAE7B,MAAIA,EAAS;AACJ,WAAAC;AAGT,QAAM,IAAIC,EAAa;AAAA,IACrB,UAAAF;AAAA,IACA,MAAAC;AAAA,EAAA,CACD;AACH;AAEO,MAAMC,UAAwB,MAAM;AAAA,EACzC;AAAA,EACA;AAAA,EAEA,YAAY,EAAE,UAAAF,GAAU,MAAAC,KAAyC;AAC/D,UAAMD,EAAS,UAAU,GAEzB,KAAK,OAAO,gBACZ,KAAK,WAAWA,GAChB,KAAK,OAAOC;AAAA,EACd;AACF;AAEA,SAASJ,KAAgBM,GAAiC;AACxD,QAAMC,IAAiC,CAAA;AAEvC,aAAWC,KAAUF,GAAS;AACtB,UAAAP,IAAU,IAAI,QAAQS,CAAM;AAElC,eAAW,CAACC,GAAKC,CAAK,KAAKX,EAAQ;AAC7B,MAAuBW,KAAU,OACnC,OAAOH,EAAOE,KAEdF,EAAOE,KAAOC;AAAA,EAGpB;AAEO,SAAA,IAAI,QAAQH,CAAM;AAC3B;"}
|
|
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 if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\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]\n\nexport class Fetcher {\n get: <T>(path: string, init?: FetcherRequest) => Promise<T>\n post: <T>(path: string, init?: FetcherRequest) => Promise<T>\n put: <T>(path: string, init?: FetcherRequest) => Promise<T>\n patch: <T>(path: string, init?: FetcherRequest) => Promise<T>\n delete: <T>(path: string, init?: FetcherRequest) => Promise<T>\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 this.request(path, { ...init, method })\n }\n }\n\n async request<T>(\n path: string,\n init: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const url = new URL(path, this.baseURL)\n const headers = mergeHeaders(this.baseInit?.headers!, init.headers!)\n return await fetcher<T>(url, { ...this.baseInit, ...init, headers })\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\nfunction mergeHeaders(...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","headers","mergeHeaders","fetcher","args","response","data","FetcherError","sources","result","source","key","value","observeElement","callback","options","observe","mutations","observer","mutation","waitElement","selector","target","resolveElement","_","n","#t","t","e","i","LocationObserver","Emitter","history","location","pushState","replaceState","state","locationObserver"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(
|
|
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(r,e,...t){const n=document.createElement(r);return Array.isArray(e)?n.append(...e):(Object.assign(n,e),Object.assign(n.style,e?.style),n.append(...t)),n}function a(r){return document.createTextNode(r)}function l(){return a("\xA0")}async function f(){return new Promise(r=>{document.readyState=="loading"?document.addEventListener("DOMContentLoaded",()=>r(),{once:!0}):r()})}const m=["GET","POST","PUT","PATCH","DELETE"];class p{constructor(e,t){this.baseURL=e,this.baseInit=t;for(const n of m)this[n.toLowerCase()]=(s,o)=>this.request(s,{...o,method:n})}get;post;put;patch;delete;async request(e,t){const n=new URL(e,this.baseURL),s=w(this.baseInit?.headers,t.headers);return await u(n,{...this.baseInit,...t,headers:s})}}async function u(...r){const e=await fetch(...r),t=await e.json();if(e.ok)return t;throw new d({response:e,data:t})}class d extends Error{response;data;constructor({response:e,data:t}){super(e.statusText),this.name="FetcherError",this.response=e,this.data=t}}function w(...r){const e={};for(const t of r){const n=new Headers(t);for(const[s,o]of n.entries())o==null?delete e[s]:e[s]=o}return new Headers(e)}function h(r,e,t){const n=new MutationObserver((s,o)=>{for(const L of s)e(L,o)});return n.observe(r,{childList:!0,subtree:!0,...t}),n}function y(r,e=document.documentElement){return new Promise(t=>{function n(){const s=e.querySelector(r);s&&t(s)}h(e,(s,o)=>{n(),o.disconnect()})})}class b{#e={};on(e,t){const n=this.#e[e];return n?n.push(t):this.#e[e]=[t],this}addListener(e,t){return this.on(e,t)}once(e,t){const n=(...s)=>{this.off(e,n),t(...s)};return this.on(e,n),this}emit(e,...t){const n=this.#e[e]||[];for(let s=0;s<n.length;s++)n[s](...t);return Boolean(n.length)}off(e,t){return this.#e[e]&&(this.#e[e]=this.#e[e].filter(n=>n!==t)),this}removeListener(e,t){return this.off(e,t)}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 v extends b{constructor(){super();const{history:e,location:t}=window,{pushState:n,replaceState:s}=e;e.pushState=(...o)=>{n.apply(e,o),this.emit("pushState",t,o[0])},e.replaceState=(...o)=>{s.apply(e,o),this.emit("replaceState",t,o[0])},window.addEventListener("popstate",({state:o})=>{this.emit("popState",t,o)})}}const E=new v;i.Fetcher=p,i.FetcherError=d,i.domReady=f,i.el=c,i.fetcher=u,i.locationObserver=E,i.nbsp=l,i.observeElement=h,i.text=a,i.waitElement=y,Object.defineProperties(i,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/observeElement.ts","../src/waitElement.ts","../src/html.ts","../src/fetcher.ts"],"sourcesContent":["export function observeElement<T extends Element = Element>(\n selector: string,\n callback: (el: T) => void,\n target = document.body\n): MutationObserver {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n const el = (mutation.target as T).querySelector<T>(selector)\n if (el) {\n callback(el)\n }\n }\n })\n\n observer.observe(target, {\n attributes: true,\n childList: true,\n subtree: true\n })\n\n return observer\n}\n","import { observeElement } from './observeElement.js'\n\nexport function waitElement<T extends Element = Element>(\n selector: string,\n target = document.body\n): Promise<T> {\n return new Promise((resolve) => {\n const el = target.querySelector<T>(selector)\n if (el) {\n resolve(el)\n } else {\n observeElement<T>(\n selector,\n (el, observer) => {\n observer.disconnect()\n resolve(el)\n },\n target\n )\n }\n })\n}\n","// 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 if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\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]\n\nexport class Fetcher {\n get: <T>(path: string, init?: FetcherRequest) => Promise<T>\n post: <T>(path: string, init?: FetcherRequest) => Promise<T>\n put: <T>(path: string, init?: FetcherRequest) => Promise<T>\n patch: <T>(path: string, init?: FetcherRequest) => Promise<T>\n delete: <T>(path: string, init?: FetcherRequest) => Promise<T>\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 this.request(path, { ...init, method })\n }\n }\n\n async request<T>(\n path: string,\n init: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const url = new URL(path, this.baseURL)\n const headers = mergeHeaders(this.baseInit?.headers!, init.headers!)\n return await fetcher<T>(url, { ...this.baseInit, ...init, headers })\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\nfunction mergeHeaders(...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"],"names":["observeElement","selector","callback","target","observer","mutations","mutation","el","waitElement","resolve","tag","attributes","children","text","str","nbsp","domReady","methods","Fetcher","baseURL","baseInit","method","path","init","url","headers","mergeHeaders","fetcher","args","response","data","FetcherError","sources","result","source","key","value"],"mappings":"+OAAO,SAASA,EACdC,EACAC,EACAC,EAAS,SAAS,KACA,CAClB,MAAMC,EAAW,IAAI,iBAAkBC,GAAc,CACnD,UAAWC,KAAYD,EAAW,CAChC,MAAME,EAAMD,EAAS,OAAa,cAAiBL,CAAQ,EACvDM,GACFL,EAASK,CAAE,CAEf,CAAA,CACD,EAED,OAAAH,EAAS,QAAQD,EAAQ,CACvB,WAAY,GACZ,UAAW,GACX,QAAS,EAAA,CACV,EAEMC,CACT,CCnBO,SAASI,EACdP,EACAE,EAAS,SAAS,KACN,CACL,OAAA,IAAI,QAASM,GAAY,CACxB,MAAAF,EAAKJ,EAAO,cAAiBF,CAAQ,EACvCM,EACFE,EAAQF,CAAE,EAEVP,EACEC,EACA,CAACM,EAAIH,IAAa,CAChBA,EAAS,WAAW,EACpBK,EAAQF,CAAE,CACZ,EACAJ,CAAA,CAEJ,CACD,CACH,CCdgB,SAAAI,EACdG,EACAC,KACGC,EACuB,CACpBL,MAAAA,EAAK,SAAS,cAAcG,CAAG,EACjC,OAAA,MAAM,QAAQC,CAAU,EAC1BJ,EAAG,OAAO,GAAGI,CAAU,GAEhB,OAAA,OAAOJ,EAAII,CAAU,EAC5B,OAAO,OAAOJ,EAAG,MAAOI,GAAY,KAAK,EACzCJ,EAAG,OAAO,GAAGK,CAAQ,GAGhBL,CACT,CAEO,SAASM,EAAKC,EAAmB,CAC/B,OAAA,SAAS,eAAeA,CAAG,CACpC,CAEO,SAASC,GAAa,CAC3B,OAAOF,EAAK,MAAQ,CACtB,CAEA,eAAsBG,GAA0B,CACvC,OAAA,IAAI,QAASP,GAAY,CAC1B,SAAS,YAAc,UACzB,SAAS,iBAAiB,mBAAoB,IAAMA,EAAA,EAAW,CAC7D,KAAM,EAAA,CACP,EAEOA,GACV,CACD,CACH,CClCA,MAAMQ,EAAU,CACd,MACA,OACA,MACA,QACA,QACF,EAIO,MAAMC,CAAQ,CAOnB,YACmBC,EACAC,EACjB,CAFiB,KAAA,QAAAD,EACA,KAAA,SAAAC,EAEjB,UAAWC,KAAUJ,EAEnB,KAAKI,EAAO,YAAiB,GAAA,CAACC,EAAcC,IAC1C,KAAK,QAAQD,EAAM,CAAE,GAAGC,EAAM,OAAAF,CAAQ,CAAA,CAE5C,CAfA,IACA,KACA,IACA,MACA,OAaA,MAAM,QACJC,EACAC,EACY,CACZ,MAAMC,EAAM,IAAI,IAAIF,EAAM,KAAK,OAAO,EAChCG,EAAUC,EAAa,KAAK,UAAU,QAAUH,EAAK,OAAQ,EAC5D,OAAA,MAAMI,EAAWH,EAAK,CAAE,GAAG,KAAK,SAAU,GAAGD,EAAM,QAAAE,CAAA,CAAS,CACrE,CACF,CAEA,eAAsBE,KACjBC,EACS,CACZ,MAAMC,EAAW,MAAM,MAAM,GAAGD,CAAI,EAC9BE,EAAQ,MAAMD,EAAS,OAE7B,GAAIA,EAAS,GACJ,OAAAC,EAGT,MAAM,IAAIC,EAAa,CACrB,SAAAF,EACA,KAAAC,CAAA,CACD,CACH,CAEO,MAAMC,UAAwB,KAAM,CACzC,SACA,KAEA,YAAY,CAAE,SAAAF,EAAU,KAAAC,GAAyC,CAC/D,MAAMD,EAAS,UAAU,EAEzB,KAAK,KAAO,eACZ,KAAK,SAAWA,EAChB,KAAK,KAAOC,CACd,CACF,CAEA,SAASJ,KAAgBM,EAAiC,CACxD,MAAMC,EAAiC,CAAA,EAEvC,UAAWC,KAAUF,EAAS,CACtB,MAAAP,EAAU,IAAI,QAAQS,CAAM,EAElC,SAAW,CAACC,EAAKC,CAAK,IAAKX,EAAQ,UACNW,GAAU,KACnC,OAAOH,EAAOE,GAEdF,EAAOE,GAAOC,CAGpB,CAEO,OAAA,IAAI,QAAQH,CAAM,CAC3B"}
|
|
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 if (Array.isArray(attributes)) {\n el.append(...attributes)\n } else {\n Object.assign(el, attributes)\n Object.assign(el.style, attributes?.style)\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]\n\nexport class Fetcher {\n get: <T>(path: string, init?: FetcherRequest) => Promise<T>\n post: <T>(path: string, init?: FetcherRequest) => Promise<T>\n put: <T>(path: string, init?: FetcherRequest) => Promise<T>\n patch: <T>(path: string, init?: FetcherRequest) => Promise<T>\n delete: <T>(path: string, init?: FetcherRequest) => Promise<T>\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 this.request(path, { ...init, method })\n }\n }\n\n async request<T>(\n path: string,\n init: FetcherRequest & { method: RequestMethods }\n ): Promise<T> {\n const url = new URL(path, this.baseURL)\n const headers = mergeHeaders(this.baseInit?.headers!, init.headers!)\n return await fetcher<T>(url, { ...this.baseInit, ...init, headers })\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\nfunction mergeHeaders(...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","headers","mergeHeaders","fetcher","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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function observeElement<T extends Element = Element>(
|
|
1
|
+
export declare function observeElement<T extends Element = Element>(el: T, callback: (mutation: MutationRecord, observer: MutationObserver) => void, options?: MutationObserverInit): MutationObserver;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zero-dependency/dom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"main": "./dist/index.umd.js",
|
|
@@ -33,6 +33,9 @@
|
|
|
33
33
|
"vite-plugin-dts": "^1.6.5",
|
|
34
34
|
"vitest": "^0.23.4"
|
|
35
35
|
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@zero-dependency/emitter": "1.1.1"
|
|
38
|
+
},
|
|
36
39
|
"scripts": {
|
|
37
40
|
"dev": "vite build --watch",
|
|
38
41
|
"build": "vite build",
|