@pagepocket/lighterceptor 0.7.0 → 0.8.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.
@@ -0,0 +1,8 @@
1
+ import type { DOMWindow } from "jsdom";
2
+ import type { RequestInterceptor } from "../types.js";
3
+ type InterceptorOptions = {
4
+ interceptor: RequestInterceptor;
5
+ };
6
+ export declare const installDomInterceptors: (window: DOMWindow, options: InterceptorOptions) => void;
7
+ export {};
8
+ //# sourceMappingURL=intercept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intercept.d.ts","sourceRoot":"","sources":["../../../src/dom/intercept.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,EAAE,SAAS,kBAAkB,SAkWpF,CAAC"}
@@ -0,0 +1,286 @@
1
+ export const installDomInterceptors = (window, options) => {
2
+ const extractCssUrls = (cssText) => {
3
+ const urls = [];
4
+ const pattern = /url\(\s*(['"]?)(.*?)\1\s*\)/gi;
5
+ let match;
6
+ while ((match = pattern.exec(cssText)) !== null) {
7
+ const url = match[2].trim();
8
+ if (url.length > 0) {
9
+ urls.push(url);
10
+ }
11
+ }
12
+ const importPattern = /@import\s+(?:url\(\s*)?(['"]?)([^'")\s]+)\1\s*\)?/gi;
13
+ while ((match = importPattern.exec(cssText)) !== null) {
14
+ const url = match[2].trim();
15
+ if (url.length > 0) {
16
+ urls.push(url);
17
+ }
18
+ }
19
+ return urls;
20
+ };
21
+ const interceptCssText = (cssText) => {
22
+ for (const url of extractCssUrls(cssText)) {
23
+ void Promise.resolve(options.interceptor(url, {
24
+ element: undefined,
25
+ referrer: window.document.URL,
26
+ source: "css"
27
+ }));
28
+ }
29
+ };
30
+ const styleProto = window.CSSStyleDeclaration?.prototype;
31
+ const originalSetProperty = styleProto?.setProperty;
32
+ if (styleProto && originalSetProperty) {
33
+ styleProto.setProperty = function setProperty(propertyName, value, priority) {
34
+ if (typeof value === "string") {
35
+ interceptCssText(value);
36
+ }
37
+ return originalSetProperty.call(this, propertyName, value, priority);
38
+ };
39
+ const cssTextDescriptor = Object.getOwnPropertyDescriptor(styleProto, "cssText");
40
+ if (cssTextDescriptor?.set) {
41
+ Object.defineProperty(styleProto, "cssText", {
42
+ ...cssTextDescriptor,
43
+ set(value) {
44
+ interceptCssText(String(value));
45
+ cssTextDescriptor.set?.call(this, value);
46
+ }
47
+ });
48
+ }
49
+ }
50
+ const nodeProto = window.Node?.prototype;
51
+ const textContentDescriptor = nodeProto
52
+ ? Object.getOwnPropertyDescriptor(nodeProto, "textContent")
53
+ : undefined;
54
+ if (nodeProto && textContentDescriptor?.set) {
55
+ Object.defineProperty(nodeProto, "textContent", {
56
+ ...textContentDescriptor,
57
+ set(value) {
58
+ if (this instanceof window.HTMLStyleElement) {
59
+ interceptCssText(String(value));
60
+ }
61
+ textContentDescriptor.set?.call(this, value);
62
+ }
63
+ });
64
+ }
65
+ const interceptImgSrc = (url, element) => {
66
+ const imageElement = element instanceof window.HTMLImageElement ? element : undefined;
67
+ void Promise.resolve(options.interceptor(url, {
68
+ element: imageElement,
69
+ referrer: window.document.URL,
70
+ source: "img"
71
+ }));
72
+ };
73
+ const interceptResourceSrc = (url, element) => {
74
+ const iframeOrLink = element instanceof window.HTMLIFrameElement
75
+ ? element
76
+ : element instanceof window.HTMLLinkElement
77
+ ? element
78
+ : undefined;
79
+ void Promise.resolve(options.interceptor(url, {
80
+ element: iframeOrLink,
81
+ referrer: window.document.URL,
82
+ source: "resource"
83
+ }));
84
+ };
85
+ const parseSrcsetUrls = (value) => {
86
+ return value
87
+ .split(",")
88
+ .map((candidate) => candidate.trim().split(/\s+/)[0])
89
+ .filter((url) => url.length > 0);
90
+ };
91
+ const interceptSrcset = (value, element) => {
92
+ const isImage = element instanceof window.HTMLImageElement;
93
+ const source = isImage ? "img" : "resource";
94
+ for (const url of parseSrcsetUrls(value)) {
95
+ void Promise.resolve(options.interceptor(url, {
96
+ element: isImage ? element : undefined,
97
+ referrer: window.document.URL,
98
+ source
99
+ }));
100
+ }
101
+ };
102
+ const patchSrcProperty = (proto, sourceHandler) => {
103
+ const descriptor = proto ? Object.getOwnPropertyDescriptor(proto, "src") : undefined;
104
+ if (proto && descriptor?.set) {
105
+ Object.defineProperty(proto, "src", {
106
+ ...descriptor,
107
+ set(value) {
108
+ sourceHandler(String(value), this);
109
+ descriptor.set?.call(this, value);
110
+ }
111
+ });
112
+ }
113
+ };
114
+ const patchSrcsetProperty = (proto) => {
115
+ const descriptor = proto ? Object.getOwnPropertyDescriptor(proto, "srcset") : undefined;
116
+ if (proto && descriptor?.set) {
117
+ Object.defineProperty(proto, "srcset", {
118
+ ...descriptor,
119
+ set(value) {
120
+ interceptSrcset(String(value), this);
121
+ descriptor.set?.call(this, value);
122
+ }
123
+ });
124
+ }
125
+ };
126
+ const shouldInterceptLinkRel = (rel) => {
127
+ const normalized = rel.toLowerCase();
128
+ return (normalized.includes("preload") ||
129
+ normalized.includes("prefetch") ||
130
+ normalized.includes("stylesheet") ||
131
+ normalized.includes("icon"));
132
+ };
133
+ const interceptLinkHref = (link, rel) => {
134
+ if (shouldInterceptLinkRel(rel) && link.href) {
135
+ interceptResourceSrc(link.href, link);
136
+ }
137
+ };
138
+ const interceptLinkImagesrcset = (link) => {
139
+ const rel = (link.getAttribute("rel") ?? "").toLowerCase();
140
+ if (!rel.includes("preload")) {
141
+ return;
142
+ }
143
+ const imagesrcset = link.getAttribute("imagesrcset");
144
+ if (!imagesrcset) {
145
+ return;
146
+ }
147
+ for (const url of parseSrcsetUrls(imagesrcset)) {
148
+ interceptResourceSrc(url, link);
149
+ }
150
+ };
151
+ const patchAttributeProperty = (proto, property, sourceHandler) => {
152
+ const descriptor = proto ? Object.getOwnPropertyDescriptor(proto, property) : undefined;
153
+ if (proto && descriptor?.set) {
154
+ Object.defineProperty(proto, property, {
155
+ ...descriptor,
156
+ set(value) {
157
+ sourceHandler(String(value), this);
158
+ descriptor.set?.call(this, value);
159
+ }
160
+ });
161
+ }
162
+ };
163
+ const imgProto = window.HTMLImageElement?.prototype;
164
+ const srcDescriptor = imgProto ? Object.getOwnPropertyDescriptor(imgProto, "src") : undefined;
165
+ if (imgProto && srcDescriptor?.set) {
166
+ Object.defineProperty(imgProto, "src", {
167
+ ...srcDescriptor,
168
+ set(value) {
169
+ interceptImgSrc(String(value), this);
170
+ srcDescriptor.set?.call(this, value);
171
+ }
172
+ });
173
+ }
174
+ patchSrcsetProperty(imgProto);
175
+ patchSrcProperty(window.HTMLIFrameElement?.prototype, interceptResourceSrc);
176
+ // Media elements in jsdom don't always expose a shared HTMLMediaElement.src setter
177
+ // consistently across environments. Patch common concrete prototypes and keep a
178
+ // best-effort patch on HTMLMediaElement as well.
179
+ patchSrcProperty(window.HTMLMediaElement?.prototype, interceptResourceSrc);
180
+ patchSrcProperty(window.HTMLVideoElement?.prototype, interceptResourceSrc);
181
+ patchSrcProperty(window.HTMLAudioElement?.prototype, interceptResourceSrc);
182
+ patchSrcProperty(window.HTMLSourceElement?.prototype, interceptResourceSrc);
183
+ patchSrcsetProperty(window.HTMLSourceElement?.prototype);
184
+ patchAttributeProperty(window.HTMLVideoElement?.prototype, "poster", interceptResourceSrc);
185
+ patchAttributeProperty(window.HTMLObjectElement?.prototype, "data", interceptResourceSrc);
186
+ patchSrcProperty(window.HTMLTrackElement?.prototype, interceptResourceSrc);
187
+ patchSrcProperty(window.HTMLEmbedElement?.prototype, interceptResourceSrc);
188
+ const originalSetAttribute = window.Element.prototype.setAttribute;
189
+ window.Element.prototype.setAttribute = function setAttribute(name, value) {
190
+ if (this instanceof window.HTMLImageElement && name.toLowerCase() === "src") {
191
+ interceptImgSrc(String(value), this);
192
+ }
193
+ if ((this instanceof window.HTMLIFrameElement ||
194
+ this instanceof window.HTMLVideoElement ||
195
+ this instanceof window.HTMLAudioElement ||
196
+ this instanceof window.HTMLTrackElement ||
197
+ this instanceof window.HTMLEmbedElement ||
198
+ this instanceof window.HTMLSourceElement) &&
199
+ name.toLowerCase() === "src") {
200
+ interceptResourceSrc(String(value), this);
201
+ }
202
+ if (this instanceof window.HTMLVideoElement && name.toLowerCase() === "poster") {
203
+ interceptResourceSrc(String(value), this);
204
+ }
205
+ if (this instanceof window.HTMLObjectElement && name.toLowerCase() === "data") {
206
+ interceptResourceSrc(String(value), this);
207
+ }
208
+ if ((this instanceof window.HTMLImageElement || this instanceof window.HTMLSourceElement) &&
209
+ name.toLowerCase() === "srcset") {
210
+ interceptSrcset(String(value), this);
211
+ }
212
+ if (this instanceof window.HTMLLinkElement && name.toLowerCase() === "href") {
213
+ interceptLinkHref(this, this.rel);
214
+ }
215
+ if (this instanceof window.HTMLLinkElement && name.toLowerCase() === "rel") {
216
+ interceptLinkHref(this, String(value));
217
+ }
218
+ if (this instanceof window.HTMLLinkElement && name.toLowerCase() === "imagesrcset") {
219
+ interceptLinkImagesrcset(this);
220
+ }
221
+ return originalSetAttribute.call(this, name, value);
222
+ };
223
+ const originalAppendChild = window.Node.prototype.appendChild;
224
+ window.Node.prototype.appendChild = function appendChild(child) {
225
+ const appended = originalAppendChild.call(this, child);
226
+ if (child instanceof window.HTMLStyleElement) {
227
+ const cssText = child.textContent || "";
228
+ interceptCssText(cssText);
229
+ }
230
+ if (child instanceof window.HTMLLinkElement) {
231
+ interceptLinkHref(child, child.rel);
232
+ interceptLinkImagesrcset(child);
233
+ }
234
+ if (child instanceof window.HTMLImageElement && child.src) {
235
+ interceptImgSrc(child.src, child);
236
+ }
237
+ // Some elements don't reliably trigger jsdom ResourceLoader requests. For
238
+ // these, we record at append time as a fallback.
239
+ if (child instanceof window.HTMLVideoElement) {
240
+ const src = child.getAttribute("src") || child.src;
241
+ if (src) {
242
+ interceptResourceSrc(String(src), child);
243
+ }
244
+ const poster = child.getAttribute("poster") || child.poster;
245
+ if (poster) {
246
+ interceptResourceSrc(String(poster), child);
247
+ }
248
+ }
249
+ if (child instanceof window.HTMLAudioElement) {
250
+ const src = child.getAttribute("src") || child.src;
251
+ if (src) {
252
+ interceptResourceSrc(String(src), child);
253
+ }
254
+ }
255
+ if (child instanceof window.HTMLSourceElement) {
256
+ const src = child.getAttribute("src") || child.src;
257
+ if (src) {
258
+ interceptResourceSrc(String(src), child);
259
+ }
260
+ const srcset = child.getAttribute("srcset") || child.srcset;
261
+ if (srcset) {
262
+ interceptSrcset(String(srcset), child);
263
+ }
264
+ }
265
+ if (child instanceof window.HTMLTrackElement) {
266
+ const src = child.getAttribute("src") || child.src;
267
+ if (src) {
268
+ interceptResourceSrc(String(src), child);
269
+ }
270
+ }
271
+ if (child instanceof window.HTMLEmbedElement) {
272
+ const src = child.getAttribute("src") || child.src;
273
+ if (src) {
274
+ interceptResourceSrc(String(src), child);
275
+ }
276
+ }
277
+ if (child instanceof window.HTMLObjectElement) {
278
+ const data = child.getAttribute("data") || child.data;
279
+ if (data) {
280
+ interceptResourceSrc(String(data), child);
281
+ }
282
+ }
283
+ return appended;
284
+ };
285
+ };
286
+ //# sourceMappingURL=intercept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../../src/dom/intercept.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DOMWindow } from "jsdom";
2
+ import type { RequestInterceptor } from "../types.js";
3
+ export declare const scanDocumentRequests: (window: DOMWindow, interceptor: RequestInterceptor) => void;
4
+ //# sourceMappingURL=scan-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-document.d.ts","sourceRoot":"","sources":["../../../src/dom/scan-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAmBtD,eAAO,MAAM,oBAAoB,GAAI,QAAQ,SAAS,EAAE,aAAa,kBAAkB,SAqHtF,CAAC"}
@@ -0,0 +1,111 @@
1
+ const parseSrcsetUrls = (value) => {
2
+ return value
3
+ .split(",")
4
+ .map((candidate) => candidate.trim().split(/\s+/)[0])
5
+ .filter((url) => url.length > 0);
6
+ };
7
+ const shouldInterceptLinkRel = (rel) => {
8
+ const normalized = rel.toLowerCase();
9
+ return (normalized.includes("preload") ||
10
+ normalized.includes("prefetch") ||
11
+ normalized.includes("stylesheet") ||
12
+ normalized.includes("icon"));
13
+ };
14
+ export const scanDocumentRequests = (window, interceptor) => {
15
+ const { document } = window;
16
+ const referrer = document.URL;
17
+ const record = (url, source, element) => {
18
+ void Promise.resolve(interceptor(url, {
19
+ element,
20
+ referrer,
21
+ source
22
+ }));
23
+ };
24
+ document.querySelectorAll("img[src]").forEach((img) => {
25
+ if (img instanceof window.HTMLImageElement && img.src) {
26
+ record(img.src, "img", img);
27
+ }
28
+ });
29
+ document.querySelectorAll("img[srcset]").forEach((img) => {
30
+ if (img instanceof window.HTMLImageElement) {
31
+ for (const url of parseSrcsetUrls(img.getAttribute("srcset") ?? "")) {
32
+ record(url, "img", img);
33
+ }
34
+ }
35
+ });
36
+ document.querySelectorAll("source[src]").forEach((source) => {
37
+ const src = source.getAttribute("src");
38
+ if (src) {
39
+ record(src, "resource");
40
+ }
41
+ });
42
+ document.querySelectorAll("source[srcset]").forEach((source) => {
43
+ const srcset = source.getAttribute("srcset");
44
+ if (srcset) {
45
+ for (const url of parseSrcsetUrls(srcset)) {
46
+ record(url, "resource");
47
+ }
48
+ }
49
+ });
50
+ document.querySelectorAll("script[src]").forEach((script) => {
51
+ if (script instanceof window.HTMLScriptElement && script.src) {
52
+ record(script.src, "resource");
53
+ }
54
+ });
55
+ document.querySelectorAll("iframe[src]").forEach((iframe) => {
56
+ if (iframe instanceof window.HTMLIFrameElement && iframe.src) {
57
+ record(iframe.src, "resource", iframe);
58
+ }
59
+ });
60
+ document.querySelectorAll("video[src], audio[src]").forEach((media) => {
61
+ const src = media.getAttribute("src");
62
+ if (src) {
63
+ record(src, "resource");
64
+ }
65
+ });
66
+ document.querySelectorAll("video[poster]").forEach((video) => {
67
+ const poster = video.getAttribute("poster");
68
+ if (poster) {
69
+ record(poster, "resource");
70
+ }
71
+ });
72
+ document.querySelectorAll("track[src]").forEach((track) => {
73
+ const src = track.getAttribute("src");
74
+ if (src) {
75
+ record(src, "resource");
76
+ }
77
+ });
78
+ document.querySelectorAll("embed[src]").forEach((embed) => {
79
+ const src = embed.getAttribute("src");
80
+ if (src) {
81
+ record(src, "resource");
82
+ }
83
+ });
84
+ document.querySelectorAll("object[data]").forEach((object) => {
85
+ const data = object.getAttribute("data");
86
+ if (data) {
87
+ record(data, "resource");
88
+ }
89
+ });
90
+ document.querySelectorAll("link[rel]").forEach((link) => {
91
+ if (!(link instanceof window.HTMLLinkElement)) {
92
+ return;
93
+ }
94
+ const rel = link.getAttribute("rel") ?? "";
95
+ if (shouldInterceptLinkRel(rel)) {
96
+ const href = link.getAttribute("href") ?? link.href;
97
+ if (href) {
98
+ record(href, "resource", link);
99
+ }
100
+ }
101
+ if (rel.toLowerCase().includes("preload")) {
102
+ const imagesrcset = link.getAttribute("imagesrcset");
103
+ if (imagesrcset) {
104
+ for (const url of parseSrcsetUrls(imagesrcset)) {
105
+ record(url, "resource", link);
106
+ }
107
+ }
108
+ }
109
+ });
110
+ };
111
+ //# sourceMappingURL=scan-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-document.js","sourceRoot":"","sources":["../../../src/dom/scan-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DOMWindow } from "jsdom";
2
+ export declare const installJsdomTestingMocks: (window: DOMWindow) => void;
3
+ //# sourceMappingURL=testing-mocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-mocks.d.ts","sourceRoot":"","sources":["../../../src/dom/testing-mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA6CvC,eAAO,MAAM,wBAAwB,GAAI,QAAQ,SAAS,SA0FzD,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { configMocks, mockAnimationsApi, mockCSSTypedOM, mockIntersectionObserver, mockResizeObserver, mockViewport } from "jsdom-testing-mocks";
2
+ class IntersectionObserverEntryStub {
3
+ boundingClientRect;
4
+ intersectionRatio;
5
+ intersectionRect;
6
+ isIntersecting;
7
+ rootBounds;
8
+ target;
9
+ time;
10
+ constructor(target, boundingClientRect, intersectionRect, intersectionRatio, rootBounds, time, isIntersecting = intersectionRatio > 0) {
11
+ this.boundingClientRect = boundingClientRect;
12
+ this.intersectionRect = intersectionRect;
13
+ this.intersectionRatio = intersectionRatio;
14
+ this.isIntersecting = isIntersecting;
15
+ this.rootBounds = rootBounds;
16
+ this.target = target;
17
+ this.time = time;
18
+ }
19
+ }
20
+ export const installJsdomTestingMocks = (window) => {
21
+ const globalWithHooks = globalThis;
22
+ const noopHook = () => { };
23
+ configMocks({
24
+ beforeAll: globalWithHooks.beforeAll ?? noopHook,
25
+ afterAll: globalWithHooks.afterAll ?? noopHook,
26
+ beforeEach: globalWithHooks.beforeEach ?? noopHook,
27
+ afterEach: globalWithHooks.afterEach ?? noopHook,
28
+ act: (trigger) => trigger()
29
+ });
30
+ const previousGlobals = {};
31
+ const setGlobal = (key, value) => {
32
+ previousGlobals[key] = globalThis[key];
33
+ globalThis[key] = value;
34
+ };
35
+ const restoreGlobals = () => {
36
+ const preserveIfUndefined = new Set(["DOMRectReadOnly", "DOMRect"]);
37
+ for (const key of Object.keys(previousGlobals)) {
38
+ const value = previousGlobals[key];
39
+ if (value === undefined) {
40
+ if (preserveIfUndefined.has(key)) {
41
+ continue;
42
+ }
43
+ delete globalThis[key];
44
+ }
45
+ else {
46
+ globalThis[key] = value;
47
+ }
48
+ }
49
+ };
50
+ try {
51
+ setGlobal("window", window);
52
+ setGlobal("document", window.document);
53
+ setGlobal("Element", window.Element);
54
+ setGlobal("Document", window.Document);
55
+ setGlobal("HTMLElement", window.HTMLElement);
56
+ setGlobal("Event", window.Event);
57
+ setGlobal("DOMRect", window.DOMRect);
58
+ setGlobal("DOMRectReadOnly", window.DOMRectReadOnly);
59
+ setGlobal("performance", window.performance);
60
+ if (typeof window.matchMedia !== "function") {
61
+ mockViewport({ width: "1024px", height: "768px" });
62
+ }
63
+ if (typeof window.IntersectionObserver !== "function") {
64
+ mockIntersectionObserver();
65
+ }
66
+ if (typeof window.IntersectionObserverEntry !== "function") {
67
+ window.IntersectionObserverEntry = IntersectionObserverEntryStub;
68
+ }
69
+ if (typeof window.ResizeObserver !== "function") {
70
+ mockResizeObserver();
71
+ }
72
+ if (typeof window.Element?.prototype.animate !== "function") {
73
+ mockAnimationsApi();
74
+ }
75
+ if (typeof window.CSS === "undefined") {
76
+ mockCSSTypedOM();
77
+ const cssGlobals = [
78
+ "CSS",
79
+ "CSSNumericValue",
80
+ "CSSUnitValue",
81
+ "CSSMathValue",
82
+ "CSSMathSum",
83
+ "CSSMathProduct",
84
+ "CSSMathNegate",
85
+ "CSSMathInvert",
86
+ "CSSMathMin",
87
+ "CSSMathMax",
88
+ "CSSMathClamp"
89
+ ];
90
+ for (const key of cssGlobals) {
91
+ const value = globalThis[key];
92
+ if (value) {
93
+ window[key] = value;
94
+ }
95
+ }
96
+ }
97
+ }
98
+ finally {
99
+ restoreGlobals();
100
+ }
101
+ };
102
+ //# sourceMappingURL=testing-mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-mocks.js","sourceRoot":"","sources":["../../../src/dom/testing-mocks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkC,MAAM,OAAO,CAAC;AAW9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,qBAAqB,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,WAAW,EAAE,kBAAkB,CAAC;CACjC,CAAC;AA0HF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,SA8frE"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkC,MAAM,OAAO,CAAC;AAM9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,qBAAqB,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,WAAW,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,SAuOrE"}