pervert-monkey 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/core/pervertmonkey.core.es.d.ts +391 -0
- package/dist/core/pervertmonkey.core.es.js +8497 -0
- package/dist/core/pervertmonkey.core.es.js.map +1 -0
- package/dist/core/pervertmonkey.core.umd.js +8500 -0
- package/dist/core/pervertmonkey.core.umd.js.map +1 -0
- package/dist/userscripts/3hentai.user.js +1176 -0
- package/dist/userscripts/camgirlfinder.user.js +68 -0
- package/dist/userscripts/camwhores.user.js +1602 -0
- package/dist/userscripts/e-hentai.user.js +1212 -0
- package/dist/userscripts/ebalka.user.js +1231 -0
- package/dist/userscripts/eporner.user.js +1265 -0
- package/dist/userscripts/erome.user.js +1245 -0
- package/dist/userscripts/eroprofile.user.js +1194 -0
- package/dist/userscripts/javhdporn.user.js +1178 -0
- package/dist/userscripts/missav.user.js +1182 -0
- package/dist/userscripts/motherless.user.js +1380 -0
- package/dist/userscripts/namethatporn.user.js +1218 -0
- package/dist/userscripts/nhentai.user.js +1262 -0
- package/dist/userscripts/pornhub.user.js +1199 -0
- package/dist/userscripts/spankbang.user.js +1239 -0
- package/dist/userscripts/xhamster.user.js +1374 -0
- package/dist/userscripts/xvideos.user.js +1254 -0
- package/package.json +54 -0
- package/src/core/data-control/data-filter.ts +143 -0
- package/src/core/data-control/data-manager.ts +144 -0
- package/src/core/data-control/index.ts +2 -0
- package/src/core/infinite-scroll/index.ts +143 -0
- package/src/core/jabroni-config/default-scheme.ts +97 -0
- package/src/core/jabroni-config/default-store.ts +9 -0
- package/src/core/pagination-parsing/index.ts +55 -0
- package/src/core/pagination-parsing/pagination-strategies/PaginationStrategy.ts +44 -0
- package/src/core/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts +66 -0
- package/src/core/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts +77 -0
- package/src/core/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts +56 -0
- package/src/core/pagination-parsing/pagination-strategies/index.ts +4 -0
- package/src/core/pagination-parsing/pagination-utils/index.ts +84 -0
- package/src/core/rules/index.ts +385 -0
- package/src/index.ts +42 -0
- package/src/types/index.ts +7 -0
- package/src/userscripts/ascii-logos.js +468 -0
- package/src/userscripts/index.ts +1 -0
- package/src/userscripts/meta.json +11 -0
- package/src/userscripts/scripts/3hentai.ts +20 -0
- package/src/userscripts/scripts/camgirlfinder.ts +68 -0
- package/src/userscripts/scripts/camwhores.ts +382 -0
- package/src/userscripts/scripts/e-hentai.ts +68 -0
- package/src/userscripts/scripts/ebalka.ts +58 -0
- package/src/userscripts/scripts/eporner.ts +90 -0
- package/src/userscripts/scripts/erome.ts +105 -0
- package/src/userscripts/scripts/eroprofile.ts +38 -0
- package/src/userscripts/scripts/javhdporn.ts +24 -0
- package/src/userscripts/scripts/missav.ts +28 -0
- package/src/userscripts/scripts/motherless.ts +222 -0
- package/src/userscripts/scripts/namethatporn.ts +68 -0
- package/src/userscripts/scripts/nhentai.ts +135 -0
- package/src/userscripts/scripts/pornhub.ts +53 -0
- package/src/userscripts/scripts/spankbang.ts +61 -0
- package/src/userscripts/scripts/thisvid.ts +716 -0
- package/src/userscripts/scripts/xhamster.ts +179 -0
- package/src/userscripts/scripts/xvideos.ts +83 -0
- package/src/utils/arrays/index.ts +15 -0
- package/src/utils/async/index.ts +3 -0
- package/src/utils/dom/dom-observers.ts +76 -0
- package/src/utils/dom/index.ts +156 -0
- package/src/utils/events/index.ts +2 -0
- package/src/utils/events/on-pointer-over-and-leave.ts +35 -0
- package/src/utils/events/tick.ts +27 -0
- package/src/utils/fetch/index.ts +37 -0
- package/src/utils/math/index.ts +3 -0
- package/src/utils/objects/index.ts +9 -0
- package/src/utils/objects/memoize.ts +25 -0
- package/src/utils/observers/index.ts +44 -0
- package/src/utils/observers/lazy-image-loader.ts +27 -0
- package/src/utils/parsers/index.ts +30 -0
- package/src/utils/parsers/time-parser.ts +28 -0
- package/src/utils/strings/index.ts +10 -0
- package/src/utils/strings/regexes.ts +35 -0
- package/src/vite-env.d.ts +4 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 mormon-atm
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# PervertMonkey
|
|
2
|
+
|
|
3
|
+
<img alt="Static Badge" src="https://img.shields.io/badge/Tampermonkey-OK-aliceblue?labelColor=lightblue"> <img alt="Static Badge" src="https://img.shields.io/badge/Violentmonkey-OK-slategray?labelColor=skyblue">
|
|
4
|
+
|
|
5
|
+
```install scripts:``` https://sleazyfork.org/en/scripts?set=590816
|
|
6
|
+
|
|
7
|
+
## How it works
|
|
8
|
+
#### So... Listen to this!
|
|
9
|
+
If you are lucky, you can build your own userscript with infinite scroller and content filters with just this setup:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// replace with selectors of your own
|
|
13
|
+
const rules = new RulesGlobal({
|
|
14
|
+
containerSelector: 'div:has(> article)',
|
|
15
|
+
thumbsSelector: 'article.thumb-block',
|
|
16
|
+
titleSelector: 'header.entry-header',
|
|
17
|
+
durationSelector: '.duration',
|
|
18
|
+
paginationStrategyOptions: {
|
|
19
|
+
pathnameSelector: /\/page\/(\d+)\/?$/,
|
|
20
|
+
},
|
|
21
|
+
schemeOptions: ['Text Filter', 'Badge', 'Duration Filter', 'Advanced'],
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
_see you space cowboy 😘_
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
⠅⠅⠅⠅⠅⠅⠅⠅⠅⠅⠅⠅⠅⠅⠅⢅⢑⠡⠡⠡⠡⠡⠡⠡⠡⠡⢡⢡⢡⠡⡡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⢁
|
|
28
|
+
⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⢐⠨⠨⠨⠨⢨⠨⠨⠨⢈⢂⠣⠣⢣⢪⢪⢪⢌⢌⢌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⡪⡨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⢐
|
|
29
|
+
⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⢈⢪⠨⢐⠨⠨⠨⠨⢐⢨⢬⣬⣴⣴⣬⢨⢐⠨⢘⠘⢎⢎⢎⢎⢎⢬⢨⢨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⢐⠰⡘⡜⢜⢌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⡐
|
|
30
|
+
⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⠡⢸⠸⠨⢐⠨⠨⣨⣼⣾⣿⣟⣷⡳⡯⣺⡯⣷⢮⣐⠨⢐⢐⢐⠨⠨⢈⢊⠪⠨⢈⢊⠪⠨⠨⠨⠨⠨⠨⠨⠨⢐⢐⠐⢌⠪⡪⡪⠨⠨⠨⠨⠨⠨⠨⠨⢐⢐
|
|
31
|
+
⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⡆⠌⠌⣐⣼⡿⣿⢿⢟⢷⣻⡺⣝⡵⡳⠹⣝⢯⢟⡿⡶⣖⡶⡬⣌⡐⡐⠨⠨⢐⢐⠨⠨⠨⠨⠨⠨⠨⠨⠨⢐⢐⠨⠠⢑⢈⠪⣣⠡⠡⠡⠡⠡⠡⢁⢂⢂
|
|
32
|
+
⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⠨⡸⠡⢡⣵⢿⢕⣟⢧⡯⡱⡳⣕⡟⢾⢵⠌⣇⡷⡕⢏⣇⢟⢗⢹⣹⢺⡽⣦⢥⡁⡂⡂⠌⠌⠌⠌⠌⠌⠌⠌⠌⡐⡐⠨⠨⢐⢐⢐⢈⢪⠨⠨⠨⠨⠨⢐⢐⢐
|
|
33
|
+
⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⢌⠌⢄⣵⣿⣺⢯⡛⢮⡻⡮⡇⣿⢾⡅⢸⢼⣿⢼⠼⡴⣝⡜⣾⢝⢕⢕⠱⣻⡽⡱⣟⢗⣜⢎⡌⠌⠌⠌⠌⠌⢌⢂⢂⠂⠅⠅⡂⡂⡂⡂⡂⢅⠡⠡⠡⢁⢂⢂⢂
|
|
34
|
+
⠌⠌⠌⠌⠌⠌⠌⠌⠌⠌⡊⣼⢽⣷⣟⡵⡝⣵⢱⢝⢍⢌⠚⢿⣳⡘⣜⠯⣝⢽⢺⢧⢩⡚⡰⣝⠬⡣⣵⡿⣎⠺⡪⡺⣕⣇⢧⡅⠅⠅⠅⡂⠌⠆⠌⢌⢂⢂⢂⢂⢂⢂⠂⠅⠅⠅⡂⡂⡂⡂
|
|
35
|
+
⠡⠡⠡⠡⠡⠡⠡⠡⠡⣡⣾⣿⣿⡷⣧⢣⢪⣟⢌⢗⣕⣐⢨⢸⢱⡻⣳⢝⢞⢜⢜⢧⢝⢝⢮⡳⡱⣽⢳⢝⢽⢖⢵⢫⢻⢽⢷⣻⣯⣮⣐⠠⠡⢁⠣⡣⡢⡂⡂⡂⡂⡂⠌⠸⠨⢐⢐⢐⢐⢐
|
|
36
|
+
⠨⠨⠨⠨⠨⠨⠨⠨⣰⣿⣿⣿⣿⣿⣳⢹⢕⢇⢓⢅⡑⣕⢕⢕⢕⢝⢜⢌⢆⢦⡱⣱⢱⡱⣱⣕⣝⣜⣬⣨⣪⢮⣢⡧⣖⣦⣣⣇⢧⡻⡽⣿⣌⡐⠠⠑⢕⢌⢂⢂⠢⡨⠨⢈⢪⢐⢐⢐⢐⢐
|
|
37
|
+
⠨⠨⠨⠨⠨⠨⢈⠢⣿⣿⣿⣿⣿⣟⢮⣳⣳⣯⣿⣷⣿⣿⣿⡿⣿⢿⣿⢿⡿⣟⣷⣱⢳⢝⣵⡿⣾⡽⣾⢯⣿⣻⣟⣿⣻⡯⣿⢾⣻⣻⣽⢾⡽⣷⡅⠅⡂⡑⢕⢑⢕⠌⠌⡐⠸⡐⡐⡐⡐⡐
|
|
38
|
+
⠅⠅⠅⠅⠅⠅⡂⢌⣿⣿⢿⣿⣿⣯⣿⡿⢿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣟⣿⣺⢌⢝⡽⣟⡧⠡⠑⠝⡞⣗⢯⢷⢗⢿⢽⢯⣟⣾⣺⢯⣟⡷⣿⢧⡂⠌⡂⡂⢇⠅⠅⡂⠅⡇⡂⡂⡂⡂
|
|
39
|
+
⠅⠅⠅⠅⠅⠅⡂⢼⣻⡾⣿⣿⣗⣿⣿⢑⠠⡑⡙⠝⢟⢝⣿⣿⣿⣿⣷⣿⣿⣿⣽⡞⣕⣓⢝⣯⢯⣧⢡⢁⢃⢢⣩⣪⢾⣽⢽⣝⢾⡺⡾⣽⣺⣻⢼⣲⣯⢐⢐⢐⠘⡌⡐⡈⢮⡂⡂⡂⡂⡂
|
|
40
|
+
⠅⠅⠅⠅⠅⠅⡂⣿⣿⢿⡽⣯⣷⣿⣟⣿⣶⣐⢠⣱⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣗⡏⠌⠌⡮⡺⣿⢾⣟⣶⣖⣿⢷⣿⢿⣽⣟⡾⡯⡯⣟⣞⣮⣗⢽⣻⣾⢂⢂⢂⢂⢂⢂⢂⢣⢃⢂⢂⢂⢂
|
|
41
|
+
⠨⠨⠨⠨⠨⠐⠄⣿⣿⣯⢻⣿⣻⣿⣿⣻⠪⡻⣯⣟⣯⣿⢿⣿⣿⣻⣽⣿⡿⡵⡓⠇⠅⠅⡯⣗⡝⣿⣿⣳⢯⣟⣯⣿⣟⣯⣷⢿⣻⡯⣿⡽⣾⠎⣺⢵⣟⡆⡂⡂⡂⡂⡂⡂⢸⢐⢐⢐⢐⢐
|
|
42
|
+
⠌⠌⠌⠌⠌⠌⢢⢻⣿⢮⢺⣻⣿⡗⣿⣯⣧⡻⣺⡺⣽⣾⣿⣻⣿⢿⣿⣿⢯⢇⢮⠃⠅⠅⢯⢞⣎⢟⣯⣿⣻⣞⡿⡾⣯⢿⣾⣻⣿⣻⣟⣿⡻⡐⢼⢯⡾⣇⢂⢂⢢⢃⢂⠂⠌⡆⡂⡂⡂⡂
|
|
43
|
+
⠅⠅⠅⠅⠅⠅⡂⢗⢟⣯⠆⢽⣿⣷⢱⢿⣿⣎⢗⢯⣻⣷⣿⢿⣟⡿⡻⡜⣇⢇⠯⠨⠨⠈⡎⠏⠪⠢⠙⢞⢷⢝⣮⣿⣽⣿⢾⣿⣻⣿⡿⢏⡮⡃⡯⡻⡽⣿⡐⡐⢸⢐⠐⠌⠄⢇⢂⢂⢂⢂
|
|
44
|
+
⠌⠌⠌⠌⠌⡐⡐⡈⡞⣽⢧⡘⢿⣿⡪⡲⣭⡻⢿⢿⡿⡟⡟⣋⠧⢋⢂⢜⡎⢕⠅⠅⠅⠅⢅⠅⢅⢅⢕⢄⠑⠍⡏⣗⡛⡞⡟⡟⡽⡱⠝⡙⡘⢌⢗⢴⣿⣿⣇⢂⢂⢣⢑⠅⠅⡇⡂⡂⡂⡂
|
|
45
|
+
⠡⠡⠡⠡⢁⢂⢂⢂⠱⣹⢯⣷⢔⣿⢷⠹⡨⡝⡓⡓⡒⡃⠩⢐⢈⢆⢇⢗⣅⣢⣧⠡⠡⡡⡎⣣⡥⣹⢂⠂⠌⡐⡐⠠⠡⠡⠡⡁⡂⡂⣑⢔⢌⢺⣿⣿⣟⣯⣿⡐⡐⡀⡃⡇⢕⢐⢐⢐⢐⢐
|
|
46
|
+
⠨⠨⠨⠨⢐⢐⢐⢐⢈⢺⣯⣗⢇⣿⣿⡂⠱⡱⠱⡐⡔⡠⡁⡢⡪⡸⡸⠸⢸⢵⢳⢝⣽⢵⣫⡾⣞⡗⡧⡨⡐⡐⠠⠡⠡⠡⢑⠐⢔⢕⢕⠕⠄⣟⣿⣞⣿⣻⡿⡐⡐⡐⢄⢇⢝⢐⢐⢐⢐⢐
|
|
47
|
+
⠨⠨⠨⠨⢐⢐⢐⢐⠰⢹⣗⣟⡔⡵⣟⡇⠅⡂⢇⢣⢣⢢⢪⠪⠪⢐⠠⢡⢢⢣⢈⢻⡞⡗⡘⣜⢇⢯⠪⡒⠔⠄⠅⠅⠅⠅⡂⠌⢜⢜⢌⢎⠂⡽⣟⡾⣯⢟⠱⢐⢐⢠⢣⢣⢱⢐⢐⢐⢐⢐
|
|
48
|
+
⠨⠨⠨⠨⢐⢐⢐⢐⢈⠊⡎⣞⣗⣝⡿⣯⢐⢐⠨⡪⡪⡪⠊⠌⠌⣐⣜⢮⢻⠨⢨⡣⡣⣲⡘⡸⣸⢘⢲⢸⢌⠌⠌⠌⠌⡐⠠⡱⡱⡱⡱⣑⠁⡯⣿⢝⢃⠂⠅⡂⡢⡪⣪⢊⠸⢐⢐⢐⢐⢐
|
|
49
|
+
⠌⠌⠌⠌⡐⡐⡐⡐⡐⠠⡑⢜⢾⣺⣟⣿⡐⡐⡐⢸⢸⠨⠨⢨⣸⢮⢞⣗⢯⢫⢣⢩⢩⢪⡣⣱⣑⡕⣮⢪⣎⡎⡧⡡⡁⡂⠅⢇⢗⡝⣜⢆⢂⣿⢍⢐⢐⢨⢢⢎⢮⢣⢃⢂⠇⡂⡂⡂⡂⡂
|
|
50
|
+
⠡⠡⠡⢁⢂⢂⢂⢂⠂⠅⠌⢆⠙⢷⣻⣿⣇⢂⠂⠌⠪⡣⢁⠢⡻⢙⢉⢃⢫⢩⢨⢹⢡⢃⢇⢵⢱⢽⢻⡫⡏⡏⠞⡐⡐⠠⢡⡳⣝⣞⢮⢢⣺⡏⡂⡂⣢⢯⡪⣳⢹⢕⠐⢼⢐⢐⢐⢐⢐⢐
|
|
51
|
+
⠨⠨⠨⢐⢐⢐⢐⢐⠨⠨⠨⠠⠡⢈⠻⣽⣿⣦⠨⠨⡐⡈⡂⡂⡂⡂⡂⡂⡒⡔⡒⡖⡦⣳⢕⢆⢕⢌⢎⢎⠂⠅⠅⡂⡂⡕⣵⡫⣞⢞⣰⣽⡟⡐⡐⣜⢮⡳⣝⢜⢮⡣⡃⢕⢐⢐⢐⢐⢐⢐
|
|
52
|
+
⠌⠌⠌⡐⡐⡐⡐⡐⠨⠨⠨⠨⠨⢐⢐⠈⢿⡿⣿⣄⡣⡂⡂⡂⡂⡂⡂⠢⡑⡘⠜⠜⠕⠕⠝⢜⢘⢌⠢⡡⡡⡡⡑⡔⣜⢮⡺⣪⡮⣾⢿⢏⢂⠂⡎⣮⢳⡫⢎⢏⣣⡑⣜⢂⢂⢂⢂⢂⢂⢂
|
|
53
|
+
⠌⠌⡐⡐⡐⡐⡐⠠⠡⠡⠡⠡⢁⢂⠂⠌⠄⠻⣟⣿⣷⣕⣆⢂⢂⠂⠌⠌⡐⠠⠡⠡⠡⠡⢁⢂⢂⠂⠅⢌⠆⡎⡜⣜⠮⣣⣷⣿⢽⡫⡳⡁⢢⢱⠹⠸⡑⡑⣴⣻⢾⡽⢂⢂⢂⢂⢂⢂⢂⢂
|
|
54
|
+
⠌⡐⡐⡐⡐⡐⠠⠡⠡⠡⠡⢁⢂⠂⠌⠌⢱⠡⠙⢷⣿⢿⣞⣆⠢⠨⠨⢐⠠⠡⠡⠡⠡⢁⢂⢂⠂⠌⢌⢌⢎⢮⢺⣸⣾⢿⡻⣪⠳⠡⠱⡨⠢⠡⠡⡑⡰⣽⢽⢯⢃⢂⢂⢂⢂⢂⢂⢂⢂⢂
|
|
55
|
+
⡐⡐⡐⡐⡐⠠⠡⠡⠡⠡⢁⢂⠂⠌⠌⠌⠌⠎⠌⠌⣾⣿⣿⡜⣯⣌⢪⢢⢨⢨⠨⠨⠨⡐⡐⡐⡬⡸⣜⢮⢳⣱⣷⢿⡯⠟⡘⡐⡌⠎⠅⢇⠅⠅⢡⢎⣯⢾⢋⢂⢂⢂⢂⢂⢂⢂⢂⢂⢂⠂
|
|
56
|
+
⡐⡐⡐⡐⠠⠡⠡⠡⠡⢁⢂⠂⠌⠌⠌⠌⠌⡘⢌⢐⠸⡯⣿⣗⠔⠹⢾⣜⣜⡘⢜⢕⠕⢎⢚⢜⢎⣏⣮⣧⣷⣿⡟⠏⢌⢆⢆⢇⠅⠅⢅⠂⠅⣕⣽⡽⣞⢇⡂⡂⡂⡂⡂⡂⡂⡂⡂⡂⡂⠌
|
|
57
|
+
⢂⢂⢂⠂⠅⠅⠅⠅⠅⡂⡂⠌⠌⠌⠌⠌⡐⡐⢠⡱⣕⢹⢺⢾⠌⠌⠌⢺⣫⢿⣟⢿⣻⢿⡿⣿⢿⣿⢿⣿⢿⠋⠄⡇⣗⢕⡕⡥⡱⣱⢢⣣⢯⢾⣾⢻⡘⡘⠌⠲⡐⣐⢐⢐⢐⢐⢐⢐⠠⠡
|
|
58
|
+
⡐⡐⡐⠨⠨⠨⠨⠨⢐⢐⠠⠡⠡⠡⠡⢁⡢⠊⠅⢅⠸⡸⡈⢯⢧⠡⢁⢂⠣⢑⢐⠠⠑⢝⡽⡽⣟⣿⢟⢋⢂⠏⡮⡾⡮⣗⢯⣫⢯⡮⡷⡝⠯⡻⡸⡘⠌⠄⠅⠅⡂⡂⠅⡂⡂⡂⡂⡂⠌⠌
|
|
59
|
+
⡂⡂⡂⠅⠅⠅⠅⠅⡂⡂⠌⠌⠌⠌⠌⡐⠠⡕⡝⡜⡅⡇⡇⠪⡫⣎⢐⠠⡑⡐⡐⠨⠨⢨⣪⢿⠽⠡⡱⡰⣕⢃⢯⢯⠯⡞⣝⢪⠣⠥⢑⠨⢐⠐⠌⠌⠌⠌⠌⡐⡐⠠⢁⢂⢂⢂⢂⠂⠅⠅
|
|
60
|
+
⡐⡐⠠⠡⠡⠡⠡⢁⢂⠂⠅⠅⠅⠅⠅⡂⠅⠌⠪⡊⡪⡪⡊⡂⠌⠪⡦⡂⣗⢗⣔⢥⣣⢷⢝⢅⢕⡝⡼⡕⢣⢢⠡⠱⢃⢑⢐⠡⠨⠨⢐⠨⢐⠨⠨⠨⠨⠨⢐⢐⠠⢁⢂⢂⢂⢂⠂⠌⠌⠌
|
|
61
|
+
⢐⠠⠡⠡⠡⠡⢁⢂⠂⠌⠌⠌⠌⠌⡐⠠⠡⠡⢁⠂⠌⠌⡂⡂⠅⢅⢊⢗⢜⢽⢮⢗⢯⢣⡳⡱⠣⠡⢑⢈⢂⠂⠌⠌⡐⡐⡐⠨⠨⠨⢐⠨⢐⠨⠨⠨⠨⠨⢐⢐⠨⢐⢐⢐⢐⢐⠨⠨⠨⠨
|
|
62
|
+
```
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { JabronioGUI } from 'jabroni-outfit';
|
|
2
|
+
import { JabronioStore } from 'jabroni-outfit';
|
|
3
|
+
import { JabroniTypes } from 'jabroni-outfit';
|
|
4
|
+
import { setupScheme } from 'jabroni-outfit';
|
|
5
|
+
import { StoreState } from 'jabroni-outfit';
|
|
6
|
+
|
|
7
|
+
declare type AnyFunction = (...args: any[]) => any;
|
|
8
|
+
|
|
9
|
+
export declare function checkHomogenity<T extends HTMLElement>(a: T, b: T, options: {
|
|
10
|
+
id?: boolean;
|
|
11
|
+
className?: boolean;
|
|
12
|
+
}): boolean;
|
|
13
|
+
|
|
14
|
+
export declare function chunks<T>(arr: T[], size: number): T[][];
|
|
15
|
+
|
|
16
|
+
export declare function circularShift(n: number, c?: number, s?: number): number;
|
|
17
|
+
|
|
18
|
+
export declare function copyAttributes<T extends Element = HTMLElement>(target: T, source: T): void;
|
|
19
|
+
|
|
20
|
+
declare type CustomThumbDataSelector = {
|
|
21
|
+
[x: string]: _CustomThumbDataSelector;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
declare type _CustomThumbDataSelector = {
|
|
25
|
+
selector: string;
|
|
26
|
+
type: 'boolean' | 'string' | 'number';
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
declare type DataElement = Record<string, string | number | boolean | HTMLElement>;
|
|
30
|
+
|
|
31
|
+
declare class DataFilter {
|
|
32
|
+
private rules;
|
|
33
|
+
filters: Map<string, () => DataFilterFn>;
|
|
34
|
+
constructor(rules: RulesGlobal);
|
|
35
|
+
static isFiltered(el: HTMLElement): boolean;
|
|
36
|
+
applyCSSFilters(wrapper?: (cssRule: string) => string): void;
|
|
37
|
+
customDataSelectorFns: Record<string, DataSelectorFn<any>>;
|
|
38
|
+
registerFilters(customFilters: (Record<string, DataSelectorFn<any>> | string)[]): void;
|
|
39
|
+
private customSelectorParser;
|
|
40
|
+
registerFilter(customSelectorName: string): void;
|
|
41
|
+
filterMapping: Record<string, string>;
|
|
42
|
+
selectFilters(filters: {
|
|
43
|
+
[key: string]: boolean;
|
|
44
|
+
}): (() => DataFilterFn)[];
|
|
45
|
+
static customDataSelectorFnsDefault: Record<string, DataSelectorFn<any>>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare type DataFilterFn = (v: DataElement) => DataFilterResult;
|
|
49
|
+
|
|
50
|
+
declare interface DataFilterResult {
|
|
51
|
+
tag: string;
|
|
52
|
+
condition: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export declare class DataManager {
|
|
56
|
+
private rules;
|
|
57
|
+
data: Map<string, DataElement>;
|
|
58
|
+
private lazyImgLoader;
|
|
59
|
+
dataFilter: DataFilter;
|
|
60
|
+
constructor(rules: RulesGlobal);
|
|
61
|
+
applyFilters: (filters?: Record<string, boolean>, offset?: number) => Promise<void>;
|
|
62
|
+
filterAll: (offset?: number) => Promise<void>;
|
|
63
|
+
parseDataParentHomogenity?: Parameters<typeof checkHomogenity>[2];
|
|
64
|
+
parseData: (html: HTMLElement, container?: HTMLElement, removeDuplicates?: boolean, shouldLazify?: boolean) => void;
|
|
65
|
+
sortBy<K extends keyof DataElement>(key: K, direction?: boolean): void;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
declare type DataSelectorFn<R> = DataSelectorFnAdvanced<R> | DataSelectorFnShort;
|
|
69
|
+
|
|
70
|
+
declare type DataSelectorFnAdvanced<R> = {
|
|
71
|
+
handle: (el: DataElement, state: StoreState, $preDefineResult?: R) => boolean;
|
|
72
|
+
$preDefine?: (state: StoreState) => R;
|
|
73
|
+
deps?: string[];
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
declare type DataSelectorFnShort = (e: DataElement, state: StoreState) => boolean;
|
|
77
|
+
|
|
78
|
+
declare const DefaultScheme: [{
|
|
79
|
+
readonly title: "Text Filter";
|
|
80
|
+
readonly collapsed: true;
|
|
81
|
+
readonly content: [{
|
|
82
|
+
readonly filterExclude: false;
|
|
83
|
+
readonly label: "exclude";
|
|
84
|
+
}, {
|
|
85
|
+
readonly filterExcludeWords: "";
|
|
86
|
+
readonly label: "keywords";
|
|
87
|
+
readonly watch: "filterExclude";
|
|
88
|
+
readonly placeholder: "word, f:full_word, r:RegEx...";
|
|
89
|
+
}, {
|
|
90
|
+
readonly filterInclude: false;
|
|
91
|
+
readonly label: "include";
|
|
92
|
+
}, {
|
|
93
|
+
readonly filterIncludeWords: "";
|
|
94
|
+
readonly label: "keywords";
|
|
95
|
+
readonly watch: "filterInclude";
|
|
96
|
+
readonly placeholder: "word, f:full_word, r:RegEx...";
|
|
97
|
+
}];
|
|
98
|
+
}, {
|
|
99
|
+
readonly title: "Duration Filter";
|
|
100
|
+
readonly collapsed: true;
|
|
101
|
+
readonly content: [{
|
|
102
|
+
readonly filterDuration: false;
|
|
103
|
+
readonly label: "enable";
|
|
104
|
+
}, {
|
|
105
|
+
readonly filterDurationFrom: 0;
|
|
106
|
+
readonly watch: "filterDuration";
|
|
107
|
+
readonly label: "from";
|
|
108
|
+
readonly type: "time";
|
|
109
|
+
}, {
|
|
110
|
+
readonly filterDurationTo: 600;
|
|
111
|
+
readonly watch: "filterDuration";
|
|
112
|
+
readonly label: "to";
|
|
113
|
+
readonly type: "time";
|
|
114
|
+
}];
|
|
115
|
+
}, {
|
|
116
|
+
readonly title: "Sort By";
|
|
117
|
+
readonly content: [{
|
|
118
|
+
readonly 'sort by views': () => void;
|
|
119
|
+
}, {
|
|
120
|
+
readonly 'sort by duration': () => void;
|
|
121
|
+
}];
|
|
122
|
+
}, {
|
|
123
|
+
readonly title: "Privacy Filter";
|
|
124
|
+
readonly content: [{
|
|
125
|
+
readonly filterPrivate: false;
|
|
126
|
+
readonly label: "private";
|
|
127
|
+
}, {
|
|
128
|
+
readonly filterPublic: false;
|
|
129
|
+
readonly label: "public";
|
|
130
|
+
}, {
|
|
131
|
+
readonly 'check access \uD83D\uDD13': () => void;
|
|
132
|
+
}];
|
|
133
|
+
}, {
|
|
134
|
+
readonly title: "Advanced";
|
|
135
|
+
readonly content: [{
|
|
136
|
+
readonly infiniteScrollEnabled: true;
|
|
137
|
+
readonly label: "infinite scroll";
|
|
138
|
+
}, {
|
|
139
|
+
readonly autoScroll: false;
|
|
140
|
+
readonly label: "auto scroll";
|
|
141
|
+
}, {
|
|
142
|
+
readonly delay: 250;
|
|
143
|
+
readonly label: "scroll delay";
|
|
144
|
+
}, {
|
|
145
|
+
readonly writeHistory: false;
|
|
146
|
+
readonly label: "write history";
|
|
147
|
+
}];
|
|
148
|
+
}, {
|
|
149
|
+
readonly title: "Badge";
|
|
150
|
+
readonly content: [{
|
|
151
|
+
readonly text: "return `${state.$paginationOffset}/${state.$paginationLast}`";
|
|
152
|
+
readonly vif: "return state.$paginationLast > 1";
|
|
153
|
+
}];
|
|
154
|
+
}];
|
|
155
|
+
|
|
156
|
+
export declare function downloader(options?: {
|
|
157
|
+
append: string;
|
|
158
|
+
after: string;
|
|
159
|
+
button: string;
|
|
160
|
+
cbBefore: () => void;
|
|
161
|
+
}): void;
|
|
162
|
+
|
|
163
|
+
export declare function exterminateVideo(video: HTMLVideoElement): void;
|
|
164
|
+
|
|
165
|
+
export declare const fetchHtml: (input: RequestInfo | URL) => Promise<HTMLElement>;
|
|
166
|
+
|
|
167
|
+
export declare const fetchJson: (input: RequestInfo | URL) => Promise<JSON>;
|
|
168
|
+
|
|
169
|
+
export declare const fetchText: (input: RequestInfo | URL) => Promise<string>;
|
|
170
|
+
|
|
171
|
+
export declare function fetchWith<T extends JSON | string | HTMLElement>(input: RequestInfo | URL, options: {
|
|
172
|
+
init?: RequestInit;
|
|
173
|
+
type: 'json' | 'html' | 'text';
|
|
174
|
+
mobile?: boolean;
|
|
175
|
+
}): Promise<T>;
|
|
176
|
+
|
|
177
|
+
export declare function findNextSibling<T extends Element = HTMLElement>(e: T): Element | null;
|
|
178
|
+
|
|
179
|
+
declare type GeneratorResult = {
|
|
180
|
+
url: string;
|
|
181
|
+
offset: number;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export declare function getCommonParents(elements: HTMLCollection | HTMLElement[]): HTMLElement[];
|
|
185
|
+
|
|
186
|
+
export declare function getPaginationStrategy(options: Partial<PaginationStrategy>): PaginationStrategy;
|
|
187
|
+
|
|
188
|
+
export declare class InfiniteScroller {
|
|
189
|
+
enabled: boolean;
|
|
190
|
+
paginationOffset: number;
|
|
191
|
+
parseData?: (document: HTMLElement) => void;
|
|
192
|
+
rules: RulesGlobal;
|
|
193
|
+
private observer?;
|
|
194
|
+
private paginationGenerator;
|
|
195
|
+
constructor(options: InfiniteScrollerOptions);
|
|
196
|
+
dispose(): void;
|
|
197
|
+
setObserver(observable: HTMLElement): this;
|
|
198
|
+
private onScrollCBs;
|
|
199
|
+
onScroll(callback: (scroller: InfiniteScroller) => void, initCall?: boolean): this;
|
|
200
|
+
private _onScroll;
|
|
201
|
+
private setAutoScroll;
|
|
202
|
+
generatorConsumer: () => Promise<boolean>;
|
|
203
|
+
private getPaginationData;
|
|
204
|
+
doScroll(url: string, offset: number): Promise<void>;
|
|
205
|
+
static generatorForPaginationStrategy(pstrategy: PaginationStrategy): OffsetGenerator;
|
|
206
|
+
static create(rules: RulesGlobal): InfiniteScroller;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
declare type InfiniteScrollerOptions = Pick<InfiniteScroller, 'rules'> & Partial<InfiniteScroller>;
|
|
210
|
+
|
|
211
|
+
export declare class LazyImgLoader {
|
|
212
|
+
lazyImgObserver: Observer;
|
|
213
|
+
private attributeName;
|
|
214
|
+
constructor(shouldDelazify: (target: Element) => boolean);
|
|
215
|
+
lazify(_target: Element, img?: HTMLImageElement, imgSrc?: string): void;
|
|
216
|
+
delazify: (target: HTMLImageElement) => void;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export declare function memoize<T extends AnyFunction>(fn: T): MemoizedFunction<T>;
|
|
220
|
+
|
|
221
|
+
declare interface MemoizedFunction<T extends AnyFunction> extends CallableFunction {
|
|
222
|
+
(...args: Parameters<T>): ReturnType<T>;
|
|
223
|
+
clear: () => void;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export declare const MOBILE_UA: {
|
|
227
|
+
readonly 'User-Agent': string;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export declare function objectToFormData<T extends {}>(obj: T): FormData;
|
|
231
|
+
|
|
232
|
+
export declare class Observer {
|
|
233
|
+
private callback;
|
|
234
|
+
observer: IntersectionObserver;
|
|
235
|
+
private timeout?;
|
|
236
|
+
constructor(callback: (entry: Element) => void);
|
|
237
|
+
observe(target: Element): void;
|
|
238
|
+
throttle(target: Element, throttleTime: number): void;
|
|
239
|
+
handleIntersection(entries: Iterable<IntersectionObserverEntry>): void;
|
|
240
|
+
dispose(): void;
|
|
241
|
+
static observeWhile(target: Element, callback: () => Promise<boolean> | boolean, throttleTime: number): Observer;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
declare type OffsetGenerator<T = GeneratorResult> = Generator<T> | AsyncGenerator<T>;
|
|
245
|
+
|
|
246
|
+
export declare function onPointerOverAndLeave(container: HTMLElement, subjectSelector: (target: HTMLElement) => boolean, onOver: (target: HTMLElement) => {
|
|
247
|
+
onOverCallback?: () => void;
|
|
248
|
+
leaveTarget?: HTMLElement;
|
|
249
|
+
} | void, onLeave?: (target: HTMLElement) => void): void;
|
|
250
|
+
|
|
251
|
+
declare class PaginationStrategy {
|
|
252
|
+
doc: Document;
|
|
253
|
+
url: URL;
|
|
254
|
+
paginationSelector: string;
|
|
255
|
+
searchParamSelector: string;
|
|
256
|
+
static _pathnameSelector: RegExp;
|
|
257
|
+
pathnameSelector: RegExp;
|
|
258
|
+
dataparamSelector: string;
|
|
259
|
+
overwritePaginationLast?: (n: number, offset?: number) => number;
|
|
260
|
+
offsetMin: number;
|
|
261
|
+
constructor(options?: Partial<PaginationStrategy>);
|
|
262
|
+
getPaginationElement(): HTMLElement | null;
|
|
263
|
+
get hasPagination(): boolean;
|
|
264
|
+
getPaginationOffset(): number;
|
|
265
|
+
getPaginationLast(): number;
|
|
266
|
+
getPaginationUrlGenerator(): (offset: number) => string | Promise<string>;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export declare function parseCssUrl(s: string): string;
|
|
270
|
+
|
|
271
|
+
export declare function parseDataParams(str: string): Record<string, string>;
|
|
272
|
+
|
|
273
|
+
export declare function parseHtml(html: string): HTMLElement;
|
|
274
|
+
|
|
275
|
+
export declare function parseIntegerOr(n: string | number, or: number): number;
|
|
276
|
+
|
|
277
|
+
export declare function querySelectorLast<T extends Element = HTMLElement>(root: ParentNode | undefined, selector: string): T | undefined;
|
|
278
|
+
|
|
279
|
+
export declare function querySelectorText(e: ParentNode, selector?: string): string;
|
|
280
|
+
|
|
281
|
+
export declare function range(size: number, start?: number, step?: number): number[];
|
|
282
|
+
|
|
283
|
+
export declare class RegexFilter {
|
|
284
|
+
private regexes;
|
|
285
|
+
constructor(str: string, flags?: string);
|
|
286
|
+
private compileSearchRegex;
|
|
287
|
+
hasEvery(str: string): boolean;
|
|
288
|
+
hasNone(str: string): boolean;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export declare function removeClassesAndDataAttributes(element: HTMLElement, keyword: string): void;
|
|
292
|
+
|
|
293
|
+
export declare function replaceElementTag(e: HTMLElement, tagName: string): HTMLElement;
|
|
294
|
+
|
|
295
|
+
export declare class RulesGlobal {
|
|
296
|
+
delay?: number;
|
|
297
|
+
customGenerator?: OffsetGenerator;
|
|
298
|
+
getThumbUrl(thumb: HTMLElement | HTMLAnchorElement): string;
|
|
299
|
+
titleSelector: undefined | string;
|
|
300
|
+
uploaderSelector: undefined | string;
|
|
301
|
+
durationSelector: undefined | string;
|
|
302
|
+
customThumbDataSelectors: undefined | CustomThumbDataSelector;
|
|
303
|
+
getThumbDataStrategy: 'default' | 'auto-select' | 'auto-text';
|
|
304
|
+
getThumbDataCallback?: (thumb: HTMLElement, thumbData: ThumbData) => void;
|
|
305
|
+
getThumbData(thumb: HTMLElement): ThumbData;
|
|
306
|
+
getThumbImgDataAttrSelector?: string | string[] | ((img: HTMLImageElement) => string);
|
|
307
|
+
getThumbImgDataAttrDelete?: 'auto' | string;
|
|
308
|
+
getThumbImgDataStrategy: 'default' | 'auto';
|
|
309
|
+
getThumbImgData(thumb: HTMLElement): {
|
|
310
|
+
img?: HTMLImageElement;
|
|
311
|
+
imgSrc?: string;
|
|
312
|
+
};
|
|
313
|
+
containerSelector: string | (() => HTMLElement);
|
|
314
|
+
containerSelectorLast?: string;
|
|
315
|
+
intersectionObservableSelector?: string;
|
|
316
|
+
get intersectionObservable(): "" | Element | null | undefined;
|
|
317
|
+
get observable(): HTMLElement;
|
|
318
|
+
get container(): HTMLElement;
|
|
319
|
+
thumbsSelector: string;
|
|
320
|
+
getThumbsStrategy: 'default' | 'auto';
|
|
321
|
+
getThumbsTransform?: (thumb: HTMLElement) => void;
|
|
322
|
+
getThumbs(html: HTMLElement): HTMLElement[];
|
|
323
|
+
paginationStrategyOptions: Partial<PaginationStrategy>;
|
|
324
|
+
paginationStrategy: PaginationStrategy;
|
|
325
|
+
customDataSelectorFns: (Record<string, DataSelectorFn<any>> | string)[];
|
|
326
|
+
animatePreview?: (doc: HTMLElement) => void;
|
|
327
|
+
storeOptions?: JabroniTypes.StoreStateOptions;
|
|
328
|
+
private createStore;
|
|
329
|
+
schemeOptions: SchemeOptions;
|
|
330
|
+
private createGui;
|
|
331
|
+
store: JabronioStore;
|
|
332
|
+
gui: JabronioGUI;
|
|
333
|
+
dataManager: DataManager;
|
|
334
|
+
infiniteScroller?: InfiniteScroller;
|
|
335
|
+
getPaginationData?: InfiniteScroller['getPaginationData'];
|
|
336
|
+
private resetInfiniteScroller;
|
|
337
|
+
gropeStrategy: 'all-in-one' | 'all-in-all';
|
|
338
|
+
gropeInit(): void;
|
|
339
|
+
get isEmbedded(): boolean;
|
|
340
|
+
private setupStoreListeners;
|
|
341
|
+
dataManagerOptions: Partial<DataManager>;
|
|
342
|
+
private setupDataManager;
|
|
343
|
+
private mutationObservers;
|
|
344
|
+
resetOnPaginationOrContainerDeath: boolean;
|
|
345
|
+
private resetOn;
|
|
346
|
+
onResetCallback?: () => void;
|
|
347
|
+
private reset;
|
|
348
|
+
constructor(options: Partial<RulesGlobal>);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export declare function sanitizeStr(s: string): string;
|
|
352
|
+
|
|
353
|
+
declare type SchemeOptions = (Parameters<typeof setupScheme>[0][0] | JabroniTypes.ExtractValuesByKey<typeof DefaultScheme, 'title'>)[];
|
|
354
|
+
|
|
355
|
+
export declare function splitWith(s: string, c?: string): Array<string>;
|
|
356
|
+
|
|
357
|
+
declare type ThumbData = {
|
|
358
|
+
title: string;
|
|
359
|
+
duration?: number;
|
|
360
|
+
} & {
|
|
361
|
+
[x: string]: string | boolean | number;
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
export declare class Tick {
|
|
365
|
+
private delay;
|
|
366
|
+
private startImmediate;
|
|
367
|
+
private tick?;
|
|
368
|
+
private callbackFinal?;
|
|
369
|
+
constructor(delay: number, startImmediate?: boolean);
|
|
370
|
+
start(callback: () => void, callbackFinal?: () => void): void;
|
|
371
|
+
stop(): void;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Converts a time string (HH:MM:SS or duration format) to total seconds.
|
|
376
|
+
* @param timeStr - The time string to convert.
|
|
377
|
+
* @returns The total number of seconds.
|
|
378
|
+
*/
|
|
379
|
+
export declare function timeToSeconds(timeStr: string): number;
|
|
380
|
+
|
|
381
|
+
export declare function wait(milliseconds: number): Promise<unknown>;
|
|
382
|
+
|
|
383
|
+
export declare function waitForElementToAppear(parent: ParentNode, selector: string, callback: (el: Element) => void): MutationObserver;
|
|
384
|
+
|
|
385
|
+
export declare function waitForElementToDisappear(observable: HTMLElement, callback: () => void): MutationObserver;
|
|
386
|
+
|
|
387
|
+
export declare function watchDomChangesWithThrottle(element: HTMLElement, callback: () => void, throttle?: number, times?: number, options?: MutationObserverInit): MutationObserver;
|
|
388
|
+
|
|
389
|
+
export declare function watchElementChildrenCount(element: ParentNode, callback: (observer: MutationObserver, count: number) => void): MutationObserver;
|
|
390
|
+
|
|
391
|
+
export { }
|