billy-herrington-utils 1.0.6 → 1.0.7
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/billy-herrington-utils.es.js +246 -173
- package/dist/billy-herrington-utils.es.js.map +1 -1
- package/dist/billy-herrington-utils.umd.js +319 -1
- package/dist/billy-herrington-utils.umd.js.map +1 -1
- package/dist/index.d.ts +99 -0
- package/package.json +6 -3
- package/vite.config.js +4 -1
- /package/{index.ts → index.js} +0 -0
|
@@ -1,243 +1,316 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
function
|
|
5
|
-
return
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
function stringToWords(s) {
|
|
5
|
+
return s.split(",").map((s2) => s2.trim().toLowerCase()).filter((_) => _);
|
|
6
6
|
}
|
|
7
|
-
function
|
|
8
|
-
return (
|
|
7
|
+
function sanitizeStr(s) {
|
|
8
|
+
return (s == null ? void 0 : s.replace(/\n|\t/, " ").replace(/ {2,}/, " ").trim().toLowerCase()) || "";
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
return ((
|
|
10
|
+
function timeToSeconds(t) {
|
|
11
|
+
return ((t == null ? void 0 : t.match(/\d+/gm)) || [0]).reverse().map((s, i) => parseInt(s) * 60 ** i).reduce((a, b) => a + b);
|
|
12
12
|
}
|
|
13
|
-
function
|
|
14
|
-
return Number.isInteger(parseInt(
|
|
13
|
+
function parseIntegerOr(n, or) {
|
|
14
|
+
return Number.isInteger(parseInt(n)) ? parseInt(n) : or;
|
|
15
15
|
}
|
|
16
|
-
function
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
function parseDataParams(str) {
|
|
17
|
+
const params = str.split(";").flatMap((s) => {
|
|
18
|
+
const parsed = s.match(/([\+\w+]+):(\w+)?/);
|
|
19
|
+
const value = parsed == null ? void 0 : parsed[2];
|
|
20
|
+
if (value) return parsed[1].split("+").map((p) => ({ [p]: value }));
|
|
21
|
+
}).filter((_) => _);
|
|
22
|
+
return Object.assign({}, ...params);
|
|
22
23
|
}
|
|
23
|
-
function
|
|
24
|
-
return
|
|
24
|
+
function parseCSSUrl(s) {
|
|
25
|
+
return s.replace(/url\("|\"\).*/g, "");
|
|
25
26
|
}
|
|
26
|
-
class
|
|
27
|
-
constructor(
|
|
28
|
-
|
|
29
|
-
this.callback =
|
|
27
|
+
class Observer {
|
|
28
|
+
constructor(callback) {
|
|
29
|
+
__publicField(this, "observer");
|
|
30
|
+
this.callback = callback;
|
|
31
|
+
this.observer = new IntersectionObserver(this.handleIntersection.bind(this));
|
|
30
32
|
}
|
|
31
|
-
observe(
|
|
32
|
-
this.observer.observe(
|
|
33
|
+
observe(target) {
|
|
34
|
+
this.observer.observe(target);
|
|
33
35
|
}
|
|
34
|
-
throttle(
|
|
35
|
-
this.observer.unobserve(
|
|
36
|
+
throttle(target, throttleTime) {
|
|
37
|
+
this.observer.unobserve(target);
|
|
38
|
+
setTimeout(() => this.observer.observe(target), throttleTime);
|
|
36
39
|
}
|
|
37
|
-
handleIntersection(
|
|
38
|
-
for (const
|
|
39
|
-
|
|
40
|
+
handleIntersection(entries) {
|
|
41
|
+
for (const entry of entries) {
|
|
42
|
+
if (entry.isIntersecting) {
|
|
43
|
+
this.callback(entry.target);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
40
46
|
}
|
|
41
47
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
42
|
-
static observeWhile(
|
|
43
|
-
const
|
|
44
|
-
|
|
48
|
+
static observeWhile(target, callback, throttleTime) {
|
|
49
|
+
const observer_ = new Observer(async (target2) => {
|
|
50
|
+
const condition = await callback();
|
|
51
|
+
if (condition) observer_.throttle(target2, throttleTime);
|
|
45
52
|
});
|
|
46
|
-
|
|
53
|
+
observer_.observe(target);
|
|
54
|
+
return observer_;
|
|
47
55
|
}
|
|
48
56
|
}
|
|
49
|
-
class
|
|
57
|
+
class LazyImgLoader {
|
|
50
58
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
51
|
-
constructor(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.lazyImgObserver.observer.unobserve(
|
|
59
|
+
constructor(callback, attributeName = "data-lazy-load", removeTagAfter = true) {
|
|
60
|
+
__publicField(this, "lazyImgObserver");
|
|
61
|
+
__publicField(this, "delazify", (target) => {
|
|
62
|
+
this.lazyImgObserver.observer.unobserve(target);
|
|
63
|
+
target.src = target.getAttribute(this.attributeName);
|
|
64
|
+
if (this.removeTagAfter) target.removeAttribute(this.attributeName);
|
|
55
65
|
});
|
|
56
|
-
this.attributeName =
|
|
57
|
-
|
|
66
|
+
this.attributeName = attributeName;
|
|
67
|
+
this.removeTagAfter = removeTagAfter;
|
|
68
|
+
this.lazyImgObserver = new Observer((target) => {
|
|
69
|
+
callback(target, this.delazify);
|
|
58
70
|
});
|
|
59
71
|
}
|
|
60
|
-
lazify(
|
|
61
|
-
!
|
|
72
|
+
lazify(_target, img, imgSrc) {
|
|
73
|
+
if (!img || !imgSrc) return;
|
|
74
|
+
img.setAttribute(this.attributeName, imgSrc);
|
|
75
|
+
img.src = "";
|
|
76
|
+
this.lazyImgObserver.observe(img);
|
|
62
77
|
}
|
|
63
78
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
64
|
-
static create(
|
|
65
|
-
|
|
66
|
-
|
|
79
|
+
static create(callback) {
|
|
80
|
+
const lazyImgLoader = new LazyImgLoader((target, delazify) => {
|
|
81
|
+
if (callback(target)) {
|
|
82
|
+
delazify(target);
|
|
83
|
+
}
|
|
67
84
|
});
|
|
85
|
+
return lazyImgLoader;
|
|
68
86
|
}
|
|
69
87
|
}
|
|
70
|
-
function
|
|
71
|
-
return (
|
|
88
|
+
function circularShift(n, c = 6, s = 1) {
|
|
89
|
+
return (n + s) % c || c;
|
|
90
|
+
}
|
|
91
|
+
function parseDom(html) {
|
|
92
|
+
const parsed = new DOMParser().parseFromString(html, "text/html").body;
|
|
93
|
+
return parsed.children.length > 1 ? parsed : parsed.firstElementChild;
|
|
72
94
|
}
|
|
73
|
-
function
|
|
74
|
-
const
|
|
75
|
-
|
|
95
|
+
function copyAttributes(target, source) {
|
|
96
|
+
for (const attr of source.attributes) {
|
|
97
|
+
attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);
|
|
98
|
+
}
|
|
76
99
|
}
|
|
77
|
-
function
|
|
78
|
-
|
|
79
|
-
|
|
100
|
+
function replaceElementTag(e, tagName) {
|
|
101
|
+
var _a;
|
|
102
|
+
const newTagElement = document.createElement(tagName);
|
|
103
|
+
copyAttributes(newTagElement, e);
|
|
104
|
+
newTagElement.innerHTML = e.innerHTML;
|
|
105
|
+
(_a = e.parentNode) == null ? void 0 : _a.replaceChild(newTagElement, e);
|
|
106
|
+
return newTagElement;
|
|
107
|
+
}
|
|
108
|
+
function getAllUniqueParents(elements) {
|
|
109
|
+
return Array.from(elements).reduce((acc, v) => {
|
|
110
|
+
if (v.parentElement && !acc.includes(v.parentElement)) {
|
|
111
|
+
acc.push(v.parentElement);
|
|
112
|
+
}
|
|
113
|
+
return acc;
|
|
114
|
+
}, []);
|
|
80
115
|
}
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return
|
|
116
|
+
function findNextSibling(el) {
|
|
117
|
+
if (el.nextElementSibling) return el.nextElementSibling;
|
|
118
|
+
if (el.parentElement) return findNextSibling(el.parentElement);
|
|
119
|
+
return null;
|
|
85
120
|
}
|
|
86
|
-
function
|
|
87
|
-
|
|
121
|
+
function waitForElementExists(parent, selector, callback) {
|
|
122
|
+
const observer = new MutationObserver((_mutations) => {
|
|
123
|
+
const el = parent.querySelector(selector);
|
|
124
|
+
if (el) {
|
|
125
|
+
observer.disconnect();
|
|
126
|
+
callback(el);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
88
130
|
}
|
|
89
|
-
function
|
|
90
|
-
|
|
131
|
+
function watchElementChildrenCount(element, callback) {
|
|
132
|
+
let count = element.children.length;
|
|
133
|
+
const observer = new MutationObserver((mutationList, observer2) => {
|
|
134
|
+
for (const mutation of mutationList) {
|
|
135
|
+
if (mutation.type === "childList") {
|
|
136
|
+
if (count !== element.children.length) {
|
|
137
|
+
count = element.children.length;
|
|
138
|
+
callback(observer2, count);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
observer.observe(element, { childList: true });
|
|
91
144
|
}
|
|
92
|
-
function
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
145
|
+
function watchDomChangesWithThrottle(element, callback, throttle = 1e3, options = { childList: true, subtree: true, attributes: true }) {
|
|
146
|
+
let lastMutationTime;
|
|
147
|
+
let timeout;
|
|
148
|
+
const observer = new MutationObserver((_mutationList, _observer) => {
|
|
149
|
+
const now = Date.now();
|
|
150
|
+
if (lastMutationTime && now - lastMutationTime < throttle) {
|
|
151
|
+
timeout && clearTimeout(timeout);
|
|
152
|
+
}
|
|
153
|
+
timeout = setTimeout(callback, throttle);
|
|
154
|
+
lastMutationTime = now;
|
|
96
155
|
});
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
function
|
|
100
|
-
let r = e.children.length;
|
|
101
|
-
new MutationObserver((i, s) => {
|
|
102
|
-
for (const a of i)
|
|
103
|
-
a.type === "childList" && r !== e.children.length && (r = e.children.length, t(s, r));
|
|
104
|
-
}).observe(e, { childList: !0 });
|
|
105
|
-
}
|
|
106
|
-
function P(e, t, r = 1e3, n = { childList: !0, subtree: !0, attributes: !0 }) {
|
|
107
|
-
let i, s;
|
|
108
|
-
new MutationObserver((y, w) => {
|
|
109
|
-
const c = Date.now();
|
|
110
|
-
i && c - i < r && s && clearTimeout(s), s = setTimeout(t, r), i = c;
|
|
111
|
-
}).observe(e, n);
|
|
112
|
-
}
|
|
113
|
-
function x(e = { append: "", after: "", button: "", cbBefore: () => {
|
|
156
|
+
observer.observe(element, options);
|
|
157
|
+
}
|
|
158
|
+
function downloader(options = { append: "", after: "", button: "", cbBefore: () => {
|
|
114
159
|
} }) {
|
|
115
|
-
var
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
160
|
+
var _a, _b;
|
|
161
|
+
const btn = parseDom(options.button);
|
|
162
|
+
if (options.append) (_a = document.querySelector(options.append)) == null ? void 0 : _a.append(btn);
|
|
163
|
+
if (options.after) (_b = document.querySelector(options.after)) == null ? void 0 : _b.after(btn);
|
|
164
|
+
btn.addEventListener("click", (e) => {
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
if (options.cbBefore) options.cbBefore();
|
|
167
|
+
waitForElementExists(document.body, "video", (video) => {
|
|
168
|
+
window.location.href = video.getAttribute("src");
|
|
120
169
|
});
|
|
121
170
|
});
|
|
122
171
|
}
|
|
123
|
-
const
|
|
172
|
+
const MOBILE_UA = [
|
|
124
173
|
"Mozilla/5.0 (Linux; Android 10; K)",
|
|
125
174
|
"AppleWebKit/537.36 (KHTML, like Gecko)",
|
|
126
175
|
"Chrome/114.0.0.0 Mobile Safari/537.36"
|
|
127
176
|
].join(" ");
|
|
128
|
-
function
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
177
|
+
function fetchWith(url, options = { html: false, mobile: false }) {
|
|
178
|
+
const reqOpts = {};
|
|
179
|
+
if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ "User-Agent": MOBILE_UA }) });
|
|
180
|
+
return fetch(url, reqOpts).then((r) => r.text()).then((r) => options.html ? parseDom(r) : r);
|
|
181
|
+
}
|
|
182
|
+
const fetchHtml = (url) => fetchWith(url, { html: true });
|
|
183
|
+
const fetchText = (url) => fetchWith(url);
|
|
184
|
+
function objectToFormData(object) {
|
|
185
|
+
const formData = new FormData();
|
|
186
|
+
Object.entries(object).forEach(([k, v]) => formData.append(k, v));
|
|
187
|
+
return formData;
|
|
188
|
+
}
|
|
189
|
+
function listenEvents(dom, events, callback) {
|
|
190
|
+
for (const e of events) {
|
|
191
|
+
dom.addEventListener(e, callback, true);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
class Tick {
|
|
195
|
+
constructor(delay, startImmediate = true) {
|
|
196
|
+
__publicField(this, "tick");
|
|
144
197
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
145
|
-
|
|
146
|
-
this.delay =
|
|
198
|
+
__publicField(this, "callbackFinal");
|
|
199
|
+
this.delay = delay;
|
|
200
|
+
this.startImmediate = startImmediate;
|
|
201
|
+
this.tick = null;
|
|
202
|
+
this.delay = delay;
|
|
203
|
+
this.startImmediate = startImmediate;
|
|
147
204
|
}
|
|
148
205
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
149
|
-
start(
|
|
150
|
-
this.stop()
|
|
206
|
+
start(callback, callbackFinal = null) {
|
|
207
|
+
this.stop();
|
|
208
|
+
this.callbackFinal = callbackFinal;
|
|
209
|
+
if (this.startImmediate) callback();
|
|
210
|
+
this.tick = setInterval(callback, this.delay);
|
|
151
211
|
}
|
|
152
212
|
stop() {
|
|
153
|
-
|
|
213
|
+
if (this.tick !== null) {
|
|
214
|
+
clearInterval(this.tick);
|
|
215
|
+
this.tick = null;
|
|
216
|
+
}
|
|
217
|
+
if (this.callbackFinal) {
|
|
218
|
+
this.callbackFinal();
|
|
219
|
+
this.callbackFinal = null;
|
|
220
|
+
}
|
|
154
221
|
}
|
|
155
222
|
}
|
|
156
|
-
function
|
|
223
|
+
function isMob() {
|
|
157
224
|
return /iPhone|Android/i.test(navigator.userAgent);
|
|
158
225
|
}
|
|
159
|
-
async function
|
|
160
|
-
const
|
|
161
|
-
for await (const
|
|
162
|
-
|
|
163
|
-
|
|
226
|
+
async function computeAsyncOneAtTime(iterable) {
|
|
227
|
+
const res = [];
|
|
228
|
+
for await (const f of iterable) {
|
|
229
|
+
res.push(await f());
|
|
230
|
+
}
|
|
231
|
+
return res;
|
|
164
232
|
}
|
|
165
|
-
function
|
|
166
|
-
return new Promise((
|
|
233
|
+
function wait(milliseconds) {
|
|
234
|
+
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
167
235
|
}
|
|
168
|
-
class
|
|
236
|
+
class SyncPull {
|
|
169
237
|
constructor() {
|
|
170
238
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
171
|
-
|
|
172
|
-
|
|
239
|
+
__publicField(this, "pull", []);
|
|
240
|
+
__publicField(this, "lock", false);
|
|
173
241
|
}
|
|
174
242
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
175
|
-
getHighPriorityFirst(
|
|
176
|
-
if (
|
|
177
|
-
const
|
|
178
|
-
if (
|
|
179
|
-
const
|
|
180
|
-
|
|
243
|
+
getHighPriorityFirst(p = 0) {
|
|
244
|
+
if (p > 3 || this.pull.length === 0) return void 0;
|
|
245
|
+
const i = this.pull.findIndex((e) => e.p === p);
|
|
246
|
+
if (i >= 0) {
|
|
247
|
+
const res = this.pull[i].v;
|
|
248
|
+
this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));
|
|
249
|
+
return res;
|
|
181
250
|
}
|
|
182
|
-
return this.getHighPriorityFirst(
|
|
251
|
+
return this.getHighPriorityFirst(p + 1);
|
|
183
252
|
}
|
|
184
253
|
*pullGenerator() {
|
|
185
|
-
|
|
254
|
+
while (this.pull.length > 0) {
|
|
186
255
|
yield this.getHighPriorityFirst();
|
|
256
|
+
}
|
|
187
257
|
}
|
|
188
258
|
async processPull() {
|
|
189
259
|
if (!this.lock) {
|
|
190
|
-
this.lock =
|
|
191
|
-
for await (const
|
|
192
|
-
await
|
|
193
|
-
|
|
260
|
+
this.lock = true;
|
|
261
|
+
for await (const f of this.pullGenerator()) {
|
|
262
|
+
await f();
|
|
263
|
+
}
|
|
264
|
+
this.lock = false;
|
|
194
265
|
}
|
|
195
266
|
}
|
|
196
267
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
197
|
-
push(
|
|
198
|
-
this.pull.push(
|
|
268
|
+
push(x) {
|
|
269
|
+
this.pull.push(x);
|
|
270
|
+
this.processPull();
|
|
199
271
|
}
|
|
200
272
|
}
|
|
201
|
-
function
|
|
202
|
-
const
|
|
203
|
-
for (let
|
|
204
|
-
|
|
205
|
-
|
|
273
|
+
function chunks(arr, n) {
|
|
274
|
+
const res = [];
|
|
275
|
+
for (let i = 0; i < arr.length; i += n) {
|
|
276
|
+
res.push(arr.slice(i, i + n));
|
|
277
|
+
}
|
|
278
|
+
return res;
|
|
206
279
|
}
|
|
207
|
-
function
|
|
208
|
-
return [...Array(
|
|
280
|
+
function range(size, startAt = 1) {
|
|
281
|
+
return [...Array(size).keys()].map((i) => i + startAt);
|
|
209
282
|
}
|
|
210
283
|
export {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
284
|
+
LazyImgLoader,
|
|
285
|
+
MOBILE_UA,
|
|
286
|
+
Observer,
|
|
287
|
+
SyncPull,
|
|
288
|
+
Tick,
|
|
289
|
+
chunks,
|
|
290
|
+
circularShift,
|
|
291
|
+
computeAsyncOneAtTime,
|
|
292
|
+
copyAttributes,
|
|
293
|
+
downloader,
|
|
294
|
+
fetchHtml,
|
|
295
|
+
fetchText,
|
|
296
|
+
fetchWith,
|
|
297
|
+
findNextSibling,
|
|
298
|
+
getAllUniqueParents,
|
|
299
|
+
isMob,
|
|
300
|
+
listenEvents,
|
|
301
|
+
objectToFormData,
|
|
302
|
+
parseCSSUrl,
|
|
303
|
+
parseDataParams,
|
|
304
|
+
parseDom,
|
|
305
|
+
parseIntegerOr,
|
|
306
|
+
range,
|
|
307
|
+
replaceElementTag,
|
|
308
|
+
sanitizeStr,
|
|
309
|
+
stringToWords,
|
|
310
|
+
timeToSeconds,
|
|
311
|
+
wait,
|
|
312
|
+
waitForElementExists,
|
|
313
|
+
watchDomChangesWithThrottle,
|
|
314
|
+
watchElementChildrenCount
|
|
242
315
|
};
|
|
243
316
|
//# sourceMappingURL=billy-herrington-utils.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/strings/index.ts","../src/utils/parsers/index.ts","../src/utils/observers/index.ts","../src/utils/math/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/utils/events/index.ts","../src/utils/device/index.ts","../src/utils/async/index.ts","../src/utils/arrays/index.ts"],"sourcesContent":["export function stringToWords(s: string): Array<string> {\r\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\r\n}\r\n\r\nexport function sanitizeStr(s: string) {\r\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\r\n}\r\n","export function timeToSeconds(t: string): number {\r\n return (t?.match(/\\d+/gm) || [0])\r\n .reverse()\r\n .map((s, i) => parseInt(s as string) * 60 ** i)\r\n .reduce((a, b) => a + b);\r\n}\r\n\r\nexport function parseIntegerOr(n: string | number, or: number): number {\r\n return Number.isInteger(parseInt(n as string)) ? parseInt(n as string) : or;\r\n}\r\n\r\n// \"data:02;body+head:async;void:;zero:;\"\r\nexport function parseDataParams(str: string) {\r\n const params = str.split(';').flatMap(s => {\r\n const parsed = s.match(/([\\+\\w+]+):(\\w+)?/);\r\n const value = parsed?.[2];\r\n if (value) return parsed[1].split('+').map(p => ({ [p]: value }));\r\n }).filter(_ => _);\r\n return Object.assign({}, ...params);\r\n}\r\n\r\nexport function parseCSSUrl(s: string) {\r\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\r\n}","export class Observer {\r\n public observer: IntersectionObserver;\r\n constructor(private callback: (entry: Element) => void) {\r\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\r\n }\r\n\r\n observe(target: Element) {\r\n this.observer.observe(target);\r\n }\r\n\r\n throttle(target: Element, throttleTime: number) {\r\n this.observer.unobserve(target);\r\n setTimeout(() => this.observer.observe(target), throttleTime);\r\n }\r\n\r\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n this.callback(entry.target);\r\n }\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static observeWhile(target: Element, callback: any, throttleTime: number) {\r\n const observer_ = new Observer(async (target: Element) => {\r\n const condition = await callback();\r\n if (condition) observer_.throttle(target, throttleTime);\r\n });\r\n observer_.observe(target);\r\n return observer_;\r\n }\r\n}\r\n\r\nexport class LazyImgLoader {\r\n public lazyImgObserver: Observer;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n constructor(callback: any, private attributeName = 'data-lazy-load', private removeTagAfter = true) {\r\n this.lazyImgObserver = new Observer((target: Element) => {\r\n callback(target, this.delazify);\r\n });\r\n }\r\n\r\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\r\n if (!img || !imgSrc) return;\r\n img.setAttribute(this.attributeName, imgSrc);\r\n img.src = '';\r\n this.lazyImgObserver.observe(img);\r\n }\r\n\r\n delazify = (target: HTMLImageElement) => {\r\n this.lazyImgObserver.observer.unobserve(target);\r\n target.src = target.getAttribute(this.attributeName) as string;\r\n if (this.removeTagAfter) target.removeAttribute(this.attributeName);\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static create(callback: any) {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n const lazyImgLoader = new LazyImgLoader((target: Element, delazify: any) => {\r\n if (callback(target)) {\r\n delazify(target);\r\n }\r\n });\r\n return lazyImgLoader;\r\n }\r\n}\r\n","export function circularShift(n: number, c = 6, s = 1): number {\r\n return (n + s) % c || c;\r\n}\r\n","export function parseDom(html: string): HTMLElement {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\r\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\r\n}\r\n\r\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\r\n for (const attr of source.attributes) {\r\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\r\n }\r\n}\r\n\r\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\r\n const newTagElement = document.createElement(tagName);\r\n copyAttributes(newTagElement, e);\r\n newTagElement.innerHTML = e.innerHTML;\r\n e.parentNode?.replaceChild(newTagElement, e);\r\n return newTagElement;\r\n}\r\n\r\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\r\n return Array.from(elements).reduce((acc, v) => {\r\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\r\n return acc;\r\n }, [] as Array<HTMLElement | Element>);\r\n}\r\n\r\nexport function findNextSibling(el: HTMLElement | Element) {\r\n if (el.nextElementSibling) return el.nextElementSibling;\r\n if (el.parentElement) return findNextSibling(el.parentElement);\r\n return null;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void {\r\n const observer = new MutationObserver((_mutations) => {\r\n const el = parent.querySelector(selector);\r\n if (el) {\r\n observer.disconnect();\r\n callback(el);\r\n }\r\n });\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void {\r\n let count = element.children.length;\r\n const observer = new MutationObserver((mutationList, observer) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === \"childList\") {\r\n if (count !== element.children.length) {\r\n count = element.children.length;\r\n callback(observer, count);\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(element, { childList: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any,\r\n throttle = 1000, options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }) {\r\n let lastMutationTime: number;\r\n let timeout: number;\r\n const observer = new MutationObserver((_mutationList, _observer) => {\r\n const now = Date.now();\r\n if (lastMutationTime && now - lastMutationTime < throttle) {\r\n timeout && clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(callback, throttle);\r\n lastMutationTime = now;\r\n });\r\n observer.observe(element, options);\r\n}\r\n\r\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\r\n const btn = parseDom(options.button);\r\n\r\n if (options.append) document.querySelector(options.append)?.append(btn);\r\n if (options.after) document.querySelector(options.after)?.after(btn);\r\n\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n if (options.cbBefore) options.cbBefore();\r\n\r\n waitForElementExists(document.body, 'video', (video: HTMLVideoElement) => {\r\n window.location.href = video.getAttribute('src') as string;\r\n });\r\n });\r\n}","import { parseDom } from \"../dom\";\r\n\r\nexport const MOBILE_UA = [\r\n 'Mozilla/5.0 (Linux; Android 10; K)',\r\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\r\n 'Chrome/114.0.0.0 Mobile Safari/537.36'].join(' ');\r\n\r\nexport function fetchWith(url: string, options: Record<string, boolean> = { html: false, mobile: false }) {\r\n const reqOpts = {};\r\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ \"User-Agent\": MOBILE_UA }) });\r\n return fetch(url, reqOpts).then((r) => r.text()).then(r => options.html ? parseDom(r) : r);\r\n}\r\n\r\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true });\r\n\r\nexport const fetchText = (url: string) => fetchWith(url);\r\n\r\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\r\n const formData = new FormData();\r\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\r\n return formData;\r\n}\r\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void {\r\n for (const e of events) {\r\n dom.addEventListener(e, callback, true);\r\n }\r\n}\r\n\r\nexport class Tick {\r\n private tick: null | number;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n private callbackFinal: any;\r\n\r\n constructor(private delay: number, private startImmediate = true) {\r\n this.tick = null;\r\n this.delay = delay;\r\n this.startImmediate = startImmediate;\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n start(callback: any, callbackFinal = null) {\r\n this.stop();\r\n this.callbackFinal = callbackFinal;\r\n if (this.startImmediate) callback();\r\n this.tick = setInterval(callback, this.delay);\r\n }\r\n\r\n stop() {\r\n if (this.tick !== null) {\r\n clearInterval(this.tick);\r\n this.tick = null;\r\n }\r\n if (this.callbackFinal) {\r\n this.callbackFinal();\r\n this.callbackFinal = null;\r\n }\r\n }\r\n}","export function isMob() {\r\n return /iPhone|Android/i.test(navigator.userAgent);\r\n}","// https://2ality.com/2016/10/asynchronous-iteration.html\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport async function computeAsyncOneAtTime(iterable: Iterable<any>) {\r\n const res = [];\r\n for await (const f of iterable) {\r\n res.push(await f());\r\n }\r\n return res;\r\n}\r\n\r\nexport function wait(milliseconds: number) {\r\n return new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n// do async one at time\r\nexport class SyncPull {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n pull: Array<any> = [];\r\n lock = false;\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n getHighPriorityFirst(p = 0): any {\r\n if (p > 3 || this.pull.length === 0) return undefined;\r\n const i = this.pull.findIndex(e => e.p === p);\r\n if (i >= 0) {\r\n const res = this.pull[i].v;\r\n this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));\r\n return res;\r\n }\r\n return this.getHighPriorityFirst(p + 1);\r\n }\r\n\r\n *pullGenerator() {\r\n while (this.pull.length > 0) {\r\n yield this.getHighPriorityFirst();\r\n }\r\n }\r\n\r\n async processPull() {\r\n if (!this.lock) {\r\n this.lock = true;\r\n for await (const f of this.pullGenerator()) {\r\n await f();\r\n }\r\n this.lock = false;\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n push(x: any) {\r\n this.pull.push(x);\r\n this.processPull();\r\n }\r\n}\r\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\r\n const res = [];\r\n for (let i = 0; i < arr.length; i += n) {\r\n res.push(arr.slice(i, i + n));\r\n }\r\n return res;\r\n}\r\n\r\nexport function range(size: number, startAt = 1): Array<number> {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n}"],"names":["stringToWords","s","_","sanitizeStr","timeToSeconds","t","i","a","b","parseIntegerOr","n","or","parseDataParams","str","params","parsed","value","p","parseCSSUrl","Observer","callback","__publicField","target","throttleTime","entries","entry","observer_","LazyImgLoader","attributeName","removeTagAfter","_target","img","imgSrc","delazify","circularShift","c","parseDom","html","copyAttributes","source","attr","replaceElementTag","tagName","_a","newTagElement","getAllUniqueParents","elements","acc","v","findNextSibling","el","waitForElementExists","parent","selector","observer","_mutations","watchElementChildrenCount","element","count","mutationList","mutation","watchDomChangesWithThrottle","throttle","options","lastMutationTime","timeout","_mutationList","_observer","now","downloader","_b","btn","e","video","MOBILE_UA","fetchWith","url","reqOpts","r","fetchHtml","fetchText","objectToFormData","object","formData","k","listenEvents","dom","events","Tick","delay","startImmediate","callbackFinal","isMob","computeAsyncOneAtTime","iterable","res","f","wait","milliseconds","resolve","SyncPull","x","chunks","arr","range","size","startAt"],"mappings":";;;AAAO,SAASA,EAAcC,GAA0B;AACtD,SAAOA,EAAE,MAAM,GAAG,EAAE,IAAI,CAAAA,MAAKA,EAAE,OAAO,YAAY,CAAC,EAAE,OAAO,OAAKC,CAAC;AACpE;AAEO,SAASC,EAAYF,GAAW;AACrC,UAAOA,KAAA,gBAAAA,EAAG,QAAQ,SAAS,KAAK,QAAQ,SAAS,KAAK,OAAO,kBAAiB;AAChF;ACNO,SAASG,EAAcC,GAAmB;AACvC,WAAAA,KAAA,gBAAAA,EAAG,MAAM,aAAY,CAAC,CAAC,GAC5B,QACA,EAAA,IAAI,CAACJ,GAAGK,MAAM,SAASL,CAAW,IAAI,MAAMK,CAAC,EAC7C,OAAO,CAACC,GAAGC,MAAMD,IAAIC,CAAC;AAC3B;AAEgB,SAAAC,EAAeC,GAAoBC,GAAoB;AAC9D,SAAA,OAAO,UAAU,SAASD,CAAW,CAAC,IAAI,SAASA,CAAW,IAAIC;AAC3E;AAGO,SAASC,EAAgBC,GAAa;AAC3C,QAAMC,IAASD,EAAI,MAAM,GAAG,EAAE,QAAQ,CAAKZ,MAAA;AACnC,UAAAc,IAASd,EAAE,MAAM,mBAAmB,GACpCe,IAAQD,KAAA,gBAAAA,EAAS;AACvB,QAAIC,EAAO,QAAOD,EAAO,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,QAAM,EAAE,CAACE,CAAC,GAAGD,IAAQ;AAAA,EACjE,CAAA,EAAE,OAAO,CAAAd,MAAKA,CAAC;AAChB,SAAO,OAAO,OAAO,IAAI,GAAGY,CAAM;AACpC;AAEO,SAASI,EAAYjB,GAAW;AAC9B,SAAAA,EAAE,QAAQ,kBAAkB,EAAE;AACvC;ACvBO,MAAMkB,EAAS;AAAA,EAEpB,YAAoBC,GAAoC;AADjD,IAAAC,EAAA;AACa,SAAA,WAAAD,GAClB,KAAK,WAAW,IAAI,qBAAqB,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,EAC7E;AAAA,EAEA,QAAQE,GAAiB;AAClB,SAAA,SAAS,QAAQA,CAAM;AAAA,EAC9B;AAAA,EAEA,SAASA,GAAiBC,GAAsB;AACzC,SAAA,SAAS,UAAUD,CAAM,GAC9B,WAAW,MAAM,KAAK,SAAS,QAAQA,CAAM,GAAGC,CAAY;AAAA,EAC9D;AAAA,EAEA,mBAAmBC,GAA8C;AAC/D,eAAWC,KAASD;AAClB,MAAIC,EAAM,kBACH,KAAA,SAASA,EAAM,MAAM;AAAA,EAGhC;AAAA;AAAA,EAGA,OAAO,aAAaH,GAAiBF,GAAeG,GAAsB;AACxE,UAAMG,IAAY,IAAIP,EAAS,OAAOG,MAAoB;AAExD,MADkB,MAAMF,OACTM,EAAU,SAASJ,GAAQC,CAAY;AAAA,IAAA,CACvD;AACD,WAAAG,EAAU,QAAQJ,CAAM,GACjBI;AAAA,EACT;AACF;AAEO,MAAMC,EAAc;AAAA;AAAA,EAGzB,YAAYP,GAAuBQ,IAAgB,kBAA0BC,IAAiB,IAAM;AAF7F,IAAAR,EAAA;AAeP,IAAAA,EAAA,kBAAW,CAACC,MAA6B;AAClC,WAAA,gBAAgB,SAAS,UAAUA,CAAM,GAC9CA,EAAO,MAAMA,EAAO,aAAa,KAAK,aAAa,GAC/C,KAAK,kBAAuBA,EAAA,gBAAgB,KAAK,aAAa;AAAA,IAAA;AAhBjC,SAAA,gBAAAM,GAA0C,KAAA,iBAAAC,GAC3E,KAAK,kBAAkB,IAAIV,EAAS,CAACG,MAAoB;AAC9C,MAAAF,EAAAE,GAAQ,KAAK,QAAQ;AAAA,IAAA,CAC/B;AAAA,EACH;AAAA,EAEA,OAAOQ,GAAkBC,GAAuBC,GAAgB;AAC1D,IAAA,CAACD,KAAO,CAACC,MACTD,EAAA,aAAa,KAAK,eAAeC,CAAM,GAC3CD,EAAI,MAAM,IACL,KAAA,gBAAgB,QAAQA,CAAG;AAAA,EAClC;AAAA;AAAA,EASA,OAAO,OAAOX,GAAe;AAOpB,WALe,IAAIO,EAAc,CAACL,GAAiBW,MAAkB;AACtE,MAAAb,EAASE,CAAM,KACjBW,EAASX,CAAM;AAAA,IACjB,CACD;AAAA,EAEH;AACF;AClEO,SAASY,EAAcxB,GAAWyB,IAAI,GAAGlC,IAAI,GAAW;AACrD,UAAAS,IAAIT,KAAKkC,KAAKA;AACxB;ACFO,SAASC,EAASC,GAA2B;AAClD,QAAMtB,IAAS,IAAI,YAAY,gBAAgBsB,GAAM,WAAW,EAAE;AAClE,SAAOtB,EAAO,SAAS,SAAS,IAAIA,IAASA,EAAO;AACtD;AAEgB,SAAAuB,EAAehB,GAA+BiB,GAA+B;AAChF,aAAAC,KAAQD,EAAO;AACxB,IAAAC,EAAK,aAAalB,EAAO,aAAakB,EAAK,UAAUA,EAAK,SAAS;AAEvE;AAEgB,SAAAC,EAAkB,GAA0BC,GAAiB;AJXtE,MAAAC;AIYC,QAAAC,IAAgB,SAAS,cAAcF,CAAO;AACpD,SAAAJ,EAAeM,GAAe,CAAC,GAC/BA,EAAc,YAAY,EAAE,YAC1BD,IAAA,EAAA,eAAA,QAAAA,EAAY,aAAaC,GAAe,IACnCA;AACT;AAEO,SAASC,EAAoBC,GAAwD;AAC1F,SAAO,MAAM,KAAKA,CAAQ,EAAE,OAAO,CAACC,GAAKC,OACnCA,EAAE,iBAAiB,CAACD,EAAI,SAASC,EAAE,aAA4B,KAASD,EAAA,KAAKC,EAAE,aAAa,GACzFD,IACN,CAAkC,CAAA;AACvC;AAEO,SAASE,EAAgBC,GAA2B;AACrD,SAAAA,EAAG,qBAA2BA,EAAG,qBACjCA,EAAG,gBAAsBD,EAAgBC,EAAG,aAAa,IACtD;AACT;AAGgB,SAAAC,EAAqBC,GAA+BC,GAAkBjC,GAAqB;AACzG,QAAMkC,IAAW,IAAI,iBAAiB,CAACC,MAAe;AAC9C,UAAAL,IAAKE,EAAO,cAAcC,CAAQ;AACxC,IAAIH,MACFI,EAAS,WAAW,GACpBlC,EAAS8B,CAAE;AAAA,EACb,CACD;AACQ,EAAAI,EAAA,QAAQ,SAAS,MAAM,EAAE,WAAW,IAAM,SAAS,IAAM;AACpE;AAGgB,SAAAE,EAA0BC,GAAgCrC,GAAqB;AACzF,MAAAsC,IAAQD,EAAQ,SAAS;AAW7B,EAViB,IAAI,iBAAiB,CAACE,GAAcL,MAAa;AAChE,eAAWM,KAAYD;AACjB,MAAAC,EAAS,SAAS,eAChBF,MAAUD,EAAQ,SAAS,WAC7BC,IAAQD,EAAQ,SAAS,QACzBrC,EAASkC,GAAUI,CAAK;AAAA,EAG9B,CACD,EACQ,QAAQD,GAAS,EAAE,WAAW,GAAM,CAAA;AAC/C;AAGO,SAASI,EAA4BJ,GAAgCrC,GAC1E0C,IAAW,KAAMC,IAAmC,EAAE,WAAW,IAAM,SAAS,IAAM,YAAY,MAAQ;AACtG,MAAAC,GACAC;AASK,EARQ,IAAI,iBAAiB,CAACC,GAAeC,MAAc;AAC5D,UAAAC,IAAM,KAAK;AACb,IAAAJ,KAAoBI,IAAMJ,IAAmBF,KAC/CG,KAAW,aAAaA,CAAO,GAEvBA,IAAA,WAAW7C,GAAU0C,CAAQ,GACpBE,IAAAI;AAAA,EAAA,CACpB,EACQ,QAAQX,GAASM,CAAO;AACnC;AAEgB,SAAAM,EAAWN,IAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,MAAM;AAAE,KAAK;AJ5E1F,MAAApB,GAAA2B;AI6EC,QAAAC,IAAMnC,EAAS2B,EAAQ,MAAM;AAE/B,EAAAA,EAAQ,YAAiBpB,IAAA,SAAA,cAAcoB,EAAQ,MAAM,MAA5B,QAAApB,EAA+B,OAAO4B,KAC/DR,EAAQ,WAAgBO,IAAA,SAAA,cAAcP,EAAQ,KAAK,MAA3B,QAAAO,EAA8B,MAAMC,KAE5DA,EAAA,iBAAiB,SAAS,CAACC,MAAM;AACnC,IAAAA,EAAE,eAAe,GAEbT,EAAQ,YAAUA,EAAQ,SAAS,GAEvCZ,EAAqB,SAAS,MAAM,SAAS,CAACsB,MAA4B;AACxE,aAAO,SAAS,OAAOA,EAAM,aAAa,KAAK;AAAA,IAAA,CAChD;AAAA,EAAA,CACF;AACH;ACzFO,MAAMC,IAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAuC,EAAE,KAAK,GAAG;AAEnC,SAAAC,EAAUC,GAAab,IAAmC,EAAE,MAAM,IAAO,QAAQ,MAAS;AACxG,QAAMc,IAAU,CAAA;AAChB,SAAId,EAAQ,UAAe,OAAA,OAAOc,GAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,cAAcH,EAAW,CAAA,EAAG,CAAA,GACzF,MAAME,GAAKC,CAAO,EAAE,KAAK,CAACC,MAAMA,EAAE,KAAA,CAAM,EAAE,KAAK,CAAKA,MAAAf,EAAQ,OAAO3B,EAAS0C,CAAC,IAAIA,CAAC;AAC3F;AAEa,MAAAC,IAAY,CAACH,MAAgBD,EAAUC,GAAK,EAAE,MAAM,IAAM,GAE1DI,IAAY,CAACJ,MAAgBD,EAAUC,CAAG;AAEhD,SAASK,EAAiBC,GAA6D;AACtF,QAAAC,IAAW,IAAI;AACrB,gBAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,GAAGpC,CAAC,MAAMmC,EAAS,OAAOC,GAAGpC,CAAW,CAAC,GACnEmC;AACT;ACpBgB,SAAAE,EAAaC,GAA4BC,GAAuBnE,GAAqB;AACnG,aAAWoD,KAAKe;AACV,IAAAD,EAAA,iBAAiBd,GAAGpD,GAAU,EAAI;AAE1C;AAEO,MAAMoE,EAAK;AAAA,EAKhB,YAAoBC,GAAuBC,IAAiB,IAAM;AAJ1D,IAAArE,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEY,SAAA,QAAAoE,GAAuB,KAAA,iBAAAC,GACzC,KAAK,OAAO,MACZ,KAAK,QAAQD,GACb,KAAK,iBAAiBC;AAAA,EACxB;AAAA;AAAA,EAGA,MAAMtE,GAAeuE,IAAgB,MAAM;AACzC,SAAK,KAAK,GACV,KAAK,gBAAgBA,GACjB,KAAK,kBAAyBvE,KAClC,KAAK,OAAO,YAAYA,GAAU,KAAK,KAAK;AAAA,EAC9C;AAAA,EAEA,OAAO;AACD,IAAA,KAAK,SAAS,SAChB,cAAc,KAAK,IAAI,GACvB,KAAK,OAAO,OAEV,KAAK,kBACP,KAAK,cAAc,GACnB,KAAK,gBAAgB;AAAA,EAEzB;AACF;ACpCO,SAASwE,IAAQ;AACf,SAAA,kBAAkB,KAAK,UAAU,SAAS;AACnD;ACAA,eAAsBC,EAAsBC,GAAyB;AACnE,QAAMC,IAAM,CAAA;AACZ,mBAAiBC,KAAKF;AAChB,IAAAC,EAAA,KAAK,MAAMC,EAAA,CAAG;AAEb,SAAAD;AACT;AAEO,SAASE,EAAKC,GAAsB;AACzC,SAAO,IAAI,QAAQ,CAAAC,MAAW,WAAWA,GAASD,CAAY,CAAC;AACjE;AAGO,MAAME,EAAS;AAAA,EAAf;AAEL;AAAA,IAAA/E,EAAA,cAAmB,CAAA;AACnB,IAAAA,EAAA,cAAO;AAAA;AAAA;AAAA,EAGP,qBAAqBJ,IAAI,GAAQ;AAC/B,QAAIA,IAAI,KAAK,KAAK,KAAK,WAAW,EAAU;AAC5C,UAAMX,IAAI,KAAK,KAAK,UAAU,CAAKkE,MAAAA,EAAE,MAAMvD,CAAC;AAC5C,QAAIX,KAAK,GAAG;AACV,YAAMyF,IAAM,KAAK,KAAKzF,CAAC,EAAE;AACzB,kBAAK,OAAO,KAAK,KAAK,MAAM,GAAGA,CAAC,EAAE,OAAO,KAAK,KAAK,MAAMA,IAAI,CAAC,CAAC,GACxDyF;AAAA,IACT;AACO,WAAA,KAAK,qBAAqB9E,IAAI,CAAC;AAAA,EACxC;AAAA,EAEA,CAAC,gBAAgB;AACR,WAAA,KAAK,KAAK,SAAS;AACxB,YAAM,KAAK;EAEf;AAAA,EAEA,MAAM,cAAc;AACd,QAAA,CAAC,KAAK,MAAM;AACd,WAAK,OAAO;AACK,uBAAA+E,KAAK,KAAK;AACzB,cAAMA,EAAE;AAEV,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA;AAAA,EAGA,KAAKK,GAAQ;AACN,SAAA,KAAK,KAAKA,CAAC,GAChB,KAAK,YAAY;AAAA,EACnB;AACF;ACrDgB,SAAAC,EAAUC,GAAe7F,GAA4B;AACnE,QAAMqF,IAAM,CAAA;AACZ,WAASzF,IAAI,GAAGA,IAAIiG,EAAI,QAAQjG,KAAKI;AACnC,IAAAqF,EAAI,KAAKQ,EAAI,MAAMjG,GAAGA,IAAII,CAAC,CAAC;AAEvB,SAAAqF;AACT;AAEgB,SAAAS,EAAMC,GAAcC,IAAU,GAAkB;AACvD,SAAA,CAAC,GAAG,MAAMD,CAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAKnG,MAAAA,IAAIoG,CAAO;AACrD;"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/strings/index.ts","../src/utils/parsers/index.ts","../src/utils/observers/index.ts","../src/utils/math/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/utils/events/index.ts","../src/utils/device/index.ts","../src/utils/async/index.ts","../src/utils/arrays/index.ts"],"sourcesContent":["export function stringToWords(s: string): Array<string> {\r\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\r\n}\r\n\r\nexport function sanitizeStr(s: string) {\r\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\r\n}\r\n","export function timeToSeconds(t: string): number {\r\n return (t?.match(/\\d+/gm) || [0])\r\n .reverse()\r\n .map((s, i) => parseInt(s as string) * 60 ** i)\r\n .reduce((a, b) => a + b);\r\n}\r\n\r\nexport function parseIntegerOr(n: string | number, or: number): number {\r\n return Number.isInteger(parseInt(n as string)) ? parseInt(n as string) : or;\r\n}\r\n\r\n// \"data:02;body+head:async;void:;zero:;\"\r\nexport function parseDataParams(str: string) {\r\n const params = str.split(';').flatMap(s => {\r\n const parsed = s.match(/([\\+\\w+]+):(\\w+)?/);\r\n const value = parsed?.[2];\r\n if (value) return parsed[1].split('+').map(p => ({ [p]: value }));\r\n }).filter(_ => _);\r\n return Object.assign({}, ...params);\r\n}\r\n\r\nexport function parseCSSUrl(s: string) {\r\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\r\n}","export class Observer {\r\n public observer: IntersectionObserver;\r\n constructor(private callback: (entry: Element) => void) {\r\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\r\n }\r\n\r\n observe(target: Element) {\r\n this.observer.observe(target);\r\n }\r\n\r\n throttle(target: Element, throttleTime: number) {\r\n this.observer.unobserve(target);\r\n setTimeout(() => this.observer.observe(target), throttleTime);\r\n }\r\n\r\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n this.callback(entry.target);\r\n }\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static observeWhile(target: Element, callback: any, throttleTime: number) {\r\n const observer_ = new Observer(async (target: Element) => {\r\n const condition = await callback();\r\n if (condition) observer_.throttle(target, throttleTime);\r\n });\r\n observer_.observe(target);\r\n return observer_;\r\n }\r\n}\r\n\r\nexport class LazyImgLoader {\r\n public lazyImgObserver: Observer;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n constructor(callback: any, private attributeName = 'data-lazy-load', private removeTagAfter = true) {\r\n this.lazyImgObserver = new Observer((target: Element) => {\r\n callback(target, this.delazify);\r\n });\r\n }\r\n\r\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\r\n if (!img || !imgSrc) return;\r\n img.setAttribute(this.attributeName, imgSrc);\r\n img.src = '';\r\n this.lazyImgObserver.observe(img);\r\n }\r\n\r\n delazify = (target: HTMLImageElement) => {\r\n this.lazyImgObserver.observer.unobserve(target);\r\n target.src = target.getAttribute(this.attributeName) as string;\r\n if (this.removeTagAfter) target.removeAttribute(this.attributeName);\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static create(callback: any) {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n const lazyImgLoader = new LazyImgLoader((target: Element, delazify: any) => {\r\n if (callback(target)) {\r\n delazify(target);\r\n }\r\n });\r\n return lazyImgLoader;\r\n }\r\n}\r\n","export function circularShift(n: number, c = 6, s = 1): number {\r\n return (n + s) % c || c;\r\n}\r\n","export function parseDom(html: string): HTMLElement {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\r\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\r\n}\r\n\r\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\r\n for (const attr of source.attributes) {\r\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\r\n }\r\n}\r\n\r\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\r\n const newTagElement = document.createElement(tagName);\r\n copyAttributes(newTagElement, e);\r\n newTagElement.innerHTML = e.innerHTML;\r\n e.parentNode?.replaceChild(newTagElement, e);\r\n return newTagElement;\r\n}\r\n\r\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\r\n return Array.from(elements).reduce((acc, v) => {\r\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\r\n return acc;\r\n }, [] as Array<HTMLElement | Element>);\r\n}\r\n\r\nexport function findNextSibling(el: HTMLElement | Element) {\r\n if (el.nextElementSibling) return el.nextElementSibling;\r\n if (el.parentElement) return findNextSibling(el.parentElement);\r\n return null;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void {\r\n const observer = new MutationObserver((_mutations) => {\r\n const el = parent.querySelector(selector);\r\n if (el) {\r\n observer.disconnect();\r\n callback(el);\r\n }\r\n });\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void {\r\n let count = element.children.length;\r\n const observer = new MutationObserver((mutationList, observer) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === \"childList\") {\r\n if (count !== element.children.length) {\r\n count = element.children.length;\r\n callback(observer, count);\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(element, { childList: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any,\r\n throttle = 1000, options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }) {\r\n let lastMutationTime: number;\r\n let timeout: number;\r\n const observer = new MutationObserver((_mutationList, _observer) => {\r\n const now = Date.now();\r\n if (lastMutationTime && now - lastMutationTime < throttle) {\r\n timeout && clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(callback, throttle);\r\n lastMutationTime = now;\r\n });\r\n observer.observe(element, options);\r\n}\r\n\r\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\r\n const btn = parseDom(options.button);\r\n\r\n if (options.append) document.querySelector(options.append)?.append(btn);\r\n if (options.after) document.querySelector(options.after)?.after(btn);\r\n\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n if (options.cbBefore) options.cbBefore();\r\n\r\n waitForElementExists(document.body, 'video', (video: HTMLVideoElement) => {\r\n window.location.href = video.getAttribute('src') as string;\r\n });\r\n });\r\n}","import { parseDom } from \"../dom\";\r\n\r\nexport const MOBILE_UA = [\r\n 'Mozilla/5.0 (Linux; Android 10; K)',\r\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\r\n 'Chrome/114.0.0.0 Mobile Safari/537.36'].join(' ');\r\n\r\nexport function fetchWith(url: string, options: Record<string, boolean> = { html: false, mobile: false }) {\r\n const reqOpts = {};\r\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ \"User-Agent\": MOBILE_UA }) });\r\n return fetch(url, reqOpts).then((r) => r.text()).then(r => options.html ? parseDom(r) : r);\r\n}\r\n\r\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true });\r\n\r\nexport const fetchText = (url: string) => fetchWith(url);\r\n\r\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\r\n const formData = new FormData();\r\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\r\n return formData;\r\n}\r\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void {\r\n for (const e of events) {\r\n dom.addEventListener(e, callback, true);\r\n }\r\n}\r\n\r\nexport class Tick {\r\n private tick: null | number;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n private callbackFinal: any;\r\n\r\n constructor(private delay: number, private startImmediate = true) {\r\n this.tick = null;\r\n this.delay = delay;\r\n this.startImmediate = startImmediate;\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n start(callback: any, callbackFinal = null) {\r\n this.stop();\r\n this.callbackFinal = callbackFinal;\r\n if (this.startImmediate) callback();\r\n this.tick = setInterval(callback, this.delay);\r\n }\r\n\r\n stop() {\r\n if (this.tick !== null) {\r\n clearInterval(this.tick);\r\n this.tick = null;\r\n }\r\n if (this.callbackFinal) {\r\n this.callbackFinal();\r\n this.callbackFinal = null;\r\n }\r\n }\r\n}","export function isMob() {\r\n return /iPhone|Android/i.test(navigator.userAgent);\r\n}","// https://2ality.com/2016/10/asynchronous-iteration.html\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport async function computeAsyncOneAtTime(iterable: Iterable<any>) {\r\n const res = [];\r\n for await (const f of iterable) {\r\n res.push(await f());\r\n }\r\n return res;\r\n}\r\n\r\nexport function wait(milliseconds: number) {\r\n return new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n// do async one at time\r\nexport class SyncPull {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n pull: Array<any> = [];\r\n lock = false;\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n getHighPriorityFirst(p = 0): any {\r\n if (p > 3 || this.pull.length === 0) return undefined;\r\n const i = this.pull.findIndex(e => e.p === p);\r\n if (i >= 0) {\r\n const res = this.pull[i].v;\r\n this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));\r\n return res;\r\n }\r\n return this.getHighPriorityFirst(p + 1);\r\n }\r\n\r\n *pullGenerator() {\r\n while (this.pull.length > 0) {\r\n yield this.getHighPriorityFirst();\r\n }\r\n }\r\n\r\n async processPull() {\r\n if (!this.lock) {\r\n this.lock = true;\r\n for await (const f of this.pullGenerator()) {\r\n await f();\r\n }\r\n this.lock = false;\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n push(x: any) {\r\n this.pull.push(x);\r\n this.processPull();\r\n }\r\n}\r\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\r\n const res = [];\r\n for (let i = 0; i < arr.length; i += n) {\r\n res.push(arr.slice(i, i + n));\r\n }\r\n return res;\r\n}\r\n\r\nexport function range(size: number, startAt = 1): Array<number> {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n}"],"names":["s","target","observer"],"mappings":"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"}
|
|
@@ -1,2 +1,320 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(global, factory) {
|
|
2
|
+
typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.bhutils = {}));
|
|
3
|
+
})(this, function(exports2) {
|
|
4
|
+
"use strict";var __defProp = Object.defineProperty;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
7
|
+
|
|
8
|
+
function stringToWords(s) {
|
|
9
|
+
return s.split(",").map((s2) => s2.trim().toLowerCase()).filter((_) => _);
|
|
10
|
+
}
|
|
11
|
+
function sanitizeStr(s) {
|
|
12
|
+
return (s == null ? void 0 : s.replace(/\n|\t/, " ").replace(/ {2,}/, " ").trim().toLowerCase()) || "";
|
|
13
|
+
}
|
|
14
|
+
function timeToSeconds(t) {
|
|
15
|
+
return ((t == null ? void 0 : t.match(/\d+/gm)) || [0]).reverse().map((s, i) => parseInt(s) * 60 ** i).reduce((a, b) => a + b);
|
|
16
|
+
}
|
|
17
|
+
function parseIntegerOr(n, or) {
|
|
18
|
+
return Number.isInteger(parseInt(n)) ? parseInt(n) : or;
|
|
19
|
+
}
|
|
20
|
+
function parseDataParams(str) {
|
|
21
|
+
const params = str.split(";").flatMap((s) => {
|
|
22
|
+
const parsed = s.match(/([\+\w+]+):(\w+)?/);
|
|
23
|
+
const value = parsed == null ? void 0 : parsed[2];
|
|
24
|
+
if (value) return parsed[1].split("+").map((p) => ({ [p]: value }));
|
|
25
|
+
}).filter((_) => _);
|
|
26
|
+
return Object.assign({}, ...params);
|
|
27
|
+
}
|
|
28
|
+
function parseCSSUrl(s) {
|
|
29
|
+
return s.replace(/url\("|\"\).*/g, "");
|
|
30
|
+
}
|
|
31
|
+
class Observer {
|
|
32
|
+
constructor(callback) {
|
|
33
|
+
__publicField(this, "observer");
|
|
34
|
+
this.callback = callback;
|
|
35
|
+
this.observer = new IntersectionObserver(this.handleIntersection.bind(this));
|
|
36
|
+
}
|
|
37
|
+
observe(target) {
|
|
38
|
+
this.observer.observe(target);
|
|
39
|
+
}
|
|
40
|
+
throttle(target, throttleTime) {
|
|
41
|
+
this.observer.unobserve(target);
|
|
42
|
+
setTimeout(() => this.observer.observe(target), throttleTime);
|
|
43
|
+
}
|
|
44
|
+
handleIntersection(entries) {
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (entry.isIntersecting) {
|
|
47
|
+
this.callback(entry.target);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
52
|
+
static observeWhile(target, callback, throttleTime) {
|
|
53
|
+
const observer_ = new Observer(async (target2) => {
|
|
54
|
+
const condition = await callback();
|
|
55
|
+
if (condition) observer_.throttle(target2, throttleTime);
|
|
56
|
+
});
|
|
57
|
+
observer_.observe(target);
|
|
58
|
+
return observer_;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
class LazyImgLoader {
|
|
62
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
63
|
+
constructor(callback, attributeName = "data-lazy-load", removeTagAfter = true) {
|
|
64
|
+
__publicField(this, "lazyImgObserver");
|
|
65
|
+
__publicField(this, "delazify", (target) => {
|
|
66
|
+
this.lazyImgObserver.observer.unobserve(target);
|
|
67
|
+
target.src = target.getAttribute(this.attributeName);
|
|
68
|
+
if (this.removeTagAfter) target.removeAttribute(this.attributeName);
|
|
69
|
+
});
|
|
70
|
+
this.attributeName = attributeName;
|
|
71
|
+
this.removeTagAfter = removeTagAfter;
|
|
72
|
+
this.lazyImgObserver = new Observer((target) => {
|
|
73
|
+
callback(target, this.delazify);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
lazify(_target, img, imgSrc) {
|
|
77
|
+
if (!img || !imgSrc) return;
|
|
78
|
+
img.setAttribute(this.attributeName, imgSrc);
|
|
79
|
+
img.src = "";
|
|
80
|
+
this.lazyImgObserver.observe(img);
|
|
81
|
+
}
|
|
82
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
83
|
+
static create(callback) {
|
|
84
|
+
const lazyImgLoader = new LazyImgLoader((target, delazify) => {
|
|
85
|
+
if (callback(target)) {
|
|
86
|
+
delazify(target);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return lazyImgLoader;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function circularShift(n, c = 6, s = 1) {
|
|
93
|
+
return (n + s) % c || c;
|
|
94
|
+
}
|
|
95
|
+
function parseDom(html) {
|
|
96
|
+
const parsed = new DOMParser().parseFromString(html, "text/html").body;
|
|
97
|
+
return parsed.children.length > 1 ? parsed : parsed.firstElementChild;
|
|
98
|
+
}
|
|
99
|
+
function copyAttributes(target, source) {
|
|
100
|
+
for (const attr of source.attributes) {
|
|
101
|
+
attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function replaceElementTag(e, tagName) {
|
|
105
|
+
var _a;
|
|
106
|
+
const newTagElement = document.createElement(tagName);
|
|
107
|
+
copyAttributes(newTagElement, e);
|
|
108
|
+
newTagElement.innerHTML = e.innerHTML;
|
|
109
|
+
(_a = e.parentNode) == null ? void 0 : _a.replaceChild(newTagElement, e);
|
|
110
|
+
return newTagElement;
|
|
111
|
+
}
|
|
112
|
+
function getAllUniqueParents(elements) {
|
|
113
|
+
return Array.from(elements).reduce((acc, v) => {
|
|
114
|
+
if (v.parentElement && !acc.includes(v.parentElement)) {
|
|
115
|
+
acc.push(v.parentElement);
|
|
116
|
+
}
|
|
117
|
+
return acc;
|
|
118
|
+
}, []);
|
|
119
|
+
}
|
|
120
|
+
function findNextSibling(el) {
|
|
121
|
+
if (el.nextElementSibling) return el.nextElementSibling;
|
|
122
|
+
if (el.parentElement) return findNextSibling(el.parentElement);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
function waitForElementExists(parent, selector, callback) {
|
|
126
|
+
const observer = new MutationObserver((_mutations) => {
|
|
127
|
+
const el = parent.querySelector(selector);
|
|
128
|
+
if (el) {
|
|
129
|
+
observer.disconnect();
|
|
130
|
+
callback(el);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
134
|
+
}
|
|
135
|
+
function watchElementChildrenCount(element, callback) {
|
|
136
|
+
let count = element.children.length;
|
|
137
|
+
const observer = new MutationObserver((mutationList, observer2) => {
|
|
138
|
+
for (const mutation of mutationList) {
|
|
139
|
+
if (mutation.type === "childList") {
|
|
140
|
+
if (count !== element.children.length) {
|
|
141
|
+
count = element.children.length;
|
|
142
|
+
callback(observer2, count);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
observer.observe(element, { childList: true });
|
|
148
|
+
}
|
|
149
|
+
function watchDomChangesWithThrottle(element, callback, throttle = 1e3, options = { childList: true, subtree: true, attributes: true }) {
|
|
150
|
+
let lastMutationTime;
|
|
151
|
+
let timeout;
|
|
152
|
+
const observer = new MutationObserver((_mutationList, _observer) => {
|
|
153
|
+
const now = Date.now();
|
|
154
|
+
if (lastMutationTime && now - lastMutationTime < throttle) {
|
|
155
|
+
timeout && clearTimeout(timeout);
|
|
156
|
+
}
|
|
157
|
+
timeout = setTimeout(callback, throttle);
|
|
158
|
+
lastMutationTime = now;
|
|
159
|
+
});
|
|
160
|
+
observer.observe(element, options);
|
|
161
|
+
}
|
|
162
|
+
function downloader(options = { append: "", after: "", button: "", cbBefore: () => {
|
|
163
|
+
} }) {
|
|
164
|
+
var _a, _b;
|
|
165
|
+
const btn = parseDom(options.button);
|
|
166
|
+
if (options.append) (_a = document.querySelector(options.append)) == null ? void 0 : _a.append(btn);
|
|
167
|
+
if (options.after) (_b = document.querySelector(options.after)) == null ? void 0 : _b.after(btn);
|
|
168
|
+
btn.addEventListener("click", (e) => {
|
|
169
|
+
e.preventDefault();
|
|
170
|
+
if (options.cbBefore) options.cbBefore();
|
|
171
|
+
waitForElementExists(document.body, "video", (video) => {
|
|
172
|
+
window.location.href = video.getAttribute("src");
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
const MOBILE_UA = [
|
|
177
|
+
"Mozilla/5.0 (Linux; Android 10; K)",
|
|
178
|
+
"AppleWebKit/537.36 (KHTML, like Gecko)",
|
|
179
|
+
"Chrome/114.0.0.0 Mobile Safari/537.36"
|
|
180
|
+
].join(" ");
|
|
181
|
+
function fetchWith(url, options = { html: false, mobile: false }) {
|
|
182
|
+
const reqOpts = {};
|
|
183
|
+
if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ "User-Agent": MOBILE_UA }) });
|
|
184
|
+
return fetch(url, reqOpts).then((r) => r.text()).then((r) => options.html ? parseDom(r) : r);
|
|
185
|
+
}
|
|
186
|
+
const fetchHtml = (url) => fetchWith(url, { html: true });
|
|
187
|
+
const fetchText = (url) => fetchWith(url);
|
|
188
|
+
function objectToFormData(object) {
|
|
189
|
+
const formData = new FormData();
|
|
190
|
+
Object.entries(object).forEach(([k, v]) => formData.append(k, v));
|
|
191
|
+
return formData;
|
|
192
|
+
}
|
|
193
|
+
function listenEvents(dom, events, callback) {
|
|
194
|
+
for (const e of events) {
|
|
195
|
+
dom.addEventListener(e, callback, true);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
class Tick {
|
|
199
|
+
constructor(delay, startImmediate = true) {
|
|
200
|
+
__publicField(this, "tick");
|
|
201
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
202
|
+
__publicField(this, "callbackFinal");
|
|
203
|
+
this.delay = delay;
|
|
204
|
+
this.startImmediate = startImmediate;
|
|
205
|
+
this.tick = null;
|
|
206
|
+
this.delay = delay;
|
|
207
|
+
this.startImmediate = startImmediate;
|
|
208
|
+
}
|
|
209
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
210
|
+
start(callback, callbackFinal = null) {
|
|
211
|
+
this.stop();
|
|
212
|
+
this.callbackFinal = callbackFinal;
|
|
213
|
+
if (this.startImmediate) callback();
|
|
214
|
+
this.tick = setInterval(callback, this.delay);
|
|
215
|
+
}
|
|
216
|
+
stop() {
|
|
217
|
+
if (this.tick !== null) {
|
|
218
|
+
clearInterval(this.tick);
|
|
219
|
+
this.tick = null;
|
|
220
|
+
}
|
|
221
|
+
if (this.callbackFinal) {
|
|
222
|
+
this.callbackFinal();
|
|
223
|
+
this.callbackFinal = null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function isMob() {
|
|
228
|
+
return /iPhone|Android/i.test(navigator.userAgent);
|
|
229
|
+
}
|
|
230
|
+
async function computeAsyncOneAtTime(iterable) {
|
|
231
|
+
const res = [];
|
|
232
|
+
for await (const f of iterable) {
|
|
233
|
+
res.push(await f());
|
|
234
|
+
}
|
|
235
|
+
return res;
|
|
236
|
+
}
|
|
237
|
+
function wait(milliseconds) {
|
|
238
|
+
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
239
|
+
}
|
|
240
|
+
class SyncPull {
|
|
241
|
+
constructor() {
|
|
242
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
243
|
+
__publicField(this, "pull", []);
|
|
244
|
+
__publicField(this, "lock", false);
|
|
245
|
+
}
|
|
246
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
247
|
+
getHighPriorityFirst(p = 0) {
|
|
248
|
+
if (p > 3 || this.pull.length === 0) return void 0;
|
|
249
|
+
const i = this.pull.findIndex((e) => e.p === p);
|
|
250
|
+
if (i >= 0) {
|
|
251
|
+
const res = this.pull[i].v;
|
|
252
|
+
this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));
|
|
253
|
+
return res;
|
|
254
|
+
}
|
|
255
|
+
return this.getHighPriorityFirst(p + 1);
|
|
256
|
+
}
|
|
257
|
+
*pullGenerator() {
|
|
258
|
+
while (this.pull.length > 0) {
|
|
259
|
+
yield this.getHighPriorityFirst();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
async processPull() {
|
|
263
|
+
if (!this.lock) {
|
|
264
|
+
this.lock = true;
|
|
265
|
+
for await (const f of this.pullGenerator()) {
|
|
266
|
+
await f();
|
|
267
|
+
}
|
|
268
|
+
this.lock = false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
272
|
+
push(x) {
|
|
273
|
+
this.pull.push(x);
|
|
274
|
+
this.processPull();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function chunks(arr, n) {
|
|
278
|
+
const res = [];
|
|
279
|
+
for (let i = 0; i < arr.length; i += n) {
|
|
280
|
+
res.push(arr.slice(i, i + n));
|
|
281
|
+
}
|
|
282
|
+
return res;
|
|
283
|
+
}
|
|
284
|
+
function range(size, startAt = 1) {
|
|
285
|
+
return [...Array(size).keys()].map((i) => i + startAt);
|
|
286
|
+
}
|
|
287
|
+
exports2.LazyImgLoader = LazyImgLoader;
|
|
288
|
+
exports2.MOBILE_UA = MOBILE_UA;
|
|
289
|
+
exports2.Observer = Observer;
|
|
290
|
+
exports2.SyncPull = SyncPull;
|
|
291
|
+
exports2.Tick = Tick;
|
|
292
|
+
exports2.chunks = chunks;
|
|
293
|
+
exports2.circularShift = circularShift;
|
|
294
|
+
exports2.computeAsyncOneAtTime = computeAsyncOneAtTime;
|
|
295
|
+
exports2.copyAttributes = copyAttributes;
|
|
296
|
+
exports2.downloader = downloader;
|
|
297
|
+
exports2.fetchHtml = fetchHtml;
|
|
298
|
+
exports2.fetchText = fetchText;
|
|
299
|
+
exports2.fetchWith = fetchWith;
|
|
300
|
+
exports2.findNextSibling = findNextSibling;
|
|
301
|
+
exports2.getAllUniqueParents = getAllUniqueParents;
|
|
302
|
+
exports2.isMob = isMob;
|
|
303
|
+
exports2.listenEvents = listenEvents;
|
|
304
|
+
exports2.objectToFormData = objectToFormData;
|
|
305
|
+
exports2.parseCSSUrl = parseCSSUrl;
|
|
306
|
+
exports2.parseDataParams = parseDataParams;
|
|
307
|
+
exports2.parseDom = parseDom;
|
|
308
|
+
exports2.parseIntegerOr = parseIntegerOr;
|
|
309
|
+
exports2.range = range;
|
|
310
|
+
exports2.replaceElementTag = replaceElementTag;
|
|
311
|
+
exports2.sanitizeStr = sanitizeStr;
|
|
312
|
+
exports2.stringToWords = stringToWords;
|
|
313
|
+
exports2.timeToSeconds = timeToSeconds;
|
|
314
|
+
exports2.wait = wait;
|
|
315
|
+
exports2.waitForElementExists = waitForElementExists;
|
|
316
|
+
exports2.watchDomChangesWithThrottle = watchDomChangesWithThrottle;
|
|
317
|
+
exports2.watchElementChildrenCount = watchElementChildrenCount;
|
|
318
|
+
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
319
|
+
});
|
|
2
320
|
//# sourceMappingURL=billy-herrington-utils.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/strings/index.ts","../src/utils/parsers/index.ts","../src/utils/observers/index.ts","../src/utils/math/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/utils/events/index.ts","../src/utils/device/index.ts","../src/utils/async/index.ts","../src/utils/arrays/index.ts"],"sourcesContent":["export function stringToWords(s: string): Array<string> {\r\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\r\n}\r\n\r\nexport function sanitizeStr(s: string) {\r\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\r\n}\r\n","export function timeToSeconds(t: string): number {\r\n return (t?.match(/\\d+/gm) || [0])\r\n .reverse()\r\n .map((s, i) => parseInt(s as string) * 60 ** i)\r\n .reduce((a, b) => a + b);\r\n}\r\n\r\nexport function parseIntegerOr(n: string | number, or: number): number {\r\n return Number.isInteger(parseInt(n as string)) ? parseInt(n as string) : or;\r\n}\r\n\r\n// \"data:02;body+head:async;void:;zero:;\"\r\nexport function parseDataParams(str: string) {\r\n const params = str.split(';').flatMap(s => {\r\n const parsed = s.match(/([\\+\\w+]+):(\\w+)?/);\r\n const value = parsed?.[2];\r\n if (value) return parsed[1].split('+').map(p => ({ [p]: value }));\r\n }).filter(_ => _);\r\n return Object.assign({}, ...params);\r\n}\r\n\r\nexport function parseCSSUrl(s: string) {\r\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\r\n}","export class Observer {\r\n public observer: IntersectionObserver;\r\n constructor(private callback: (entry: Element) => void) {\r\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\r\n }\r\n\r\n observe(target: Element) {\r\n this.observer.observe(target);\r\n }\r\n\r\n throttle(target: Element, throttleTime: number) {\r\n this.observer.unobserve(target);\r\n setTimeout(() => this.observer.observe(target), throttleTime);\r\n }\r\n\r\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n this.callback(entry.target);\r\n }\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static observeWhile(target: Element, callback: any, throttleTime: number) {\r\n const observer_ = new Observer(async (target: Element) => {\r\n const condition = await callback();\r\n if (condition) observer_.throttle(target, throttleTime);\r\n });\r\n observer_.observe(target);\r\n return observer_;\r\n }\r\n}\r\n\r\nexport class LazyImgLoader {\r\n public lazyImgObserver: Observer;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n constructor(callback: any, private attributeName = 'data-lazy-load', private removeTagAfter = true) {\r\n this.lazyImgObserver = new Observer((target: Element) => {\r\n callback(target, this.delazify);\r\n });\r\n }\r\n\r\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\r\n if (!img || !imgSrc) return;\r\n img.setAttribute(this.attributeName, imgSrc);\r\n img.src = '';\r\n this.lazyImgObserver.observe(img);\r\n }\r\n\r\n delazify = (target: HTMLImageElement) => {\r\n this.lazyImgObserver.observer.unobserve(target);\r\n target.src = target.getAttribute(this.attributeName) as string;\r\n if (this.removeTagAfter) target.removeAttribute(this.attributeName);\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static create(callback: any) {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n const lazyImgLoader = new LazyImgLoader((target: Element, delazify: any) => {\r\n if (callback(target)) {\r\n delazify(target);\r\n }\r\n });\r\n return lazyImgLoader;\r\n }\r\n}\r\n","export function circularShift(n: number, c = 6, s = 1): number {\r\n return (n + s) % c || c;\r\n}\r\n","export function parseDom(html: string): HTMLElement {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\r\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\r\n}\r\n\r\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\r\n for (const attr of source.attributes) {\r\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\r\n }\r\n}\r\n\r\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\r\n const newTagElement = document.createElement(tagName);\r\n copyAttributes(newTagElement, e);\r\n newTagElement.innerHTML = e.innerHTML;\r\n e.parentNode?.replaceChild(newTagElement, e);\r\n return newTagElement;\r\n}\r\n\r\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\r\n return Array.from(elements).reduce((acc, v) => {\r\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\r\n return acc;\r\n }, [] as Array<HTMLElement | Element>);\r\n}\r\n\r\nexport function findNextSibling(el: HTMLElement | Element) {\r\n if (el.nextElementSibling) return el.nextElementSibling;\r\n if (el.parentElement) return findNextSibling(el.parentElement);\r\n return null;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void {\r\n const observer = new MutationObserver((_mutations) => {\r\n const el = parent.querySelector(selector);\r\n if (el) {\r\n observer.disconnect();\r\n callback(el);\r\n }\r\n });\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void {\r\n let count = element.children.length;\r\n const observer = new MutationObserver((mutationList, observer) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === \"childList\") {\r\n if (count !== element.children.length) {\r\n count = element.children.length;\r\n callback(observer, count);\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(element, { childList: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any,\r\n throttle = 1000, options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }) {\r\n let lastMutationTime: number;\r\n let timeout: number;\r\n const observer = new MutationObserver((_mutationList, _observer) => {\r\n const now = Date.now();\r\n if (lastMutationTime && now - lastMutationTime < throttle) {\r\n timeout && clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(callback, throttle);\r\n lastMutationTime = now;\r\n });\r\n observer.observe(element, options);\r\n}\r\n\r\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\r\n const btn = parseDom(options.button);\r\n\r\n if (options.append) document.querySelector(options.append)?.append(btn);\r\n if (options.after) document.querySelector(options.after)?.after(btn);\r\n\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n if (options.cbBefore) options.cbBefore();\r\n\r\n waitForElementExists(document.body, 'video', (video: HTMLVideoElement) => {\r\n window.location.href = video.getAttribute('src') as string;\r\n });\r\n });\r\n}","import { parseDom } from \"../dom\";\r\n\r\nexport const MOBILE_UA = [\r\n 'Mozilla/5.0 (Linux; Android 10; K)',\r\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\r\n 'Chrome/114.0.0.0 Mobile Safari/537.36'].join(' ');\r\n\r\nexport function fetchWith(url: string, options: Record<string, boolean> = { html: false, mobile: false }) {\r\n const reqOpts = {};\r\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ \"User-Agent\": MOBILE_UA }) });\r\n return fetch(url, reqOpts).then((r) => r.text()).then(r => options.html ? parseDom(r) : r);\r\n}\r\n\r\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true });\r\n\r\nexport const fetchText = (url: string) => fetchWith(url);\r\n\r\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\r\n const formData = new FormData();\r\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\r\n return formData;\r\n}\r\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void {\r\n for (const e of events) {\r\n dom.addEventListener(e, callback, true);\r\n }\r\n}\r\n\r\nexport class Tick {\r\n private tick: null | number;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n private callbackFinal: any;\r\n\r\n constructor(private delay: number, private startImmediate = true) {\r\n this.tick = null;\r\n this.delay = delay;\r\n this.startImmediate = startImmediate;\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n start(callback: any, callbackFinal = null) {\r\n this.stop();\r\n this.callbackFinal = callbackFinal;\r\n if (this.startImmediate) callback();\r\n this.tick = setInterval(callback, this.delay);\r\n }\r\n\r\n stop() {\r\n if (this.tick !== null) {\r\n clearInterval(this.tick);\r\n this.tick = null;\r\n }\r\n if (this.callbackFinal) {\r\n this.callbackFinal();\r\n this.callbackFinal = null;\r\n }\r\n }\r\n}","export function isMob() {\r\n return /iPhone|Android/i.test(navigator.userAgent);\r\n}","// https://2ality.com/2016/10/asynchronous-iteration.html\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport async function computeAsyncOneAtTime(iterable: Iterable<any>) {\r\n const res = [];\r\n for await (const f of iterable) {\r\n res.push(await f());\r\n }\r\n return res;\r\n}\r\n\r\nexport function wait(milliseconds: number) {\r\n return new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n// do async one at time\r\nexport class SyncPull {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n pull: Array<any> = [];\r\n lock = false;\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n getHighPriorityFirst(p = 0): any {\r\n if (p > 3 || this.pull.length === 0) return undefined;\r\n const i = this.pull.findIndex(e => e.p === p);\r\n if (i >= 0) {\r\n const res = this.pull[i].v;\r\n this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));\r\n return res;\r\n }\r\n return this.getHighPriorityFirst(p + 1);\r\n }\r\n\r\n *pullGenerator() {\r\n while (this.pull.length > 0) {\r\n yield this.getHighPriorityFirst();\r\n }\r\n }\r\n\r\n async processPull() {\r\n if (!this.lock) {\r\n this.lock = true;\r\n for await (const f of this.pullGenerator()) {\r\n await f();\r\n }\r\n this.lock = false;\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n push(x: any) {\r\n this.pull.push(x);\r\n this.processPull();\r\n }\r\n}\r\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\r\n const res = [];\r\n for (let i = 0; i < arr.length; i += n) {\r\n res.push(arr.slice(i, i + n));\r\n }\r\n return res;\r\n}\r\n\r\nexport function range(size: number, startAt = 1): Array<number> {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n}"],"names":["stringToWords","s","_","sanitizeStr","timeToSeconds","t","i","a","b","parseIntegerOr","or","parseDataParams","str","params","parsed","value","p","parseCSSUrl","Observer","callback","__publicField","target","throttleTime","entries","entry","observer_","LazyImgLoader","attributeName","removeTagAfter","_target","img","imgSrc","delazify","circularShift","c","parseDom","html","copyAttributes","source","attr","replaceElementTag","e","tagName","newTagElement","_a","getAllUniqueParents","elements","acc","v","findNextSibling","el","waitForElementExists","parent","selector","observer","_mutations","watchElementChildrenCount","element","count","mutationList","mutation","watchDomChangesWithThrottle","throttle","options","lastMutationTime","timeout","_mutationList","_observer","now","downloader","btn","_b","video","MOBILE_UA","fetchWith","url","reqOpts","fetchHtml","fetchText","objectToFormData","object","formData","k","listenEvents","dom","events","Tick","delay","startImmediate","callbackFinal","isMob","computeAsyncOneAtTime","iterable","res","f","wait","milliseconds","resolve","SyncPull","x","chunks","arr","n","range","size","startAt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/strings/index.ts","../src/utils/parsers/index.ts","../src/utils/observers/index.ts","../src/utils/math/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/utils/events/index.ts","../src/utils/device/index.ts","../src/utils/async/index.ts","../src/utils/arrays/index.ts"],"sourcesContent":["export function stringToWords(s: string): Array<string> {\r\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\r\n}\r\n\r\nexport function sanitizeStr(s: string) {\r\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\r\n}\r\n","export function timeToSeconds(t: string): number {\r\n return (t?.match(/\\d+/gm) || [0])\r\n .reverse()\r\n .map((s, i) => parseInt(s as string) * 60 ** i)\r\n .reduce((a, b) => a + b);\r\n}\r\n\r\nexport function parseIntegerOr(n: string | number, or: number): number {\r\n return Number.isInteger(parseInt(n as string)) ? parseInt(n as string) : or;\r\n}\r\n\r\n// \"data:02;body+head:async;void:;zero:;\"\r\nexport function parseDataParams(str: string) {\r\n const params = str.split(';').flatMap(s => {\r\n const parsed = s.match(/([\\+\\w+]+):(\\w+)?/);\r\n const value = parsed?.[2];\r\n if (value) return parsed[1].split('+').map(p => ({ [p]: value }));\r\n }).filter(_ => _);\r\n return Object.assign({}, ...params);\r\n}\r\n\r\nexport function parseCSSUrl(s: string) {\r\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\r\n}","export class Observer {\r\n public observer: IntersectionObserver;\r\n constructor(private callback: (entry: Element) => void) {\r\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\r\n }\r\n\r\n observe(target: Element) {\r\n this.observer.observe(target);\r\n }\r\n\r\n throttle(target: Element, throttleTime: number) {\r\n this.observer.unobserve(target);\r\n setTimeout(() => this.observer.observe(target), throttleTime);\r\n }\r\n\r\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n this.callback(entry.target);\r\n }\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static observeWhile(target: Element, callback: any, throttleTime: number) {\r\n const observer_ = new Observer(async (target: Element) => {\r\n const condition = await callback();\r\n if (condition) observer_.throttle(target, throttleTime);\r\n });\r\n observer_.observe(target);\r\n return observer_;\r\n }\r\n}\r\n\r\nexport class LazyImgLoader {\r\n public lazyImgObserver: Observer;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n constructor(callback: any, private attributeName = 'data-lazy-load', private removeTagAfter = true) {\r\n this.lazyImgObserver = new Observer((target: Element) => {\r\n callback(target, this.delazify);\r\n });\r\n }\r\n\r\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\r\n if (!img || !imgSrc) return;\r\n img.setAttribute(this.attributeName, imgSrc);\r\n img.src = '';\r\n this.lazyImgObserver.observe(img);\r\n }\r\n\r\n delazify = (target: HTMLImageElement) => {\r\n this.lazyImgObserver.observer.unobserve(target);\r\n target.src = target.getAttribute(this.attributeName) as string;\r\n if (this.removeTagAfter) target.removeAttribute(this.attributeName);\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static create(callback: any) {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n const lazyImgLoader = new LazyImgLoader((target: Element, delazify: any) => {\r\n if (callback(target)) {\r\n delazify(target);\r\n }\r\n });\r\n return lazyImgLoader;\r\n }\r\n}\r\n","export function circularShift(n: number, c = 6, s = 1): number {\r\n return (n + s) % c || c;\r\n}\r\n","export function parseDom(html: string): HTMLElement {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\r\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\r\n}\r\n\r\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\r\n for (const attr of source.attributes) {\r\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\r\n }\r\n}\r\n\r\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\r\n const newTagElement = document.createElement(tagName);\r\n copyAttributes(newTagElement, e);\r\n newTagElement.innerHTML = e.innerHTML;\r\n e.parentNode?.replaceChild(newTagElement, e);\r\n return newTagElement;\r\n}\r\n\r\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\r\n return Array.from(elements).reduce((acc, v) => {\r\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\r\n return acc;\r\n }, [] as Array<HTMLElement | Element>);\r\n}\r\n\r\nexport function findNextSibling(el: HTMLElement | Element) {\r\n if (el.nextElementSibling) return el.nextElementSibling;\r\n if (el.parentElement) return findNextSibling(el.parentElement);\r\n return null;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void {\r\n const observer = new MutationObserver((_mutations) => {\r\n const el = parent.querySelector(selector);\r\n if (el) {\r\n observer.disconnect();\r\n callback(el);\r\n }\r\n });\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void {\r\n let count = element.children.length;\r\n const observer = new MutationObserver((mutationList, observer) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === \"childList\") {\r\n if (count !== element.children.length) {\r\n count = element.children.length;\r\n callback(observer, count);\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(element, { childList: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any,\r\n throttle = 1000, options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }) {\r\n let lastMutationTime: number;\r\n let timeout: number;\r\n const observer = new MutationObserver((_mutationList, _observer) => {\r\n const now = Date.now();\r\n if (lastMutationTime && now - lastMutationTime < throttle) {\r\n timeout && clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(callback, throttle);\r\n lastMutationTime = now;\r\n });\r\n observer.observe(element, options);\r\n}\r\n\r\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\r\n const btn = parseDom(options.button);\r\n\r\n if (options.append) document.querySelector(options.append)?.append(btn);\r\n if (options.after) document.querySelector(options.after)?.after(btn);\r\n\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n if (options.cbBefore) options.cbBefore();\r\n\r\n waitForElementExists(document.body, 'video', (video: HTMLVideoElement) => {\r\n window.location.href = video.getAttribute('src') as string;\r\n });\r\n });\r\n}","import { parseDom } from \"../dom\";\r\n\r\nexport const MOBILE_UA = [\r\n 'Mozilla/5.0 (Linux; Android 10; K)',\r\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\r\n 'Chrome/114.0.0.0 Mobile Safari/537.36'].join(' ');\r\n\r\nexport function fetchWith(url: string, options: Record<string, boolean> = { html: false, mobile: false }) {\r\n const reqOpts = {};\r\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ \"User-Agent\": MOBILE_UA }) });\r\n return fetch(url, reqOpts).then((r) => r.text()).then(r => options.html ? parseDom(r) : r);\r\n}\r\n\r\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true });\r\n\r\nexport const fetchText = (url: string) => fetchWith(url);\r\n\r\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\r\n const formData = new FormData();\r\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\r\n return formData;\r\n}\r\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void {\r\n for (const e of events) {\r\n dom.addEventListener(e, callback, true);\r\n }\r\n}\r\n\r\nexport class Tick {\r\n private tick: null | number;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n private callbackFinal: any;\r\n\r\n constructor(private delay: number, private startImmediate = true) {\r\n this.tick = null;\r\n this.delay = delay;\r\n this.startImmediate = startImmediate;\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n start(callback: any, callbackFinal = null) {\r\n this.stop();\r\n this.callbackFinal = callbackFinal;\r\n if (this.startImmediate) callback();\r\n this.tick = setInterval(callback, this.delay);\r\n }\r\n\r\n stop() {\r\n if (this.tick !== null) {\r\n clearInterval(this.tick);\r\n this.tick = null;\r\n }\r\n if (this.callbackFinal) {\r\n this.callbackFinal();\r\n this.callbackFinal = null;\r\n }\r\n }\r\n}","export function isMob() {\r\n return /iPhone|Android/i.test(navigator.userAgent);\r\n}","// https://2ality.com/2016/10/asynchronous-iteration.html\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport async function computeAsyncOneAtTime(iterable: Iterable<any>) {\r\n const res = [];\r\n for await (const f of iterable) {\r\n res.push(await f());\r\n }\r\n return res;\r\n}\r\n\r\nexport function wait(milliseconds: number) {\r\n return new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n// do async one at time\r\nexport class SyncPull {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n pull: Array<any> = [];\r\n lock = false;\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n getHighPriorityFirst(p = 0): any {\r\n if (p > 3 || this.pull.length === 0) return undefined;\r\n const i = this.pull.findIndex(e => e.p === p);\r\n if (i >= 0) {\r\n const res = this.pull[i].v;\r\n this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));\r\n return res;\r\n }\r\n return this.getHighPriorityFirst(p + 1);\r\n }\r\n\r\n *pullGenerator() {\r\n while (this.pull.length > 0) {\r\n yield this.getHighPriorityFirst();\r\n }\r\n }\r\n\r\n async processPull() {\r\n if (!this.lock) {\r\n this.lock = true;\r\n for await (const f of this.pullGenerator()) {\r\n await f();\r\n }\r\n this.lock = false;\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n push(x: any) {\r\n this.pull.push(x);\r\n this.processPull();\r\n }\r\n}\r\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\r\n const res = [];\r\n for (let i = 0; i < arr.length; i += n) {\r\n res.push(arr.slice(i, i + n));\r\n }\r\n return res;\r\n}\r\n\r\nexport function range(size: number, startAt = 1): Array<number> {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n}"],"names":["s","target","observer"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export declare function chunks<T>(arr: Array<T>, n: number): Array<Array<T>>;
|
|
2
|
+
|
|
3
|
+
export declare function circularShift(n: number, c?: number, s?: number): number;
|
|
4
|
+
|
|
5
|
+
export declare function computeAsyncOneAtTime(iterable: Iterable<any>): Promise<any[]>;
|
|
6
|
+
|
|
7
|
+
export declare function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element): void;
|
|
8
|
+
|
|
9
|
+
export declare function downloader(options?: {
|
|
10
|
+
append: string;
|
|
11
|
+
after: string;
|
|
12
|
+
button: string;
|
|
13
|
+
cbBefore: () => void;
|
|
14
|
+
}): void;
|
|
15
|
+
|
|
16
|
+
export declare const fetchHtml: (url: string) => Promise<string | HTMLElement>;
|
|
17
|
+
|
|
18
|
+
export declare const fetchText: (url: string) => Promise<string | HTMLElement>;
|
|
19
|
+
|
|
20
|
+
export declare function fetchWith(url: string, options?: Record<string, boolean>): Promise<string | HTMLElement>;
|
|
21
|
+
|
|
22
|
+
export declare function findNextSibling(el: HTMLElement | Element): Element | null;
|
|
23
|
+
|
|
24
|
+
export declare function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element>;
|
|
25
|
+
|
|
26
|
+
export declare function isMob(): boolean;
|
|
27
|
+
|
|
28
|
+
export declare class LazyImgLoader {
|
|
29
|
+
private attributeName;
|
|
30
|
+
private removeTagAfter;
|
|
31
|
+
lazyImgObserver: Observer;
|
|
32
|
+
constructor(callback: any, attributeName?: string, removeTagAfter?: boolean);
|
|
33
|
+
lazify(_target: Element, img: HTMLImageElement, imgSrc: string): void;
|
|
34
|
+
delazify: (target: HTMLImageElement) => void;
|
|
35
|
+
static create(callback: any): LazyImgLoader;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export declare function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void;
|
|
39
|
+
|
|
40
|
+
export declare const MOBILE_UA: string;
|
|
41
|
+
|
|
42
|
+
export declare function objectToFormData(object: Record<string, number | boolean | string>): FormData;
|
|
43
|
+
|
|
44
|
+
export declare class Observer {
|
|
45
|
+
private callback;
|
|
46
|
+
observer: IntersectionObserver;
|
|
47
|
+
constructor(callback: (entry: Element) => void);
|
|
48
|
+
observe(target: Element): void;
|
|
49
|
+
throttle(target: Element, throttleTime: number): void;
|
|
50
|
+
handleIntersection(entries: Iterable<IntersectionObserverEntry>): void;
|
|
51
|
+
static observeWhile(target: Element, callback: any, throttleTime: number): Observer;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export declare function parseCSSUrl(s: string): string;
|
|
55
|
+
|
|
56
|
+
export declare function parseDataParams(str: string): any;
|
|
57
|
+
|
|
58
|
+
export declare function parseDom(html: string): HTMLElement;
|
|
59
|
+
|
|
60
|
+
export declare function parseIntegerOr(n: string | number, or: number): number;
|
|
61
|
+
|
|
62
|
+
export declare function range(size: number, startAt?: number): Array<number>;
|
|
63
|
+
|
|
64
|
+
export declare function replaceElementTag(e: HTMLElement | Element, tagName: string): HTMLElement;
|
|
65
|
+
|
|
66
|
+
export declare function sanitizeStr(s: string): string;
|
|
67
|
+
|
|
68
|
+
export declare function stringToWords(s: string): Array<string>;
|
|
69
|
+
|
|
70
|
+
export declare class SyncPull {
|
|
71
|
+
pull: Array<any>;
|
|
72
|
+
lock: boolean;
|
|
73
|
+
getHighPriorityFirst(p?: number): any;
|
|
74
|
+
pullGenerator(): Generator<any, void, unknown>;
|
|
75
|
+
processPull(): Promise<void>;
|
|
76
|
+
push(x: any): void;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export declare class Tick {
|
|
80
|
+
private delay;
|
|
81
|
+
private startImmediate;
|
|
82
|
+
private tick;
|
|
83
|
+
private callbackFinal;
|
|
84
|
+
constructor(delay: number, startImmediate?: boolean);
|
|
85
|
+
start(callback: any, callbackFinal?: null): void;
|
|
86
|
+
stop(): void;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export declare function timeToSeconds(t: string): number;
|
|
90
|
+
|
|
91
|
+
export declare function wait(milliseconds: number): Promise<unknown>;
|
|
92
|
+
|
|
93
|
+
export declare function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void;
|
|
94
|
+
|
|
95
|
+
export declare function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any, throttle?: number, options?: Record<string, boolean>): void;
|
|
96
|
+
|
|
97
|
+
export declare function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void;
|
|
98
|
+
|
|
99
|
+
export { }
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "billy-herrington-utils",
|
|
3
3
|
"description": "daddy told us not to be ashamed of our utils",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.7",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": ["utils", "observer", "dom", "fetch", "arrays"],
|
|
7
7
|
"author": "smartacephale atm.mormon@protonmail.com (https://github.com/smartacephale)",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"homepage": "https://github.com/smartacephale/billy-herrington-utils#readme",
|
|
10
|
-
"main": "
|
|
11
|
-
"types": "
|
|
10
|
+
"main": "index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
12
|
"module": "./dist/billy-herrington-utils.es.js",
|
|
13
13
|
"repository": "github:smartacephale/billy-herrington-utils",
|
|
14
14
|
"bugs": {
|
|
@@ -31,5 +31,8 @@
|
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"typescript": "^5.5.3",
|
|
33
33
|
"vite": "^5.4.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"vite-plugin-dts": "^4.0.3"
|
|
34
37
|
}
|
|
35
38
|
}
|
package/vite.config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { defineConfig } from "vite";
|
|
3
|
+
import dts from 'vite-plugin-dts'
|
|
3
4
|
|
|
4
5
|
export default ({ mode }) => {
|
|
5
6
|
return defineConfig({
|
|
@@ -11,12 +12,14 @@ export default ({ mode }) => {
|
|
|
11
12
|
},
|
|
12
13
|
build: {
|
|
13
14
|
sourcemap: true,
|
|
15
|
+
minify: false,
|
|
14
16
|
lib: {
|
|
15
|
-
minify:
|
|
17
|
+
// minify: false,
|
|
16
18
|
entry: path.resolve(__dirname, "./src/index.ts"),
|
|
17
19
|
name: "bhutils",
|
|
18
20
|
fileName: (format) => `billy-herrington-utils.${format}.js`,
|
|
19
21
|
}
|
|
20
22
|
},
|
|
23
|
+
plugins: [dts({ rollupTypes: true })]
|
|
21
24
|
});
|
|
22
25
|
};
|
/package/{index.ts → index.js}
RENAMED
|
File without changes
|