billy-herrington-utils 1.4.7 → 1.4.8

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.
@@ -65,8 +65,8 @@ class DataFilter {
65
65
  return (v) => {
66
66
  const isPublic = !this.rules.isPrivate(v.element);
67
67
  return {
68
- tag: "filter-public",
69
- condition: this.state.filterPublic && isPublic
68
+ condition: this.state.filterPublic && isPublic,
69
+ tag: "filter-public"
70
70
  };
71
71
  };
72
72
  });
@@ -74,8 +74,8 @@ class DataFilter {
74
74
  return (v) => {
75
75
  const isPrivate = this.rules.isPrivate(v.element);
76
76
  return {
77
- tag: "filter-private",
78
- condition: this.state.filterPrivate && isPrivate
77
+ condition: this.state.filterPrivate && isPrivate,
78
+ tag: "filter-private"
79
79
  };
80
80
  };
81
81
  });
@@ -83,8 +83,8 @@ class DataFilter {
83
83
  return (v) => {
84
84
  const isHD = this.rules.isHD(v.element);
85
85
  return {
86
- tag: "filter-hd",
87
- condition: this.state.filterHD && isHD
86
+ condition: this.state.filterHD && isHD,
87
+ tag: "filter-hd"
88
88
  };
89
89
  };
90
90
  });
@@ -92,8 +92,8 @@ class DataFilter {
92
92
  return (v) => {
93
93
  const notInRange = v.duration < this.state.filterDurationFrom || v.duration > this.state.filterDurationTo;
94
94
  return {
95
- tag: "filter-duration",
96
- condition: this.state.filterDuration && notInRange
95
+ condition: this.state.filterDuration && notInRange,
96
+ tag: "filter-duration"
97
97
  };
98
98
  };
99
99
  });
@@ -102,8 +102,8 @@ class DataFilter {
102
102
  return (v) => {
103
103
  const containTags = tags.some((tag) => tag.test(v.title));
104
104
  return {
105
- tag: "filter-exclude",
106
- condition: this.state.filterExclude && containTags
105
+ condition: this.state.filterExclude && containTags,
106
+ tag: "filter-exclude"
107
107
  };
108
108
  };
109
109
  });
@@ -112,8 +112,8 @@ class DataFilter {
112
112
  return (v) => {
113
113
  const containTagsNot = tags.some((tag) => !tag.test(v.title));
114
114
  return {
115
- tag: "filter-include",
116
- condition: this.state.filterInclude && containTagsNot
115
+ condition: this.state.filterInclude && containTagsNot,
116
+ tag: "filter-include"
117
117
  };
118
118
  };
119
119
  });
@@ -195,8 +195,8 @@ class DataManager {
195
195
  const targets = [window, globalThis.unsafeWindow].filter(Boolean);
196
196
  targets.forEach((w) => {
197
197
  Object.assign(w, {
198
- sortByViews: () => this.sort("view"),
199
- sortByDuration: () => this.sort("duration")
198
+ sortByDuration: () => this.sort("duration"),
199
+ sortByViews: () => this.sort("view")
200
200
  });
201
201
  });
202
202
  }
@@ -398,14 +398,21 @@ class InfiniteScroller {
398
398
  }
399
399
  function createInfiniteScroller(store, parseData, rules) {
400
400
  const enabled = store.state.infiniteScrollEnabled;
401
+ const paginationOffset = rules.paginationStrategy.getPaginationOffset();
402
+ const paginationElement = rules.paginationStrategy.getPaginationElement();
403
+ const paginationLast = rules.paginationStrategy.getPaginationLast();
404
+ const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
401
405
  const iscroller = new InfiniteScroller({
402
406
  enabled,
403
407
  parseData,
404
- ...rules,
405
- ...rules.paginationStrategy
406
- }).onScroll(({ paginationLast, paginationOffset }) => {
407
- store.localState.pagIndexLast = paginationLast;
408
- store.localState.pagIndexCur = paginationOffset;
408
+ paginationLast,
409
+ paginationOffset,
410
+ paginationElement,
411
+ paginationUrlGenerator,
412
+ ...rules
413
+ }).onScroll(({ paginationLast: paginationLast2, paginationOffset: paginationOffset2 }) => {
414
+ store.localState.pagIndexLast = paginationLast2;
415
+ store.localState.pagIndexCur = paginationOffset2;
409
416
  }, true);
410
417
  store.subscribe(() => {
411
418
  iscroller.enabled = store.state.infiniteScrollEnabled;
@@ -522,9 +529,9 @@ class PaginationStrategyDataParams extends PaginationStrategy {
522
529
  const block_id = parametersElement?.getAttribute("data-block-id") || "";
523
530
  const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
524
531
  const attrs = {
525
- mode: "async",
526
- function: "get_block",
527
532
  block_id,
533
+ function: "get_block",
534
+ mode: "async",
528
535
  ...parameters
529
536
  };
530
537
  Object.keys(attrs).forEach((k) => {
@@ -1 +1 @@
1
- {"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n ...rules,\n ...rules.paginationStrategy,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":"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"}
1
+ {"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPublic && isPublic,\n tag: 'filter-public',\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPrivate && isPrivate,\n tag: 'filter-private',\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n condition: this.state.filterHD && isHD,\n tag: 'filter-hd',\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n condition: this.state.filterDuration && notInRange,\n tag: 'filter-duration',\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n condition: this.state.filterExclude && containTags,\n tag: 'filter-exclude',\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n condition: this.state.filterInclude && containTagsNot,\n tag: 'filter-include',\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByDuration: () => this.sort('duration'),\n sortByViews: () => this.sort('view'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay?: number;\n enabled?: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { IRules } from '../rules';\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const paginationOffset = rules.paginationStrategy.getPaginationOffset();\n const paginationElement = rules.paginationStrategy.getPaginationElement();\n const paginationLast = rules.paginationStrategy.getPaginationLast();\n const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n paginationLast,\n paginationOffset,\n paginationElement,\n paginationUrlGenerator,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n block_id,\n function: 'get_block',\n mode: 'async',\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer","paginationLast","paginationOffset"],"mappings":"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"}
@@ -69,8 +69,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
69
69
  return (v) => {
70
70
  const isPublic = !this.rules.isPrivate(v.element);
71
71
  return {
72
- tag: "filter-public",
73
- condition: this.state.filterPublic && isPublic
72
+ condition: this.state.filterPublic && isPublic,
73
+ tag: "filter-public"
74
74
  };
75
75
  };
76
76
  });
@@ -78,8 +78,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
78
78
  return (v) => {
79
79
  const isPrivate = this.rules.isPrivate(v.element);
80
80
  return {
81
- tag: "filter-private",
82
- condition: this.state.filterPrivate && isPrivate
81
+ condition: this.state.filterPrivate && isPrivate,
82
+ tag: "filter-private"
83
83
  };
84
84
  };
85
85
  });
@@ -87,8 +87,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
87
87
  return (v) => {
88
88
  const isHD = this.rules.isHD(v.element);
89
89
  return {
90
- tag: "filter-hd",
91
- condition: this.state.filterHD && isHD
90
+ condition: this.state.filterHD && isHD,
91
+ tag: "filter-hd"
92
92
  };
93
93
  };
94
94
  });
@@ -96,8 +96,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
96
96
  return (v) => {
97
97
  const notInRange = v.duration < this.state.filterDurationFrom || v.duration > this.state.filterDurationTo;
98
98
  return {
99
- tag: "filter-duration",
100
- condition: this.state.filterDuration && notInRange
99
+ condition: this.state.filterDuration && notInRange,
100
+ tag: "filter-duration"
101
101
  };
102
102
  };
103
103
  });
@@ -106,8 +106,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
106
106
  return (v) => {
107
107
  const containTags = tags.some((tag) => tag.test(v.title));
108
108
  return {
109
- tag: "filter-exclude",
110
- condition: this.state.filterExclude && containTags
109
+ condition: this.state.filterExclude && containTags,
110
+ tag: "filter-exclude"
111
111
  };
112
112
  };
113
113
  });
@@ -116,8 +116,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
116
116
  return (v) => {
117
117
  const containTagsNot = tags.some((tag) => !tag.test(v.title));
118
118
  return {
119
- tag: "filter-include",
120
- condition: this.state.filterInclude && containTagsNot
119
+ condition: this.state.filterInclude && containTagsNot,
120
+ tag: "filter-include"
121
121
  };
122
122
  };
123
123
  });
@@ -199,8 +199,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
199
199
  const targets = [window, globalThis.unsafeWindow].filter(Boolean);
200
200
  targets.forEach((w) => {
201
201
  Object.assign(w, {
202
- sortByViews: () => this.sort("view"),
203
- sortByDuration: () => this.sort("duration")
202
+ sortByDuration: () => this.sort("duration"),
203
+ sortByViews: () => this.sort("view")
204
204
  });
205
205
  });
206
206
  }
@@ -402,14 +402,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
402
402
  }
403
403
  function createInfiniteScroller(store, parseData, rules) {
404
404
  const enabled = store.state.infiniteScrollEnabled;
405
+ const paginationOffset = rules.paginationStrategy.getPaginationOffset();
406
+ const paginationElement = rules.paginationStrategy.getPaginationElement();
407
+ const paginationLast = rules.paginationStrategy.getPaginationLast();
408
+ const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
405
409
  const iscroller = new InfiniteScroller({
406
410
  enabled,
407
411
  parseData,
408
- ...rules,
409
- ...rules.paginationStrategy
410
- }).onScroll(({ paginationLast, paginationOffset }) => {
411
- store.localState.pagIndexLast = paginationLast;
412
- store.localState.pagIndexCur = paginationOffset;
412
+ paginationLast,
413
+ paginationOffset,
414
+ paginationElement,
415
+ paginationUrlGenerator,
416
+ ...rules
417
+ }).onScroll(({ paginationLast: paginationLast2, paginationOffset: paginationOffset2 }) => {
418
+ store.localState.pagIndexLast = paginationLast2;
419
+ store.localState.pagIndexCur = paginationOffset2;
413
420
  }, true);
414
421
  store.subscribe(() => {
415
422
  iscroller.enabled = store.state.infiniteScrollEnabled;
@@ -526,9 +533,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
526
533
  const block_id = parametersElement?.getAttribute("data-block-id") || "";
527
534
  const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
528
535
  const attrs = {
529
- mode: "async",
530
- function: "get_block",
531
536
  block_id,
537
+ function: "get_block",
538
+ mode: "async",
532
539
  ...parameters
533
540
  };
534
541
  Object.keys(attrs).forEach((k) => {
@@ -1 +1 @@
1
- {"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n ...rules,\n ...rules.paginationStrategy,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":"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"}
1
+ {"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPublic && isPublic,\n tag: 'filter-public',\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPrivate && isPrivate,\n tag: 'filter-private',\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n condition: this.state.filterHD && isHD,\n tag: 'filter-hd',\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n condition: this.state.filterDuration && notInRange,\n tag: 'filter-duration',\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n condition: this.state.filterExclude && containTags,\n tag: 'filter-exclude',\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n condition: this.state.filterInclude && containTagsNot,\n tag: 'filter-include',\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByDuration: () => this.sort('duration'),\n sortByViews: () => this.sort('view'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay?: number;\n enabled?: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { IRules } from '../rules';\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const paginationOffset = rules.paginationStrategy.getPaginationOffset();\n const paginationElement = rules.paginationStrategy.getPaginationElement();\n const paginationLast = rules.paginationStrategy.getPaginationLast();\n const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n paginationLast,\n paginationOffset,\n paginationElement,\n paginationUrlGenerator,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n block_id,\n function: 'get_block',\n mode: 'async',\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer","paginationLast","paginationOffset"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -96,8 +96,8 @@ export declare function getAllUniqueParents(elements: HTMLCollection): Array<HTM
96
96
  export declare function getPaginationStrategy(options: IPaginationStrategy): PaginationStrategy;
97
97
 
98
98
  declare interface IInfiniteScroller {
99
- delay: number;
100
- enabled: boolean;
99
+ delay?: number;
100
+ enabled?: boolean;
101
101
  writeHistory?: boolean;
102
102
  paginationOffset: number;
103
103
  paginationLast: number;
@@ -152,11 +152,7 @@ declare interface IRules {
152
152
 
153
153
  declare interface IRules_2 {
154
154
  paginationStrategy: PaginationStrategy;
155
- delay: number;
156
- paginationOffset: number;
157
- paginationLast: number;
158
- paginationElement: HTMLElement;
159
- paginationUrlGenerator: (n: number) => string;
155
+ delay?: number;
160
156
  }
161
157
 
162
158
  export declare function isMob(): boolean;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "billy-herrington-utils",
3
3
  "description": "daddy told us not to be ashamed of our utils",
4
- "version": "1.4.7",
4
+ "version": "1.4.8",
5
5
  "license": "MIT",
6
6
  "keywords": [
7
7
  "utils",
@@ -45,8 +45,8 @@ class DataFilter {
45
45
  return (v: FilterInput) => {
46
46
  const isPublic = !this.rules.isPrivate(v.element as HTMLElement);
47
47
  return {
48
- tag: 'filter-public',
49
48
  condition: this.state.filterPublic && isPublic,
49
+ tag: 'filter-public',
50
50
  };
51
51
  };
52
52
  };
@@ -55,8 +55,8 @@ class DataFilter {
55
55
  return (v: FilterInput) => {
56
56
  const isPrivate = this.rules.isPrivate(v.element as HTMLElement);
57
57
  return {
58
- tag: 'filter-private',
59
58
  condition: this.state.filterPrivate && isPrivate,
59
+ tag: 'filter-private',
60
60
  };
61
61
  };
62
62
  };
@@ -65,8 +65,8 @@ class DataFilter {
65
65
  return (v: FilterInput) => {
66
66
  const isHD = this.rules.isHD(v.element as HTMLElement);
67
67
  return {
68
- tag: 'filter-hd',
69
68
  condition: this.state.filterHD && isHD,
69
+ tag: 'filter-hd',
70
70
  };
71
71
  };
72
72
  };
@@ -77,8 +77,8 @@ class DataFilter {
77
77
  (v.duration as number) < this.state.filterDurationFrom ||
78
78
  (v.duration as number) > this.state.filterDurationTo;
79
79
  return {
80
- tag: 'filter-duration',
81
80
  condition: this.state.filterDuration && notInRange,
81
+ tag: 'filter-duration',
82
82
  };
83
83
  };
84
84
  };
@@ -88,8 +88,8 @@ class DataFilter {
88
88
  return (v: FilterInput) => {
89
89
  const containTags = tags.some((tag) => tag.test(v.title as string));
90
90
  return {
91
- tag: 'filter-exclude',
92
91
  condition: this.state.filterExclude && containTags,
92
+ tag: 'filter-exclude',
93
93
  };
94
94
  };
95
95
  };
@@ -99,8 +99,8 @@ class DataFilter {
99
99
  return (v: FilterInput) => {
100
100
  const containTagsNot = tags.some((tag) => !tag.test(v.title as string));
101
101
  return {
102
- tag: 'filter-include',
103
102
  condition: this.state.filterInclude && containTagsNot,
103
+ tag: 'filter-include',
104
104
  };
105
105
  };
106
106
  };
@@ -135,8 +135,8 @@ export class DataManager {
135
135
  const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);
136
136
  targets.forEach((w: any) => {
137
137
  Object.assign(w, {
138
- sortByViews: () => this.sort('view'),
139
138
  sortByDuration: () => this.sort('duration'),
139
+ sortByViews: () => this.sort('view'),
140
140
  });
141
141
  });
142
142
  }
@@ -2,8 +2,8 @@ import { fetchHtml } from '../../utils/fetch';
2
2
  import { Observer } from '../../utils/observers';
3
3
 
4
4
  interface IInfiniteScroller {
5
- delay: number;
6
- enabled: boolean;
5
+ delay?: number;
6
+ enabled?: boolean;
7
7
  writeHistory?: boolean;
8
8
  paginationOffset: number;
9
9
  paginationLast: number;
@@ -1,14 +1,5 @@
1
1
  import { InfiniteScroller } from '../infinite-scroll';
2
- import type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';
3
-
4
- interface IRules {
5
- paginationStrategy: PaginationStrategy;
6
- delay: number;
7
- paginationOffset: number;
8
- paginationLast: number;
9
- paginationElement: HTMLElement;
10
- paginationUrlGenerator: (n: number) => string;
11
- }
2
+ import type { IRules } from '../rules';
12
3
 
13
4
  export interface JabroniStore {
14
5
  state: Record<string, boolean | string | number>;
@@ -23,11 +14,19 @@ export function createInfiniteScroller(
23
14
  ) {
24
15
  const enabled = store.state.infiniteScrollEnabled as boolean;
25
16
 
17
+ const paginationOffset = rules.paginationStrategy.getPaginationOffset();
18
+ const paginationElement = rules.paginationStrategy.getPaginationElement();
19
+ const paginationLast = rules.paginationStrategy.getPaginationLast();
20
+ const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
21
+
26
22
  const iscroller = new InfiniteScroller({
27
23
  enabled,
28
24
  parseData,
25
+ paginationLast,
26
+ paginationOffset,
27
+ paginationElement,
28
+ paginationUrlGenerator,
29
29
  ...rules,
30
- ...rules.paginationStrategy,
31
30
  }).onScroll(({ paginationLast, paginationOffset }) => {
32
31
  store.localState.pagIndexLast = paginationLast;
33
32
  store.localState.pagIndexCur = paginationOffset;
@@ -34,9 +34,9 @@ export class PaginationStrategyDataParams extends PaginationStrategy {
34
34
  const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');
35
35
 
36
36
  const attrs: Record<string, string> = {
37
- mode: 'async',
38
- function: 'get_block',
39
37
  block_id,
38
+ function: 'get_block',
39
+ mode: 'async',
40
40
  ...parameters,
41
41
  };
42
42
 
@@ -0,0 +1,6 @@
1
+ import type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';
2
+
3
+ export interface IRules {
4
+ paginationStrategy: PaginationStrategy;
5
+ delay?: number;
6
+ }