billy-herrington-utils 1.0.2 → 1.0.5
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.
|
@@ -84,7 +84,7 @@ function S(e, t) {
|
|
|
84
84
|
return m(r, e), r.innerHTML = e.innerHTML, (n = e.parentNode) == null || n.replaceChild(r, e), r;
|
|
85
85
|
}
|
|
86
86
|
function z(e) {
|
|
87
|
-
return Array.from(e).reduce((t, r) => (r.parentElement && t.includes(r.parentElement) && t.push(r.parentElement), t), []);
|
|
87
|
+
return Array.from(e).reduce((t, r) => (r.parentElement && !t.includes(r.parentElement) && t.push(r.parentElement), t), []);
|
|
88
88
|
}
|
|
89
89
|
function p(e) {
|
|
90
90
|
return e.nextElementSibling ? e.nextElementSibling : e.parentElement ? p(e.parentElement) : null;
|
|
@@ -240,3 +240,4 @@ export {
|
|
|
240
240
|
P as watchDomChangesWithThrottle,
|
|
241
241
|
F as watchElementChildrenCount
|
|
242
242
|
};
|
|
243
|
+
//# sourceMappingURL=billy-herrington-utils.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/strings/index.ts","../src/utils/parsers/index.ts","../src/utils/observers/index.ts","../src/utils/math/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/utils/events/index.ts","../src/utils/device/index.ts","../src/utils/async/index.ts","../src/utils/arrays/index.ts"],"sourcesContent":["export function stringToWords(s: string): Array<string> {\r\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\r\n}\r\n\r\nexport function sanitizeStr(s: string) {\r\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\r\n}\r\n","export function timeToSeconds(t: string): number {\r\n return (t?.match(/\\d+/gm) || [0])\r\n .reverse()\r\n .map((s, i) => parseInt(s as string) * 60 ** i)\r\n .reduce((a, b) => a + b);\r\n}\r\n\r\nexport function parseIntegerOr(n: string | number, or: number): number {\r\n return Number.isInteger(parseInt(n as string)) ? parseInt(n as string) : or;\r\n}\r\n\r\n// \"data:02;body+head:async;void:;zero:;\"\r\nexport function parseDataParams(str: string) {\r\n const params = str.split(';').flatMap(s => {\r\n const parsed = s.match(/([\\+\\w+]+):(\\w+)?/);\r\n const value = parsed?.[2];\r\n if (value) return parsed[1].split('+').map(p => ({ [p]: value }));\r\n }).filter(_ => _);\r\n return Object.assign({}, ...params);\r\n}\r\n\r\nexport function parseCSSUrl(s: string) {\r\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\r\n}","export class Observer {\r\n public observer: IntersectionObserver;\r\n constructor(private callback: (entry: Element) => void) {\r\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\r\n }\r\n\r\n observe(target: Element) {\r\n this.observer.observe(target);\r\n }\r\n\r\n throttle(target: Element, throttleTime: number) {\r\n this.observer.unobserve(target);\r\n setTimeout(() => this.observer.observe(target), throttleTime);\r\n }\r\n\r\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n this.callback(entry.target);\r\n }\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static observeWhile(target: Element, callback: any, throttleTime: number) {\r\n const observer_ = new Observer(async (target: Element) => {\r\n const condition = await callback();\r\n if (condition) observer_.throttle(target, throttleTime);\r\n });\r\n observer_.observe(target);\r\n return observer_;\r\n }\r\n}\r\n\r\nexport class LazyImgLoader {\r\n public lazyImgObserver: Observer;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n constructor(callback: any, private attributeName = 'data-lazy-load', private removeTagAfter = true) {\r\n this.lazyImgObserver = new Observer((target: Element) => {\r\n callback(target, this.delazify);\r\n });\r\n }\r\n\r\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\r\n if (!img || !imgSrc) return;\r\n img.setAttribute(this.attributeName, imgSrc);\r\n img.src = '';\r\n this.lazyImgObserver.observe(img);\r\n }\r\n\r\n delazify = (target: HTMLImageElement) => {\r\n this.lazyImgObserver.observer.unobserve(target);\r\n target.src = target.getAttribute(this.attributeName) as string;\r\n if (this.removeTagAfter) target.removeAttribute(this.attributeName);\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static create(callback: any) {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n const lazyImgLoader = new LazyImgLoader((target: Element, delazify: any) => {\r\n if (callback(target)) {\r\n delazify(target);\r\n }\r\n });\r\n return lazyImgLoader;\r\n }\r\n}\r\n","export function circularShift(n: number, c = 6, s = 1): number {\r\n return (n + s) % c || c;\r\n}\r\n","export function parseDom(html: string): HTMLElement {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\r\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\r\n}\r\n\r\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\r\n for (const attr of source.attributes) {\r\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\r\n }\r\n}\r\n\r\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\r\n const newTagElement = document.createElement(tagName);\r\n copyAttributes(newTagElement, e);\r\n newTagElement.innerHTML = e.innerHTML;\r\n e.parentNode?.replaceChild(newTagElement, e);\r\n return newTagElement;\r\n}\r\n\r\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\r\n return Array.from(elements).reduce((acc, v) => {\r\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\r\n return acc;\r\n }, [] as Array<HTMLElement | Element>);\r\n}\r\n\r\nexport function findNextSibling(el: HTMLElement | Element) {\r\n if (el.nextElementSibling) return el.nextElementSibling;\r\n if (el.parentElement) return findNextSibling(el.parentElement);\r\n return null;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void {\r\n const observer = new MutationObserver((_mutations) => {\r\n const el = parent.querySelector(selector);\r\n if (el) {\r\n observer.disconnect();\r\n callback(el);\r\n }\r\n });\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void {\r\n let count = element.children.length;\r\n const observer = new MutationObserver((mutationList, observer) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === \"childList\") {\r\n if (count !== element.children.length) {\r\n count = element.children.length;\r\n callback(observer, count);\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(element, { childList: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any,\r\n throttle = 1000, options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }) {\r\n let lastMutationTime: number;\r\n let timeout: number;\r\n const observer = new MutationObserver((_mutationList, _observer) => {\r\n const now = Date.now();\r\n if (lastMutationTime && now - lastMutationTime < throttle) {\r\n timeout && clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(callback, throttle);\r\n lastMutationTime = now;\r\n });\r\n observer.observe(element, options);\r\n}\r\n\r\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\r\n const btn = parseDom(options.button);\r\n\r\n if (options.append) document.querySelector(options.append)?.append(btn);\r\n if (options.after) document.querySelector(options.after)?.after(btn);\r\n\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n if (options.cbBefore) options.cbBefore();\r\n\r\n waitForElementExists(document.body, 'video', (video: HTMLVideoElement) => {\r\n window.location.href = video.getAttribute('src') as string;\r\n });\r\n });\r\n}","import { parseDom } from \"../dom\";\r\n\r\nexport const MOBILE_UA = [\r\n 'Mozilla/5.0 (Linux; Android 10; K)',\r\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\r\n 'Chrome/114.0.0.0 Mobile Safari/537.36'].join(' ');\r\n\r\nexport function fetchWith(url: string, options: Record<string, boolean> = { html: false, mobile: false }) {\r\n const reqOpts = {};\r\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ \"User-Agent\": MOBILE_UA }) });\r\n return fetch(url, reqOpts).then((r) => r.text()).then(r => options.html ? parseDom(r) : r);\r\n}\r\n\r\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true });\r\n\r\nexport const fetchText = (url: string) => fetchWith(url);\r\n\r\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\r\n const formData = new FormData();\r\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\r\n return formData;\r\n}\r\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void {\r\n for (const e of events) {\r\n dom.addEventListener(e, callback, true);\r\n }\r\n}\r\n\r\nexport class Tick {\r\n private tick: null | number;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n private callbackFinal: any;\r\n\r\n constructor(private delay: number, private startImmediate = true) {\r\n this.tick = null;\r\n this.delay = delay;\r\n this.startImmediate = startImmediate;\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n start(callback: any, callbackFinal = null) {\r\n this.stop();\r\n this.callbackFinal = callbackFinal;\r\n if (this.startImmediate) callback();\r\n this.tick = setInterval(callback, this.delay);\r\n }\r\n\r\n stop() {\r\n if (this.tick !== null) {\r\n clearInterval(this.tick);\r\n this.tick = null;\r\n }\r\n if (this.callbackFinal) {\r\n this.callbackFinal();\r\n this.callbackFinal = null;\r\n }\r\n }\r\n}","export function isMob() {\r\n return /iPhone|Android/i.test(navigator.userAgent);\r\n}","// https://2ality.com/2016/10/asynchronous-iteration.html\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport async function computeAsyncOneAtTime(iterable: Iterable<any>) {\r\n const res = [];\r\n for await (const f of iterable) {\r\n res.push(await f());\r\n }\r\n return res;\r\n}\r\n\r\nexport function wait(milliseconds: number) {\r\n return new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n// do async one at time\r\nexport class SyncPull {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n pull: Array<any> = [];\r\n lock = false;\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n getHighPriorityFirst(p = 0): any {\r\n if (p > 3 || this.pull.length === 0) return undefined;\r\n const i = this.pull.findIndex(e => e.p === p);\r\n if (i >= 0) {\r\n const res = this.pull[i].v;\r\n this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));\r\n return res;\r\n }\r\n return this.getHighPriorityFirst(p + 1);\r\n }\r\n\r\n *pullGenerator() {\r\n while (this.pull.length > 0) {\r\n yield this.getHighPriorityFirst();\r\n }\r\n }\r\n\r\n async processPull() {\r\n if (!this.lock) {\r\n this.lock = true;\r\n for await (const f of this.pullGenerator()) {\r\n await f();\r\n }\r\n this.lock = false;\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n push(x: any) {\r\n this.pull.push(x);\r\n this.processPull();\r\n }\r\n}\r\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\r\n const res = [];\r\n for (let i = 0; i < arr.length; i += n) {\r\n res.push(arr.slice(i, i + n));\r\n }\r\n return res;\r\n}\r\n\r\nexport function range(size: number, startAt = 1): Array<number> {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n}"],"names":["stringToWords","s","_","sanitizeStr","timeToSeconds","t","i","a","b","parseIntegerOr","n","or","parseDataParams","str","params","parsed","value","p","parseCSSUrl","Observer","callback","__publicField","target","throttleTime","entries","entry","observer_","LazyImgLoader","attributeName","removeTagAfter","_target","img","imgSrc","delazify","circularShift","c","parseDom","html","copyAttributes","source","attr","replaceElementTag","tagName","_a","newTagElement","getAllUniqueParents","elements","acc","v","findNextSibling","el","waitForElementExists","parent","selector","observer","_mutations","watchElementChildrenCount","element","count","mutationList","mutation","watchDomChangesWithThrottle","throttle","options","lastMutationTime","timeout","_mutationList","_observer","now","downloader","_b","btn","e","video","MOBILE_UA","fetchWith","url","reqOpts","r","fetchHtml","fetchText","objectToFormData","object","formData","k","listenEvents","dom","events","Tick","delay","startImmediate","callbackFinal","isMob","computeAsyncOneAtTime","iterable","res","f","wait","milliseconds","resolve","SyncPull","x","chunks","arr","range","size","startAt"],"mappings":"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"}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
(function(i,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(i=typeof globalThis<"u"?globalThis:i||self,l(i.bhutils={}))})(this,function(i){"use strict";var B=Object.defineProperty;var _=(i,l,c)=>l in i?B(i,l,{enumerable:!0,configurable:!0,writable:!0,value:c}):i[l]=c;var o=(i,l,c)=>_(i,typeof l!="symbol"?l+"":l,c);function l(n){return n.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e)}function c(n){return(n==null?void 0:n.replace(/\n|\t/," ").replace(/ {2,}/," ").trim().toLowerCase())||""}function w(n){return((n==null?void 0:n.match(/\d+/gm))||[0]).reverse().map((e,t)=>parseInt(e)*60**t).reduce((e,t)=>e+t)}function T(n,e){return Number.isInteger(parseInt(n))?parseInt(n):e}function E(n){const e=n.split(";").flatMap(t=>{const r=t.match(/([\+\w+]+):(\w+)?/),s=r==null?void 0:r[2];if(s)return r[1].split("+").map(a=>({[a]:s}))}).filter(t=>t);return Object.assign({},...e)}function k(n){return n.replace(/url\("|\"\).*/g,"")}class u{constructor(e){o(this,"observer");this.callback=e,this.observer=new IntersectionObserver(this.handleIntersection.bind(this))}observe(e){this.observer.observe(e)}throttle(e,t){this.observer.unobserve(e),setTimeout(()=>this.observer.observe(e),t)}handleIntersection(e){for(const t of e)t.isIntersecting&&this.callback(t.target)}static observeWhile(e,t,r){const s=new u(async a=>{await t()&&s.throttle(a,r)});return s.observe(e),s}}class h{constructor(e,t="data-lazy-load",r=!0){o(this,"lazyImgObserver");o(this,"delazify",e=>{this.lazyImgObserver.observer.unobserve(e),e.src=e.getAttribute(this.attributeName),this.removeTagAfter&&e.removeAttribute(this.attributeName)});this.attributeName=t,this.removeTagAfter=r,this.lazyImgObserver=new u(s=>{e(s,this.delazify)})}lazify(e,t,r){!t||!r||(t.setAttribute(this.attributeName,r),t.src="",this.lazyImgObserver.observe(t))}static create(e){return new h((r,s)=>{e(r)&&s(r)})}}function A(n,e=6,t=1){return(n+t)%e||e}function f(n){const e=new DOMParser().parseFromString(n,"text/html").body;return e.children.length>1?e:e.firstElementChild}function m(n,e){for(const t of e.attributes)t.nodeValue&&n.setAttribute(t.nodeName,t.nodeValue)}function I(n,e){var r;const t=document.createElement(e);return m(t,n),t.innerHTML=n.innerHTML,(r=n.parentNode)==null||r.replaceChild(t,n),t}function S(n){return Array.from(n).reduce((e,t)=>(t.parentElement
|
|
1
|
+
(function(i,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(i=typeof globalThis<"u"?globalThis:i||self,l(i.bhutils={}))})(this,function(i){"use strict";var B=Object.defineProperty;var _=(i,l,c)=>l in i?B(i,l,{enumerable:!0,configurable:!0,writable:!0,value:c}):i[l]=c;var o=(i,l,c)=>_(i,typeof l!="symbol"?l+"":l,c);function l(n){return n.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e)}function c(n){return(n==null?void 0:n.replace(/\n|\t/," ").replace(/ {2,}/," ").trim().toLowerCase())||""}function w(n){return((n==null?void 0:n.match(/\d+/gm))||[0]).reverse().map((e,t)=>parseInt(e)*60**t).reduce((e,t)=>e+t)}function T(n,e){return Number.isInteger(parseInt(n))?parseInt(n):e}function E(n){const e=n.split(";").flatMap(t=>{const r=t.match(/([\+\w+]+):(\w+)?/),s=r==null?void 0:r[2];if(s)return r[1].split("+").map(a=>({[a]:s}))}).filter(t=>t);return Object.assign({},...e)}function k(n){return n.replace(/url\("|\"\).*/g,"")}class u{constructor(e){o(this,"observer");this.callback=e,this.observer=new IntersectionObserver(this.handleIntersection.bind(this))}observe(e){this.observer.observe(e)}throttle(e,t){this.observer.unobserve(e),setTimeout(()=>this.observer.observe(e),t)}handleIntersection(e){for(const t of e)t.isIntersecting&&this.callback(t.target)}static observeWhile(e,t,r){const s=new u(async a=>{await t()&&s.throttle(a,r)});return s.observe(e),s}}class h{constructor(e,t="data-lazy-load",r=!0){o(this,"lazyImgObserver");o(this,"delazify",e=>{this.lazyImgObserver.observer.unobserve(e),e.src=e.getAttribute(this.attributeName),this.removeTagAfter&&e.removeAttribute(this.attributeName)});this.attributeName=t,this.removeTagAfter=r,this.lazyImgObserver=new u(s=>{e(s,this.delazify)})}lazify(e,t,r){!t||!r||(t.setAttribute(this.attributeName,r),t.src="",this.lazyImgObserver.observe(t))}static create(e){return new h((r,s)=>{e(r)&&s(r)})}}function A(n,e=6,t=1){return(n+t)%e||e}function f(n){const e=new DOMParser().parseFromString(n,"text/html").body;return e.children.length>1?e:e.firstElementChild}function m(n,e){for(const t of e.attributes)t.nodeValue&&n.setAttribute(t.nodeName,t.nodeValue)}function I(n,e){var r;const t=document.createElement(e);return m(t,n),t.innerHTML=n.innerHTML,(r=n.parentNode)==null||r.replaceChild(t,n),t}function S(n){return Array.from(n).reduce((e,t)=>(t.parentElement&&!e.includes(t.parentElement)&&e.push(t.parentElement),e),[])}function v(n){return n.nextElementSibling?n.nextElementSibling:n.parentElement?v(n.parentElement):null}function g(n,e,t){const r=new MutationObserver(s=>{const a=n.querySelector(e);a&&(r.disconnect(),t(a))});r.observe(document.body,{childList:!0,subtree:!0})}function O(n,e){let t=n.children.length;new MutationObserver((s,a)=>{for(const b of s)b.type==="childList"&&t!==n.children.length&&(t=n.children.length,e(a,t))}).observe(n,{childList:!0})}function L(n,e,t=1e3,r={childList:!0,subtree:!0,attributes:!0}){let s,a;new MutationObserver((G,K)=>{const y=Date.now();s&&y-s<t&&a&&clearTimeout(a),a=setTimeout(e,t),s=y}).observe(n,r)}function M(n={append:"",after:"",button:"",cbBefore:()=>{}}){var t,r;const e=f(n.button);n.append&&((t=document.querySelector(n.append))==null||t.append(e)),n.after&&((r=document.querySelector(n.after))==null||r.after(e)),e.addEventListener("click",s=>{s.preventDefault(),n.cbBefore&&n.cbBefore(),g(document.body,"video",a=>{window.location.href=a.getAttribute("src")})})}const p=["Mozilla/5.0 (Linux; Android 10; K)","AppleWebKit/537.36 (KHTML, like Gecko)","Chrome/114.0.0.0 Mobile Safari/537.36"].join(" ");function d(n,e={html:!1,mobile:!1}){const t={};return e.mobile&&Object.assign(t,{headers:new Headers({"User-Agent":p})}),fetch(n,t).then(r=>r.text()).then(r=>e.html?f(r):r)}const P=n=>d(n,{html:!0}),z=n=>d(n);function F(n){const e=new FormData;return Object.entries(n).forEach(([t,r])=>e.append(t,r)),e}function C(n,e,t){for(const r of e)n.addEventListener(r,t,!0)}class D{constructor(e,t=!0){o(this,"tick");o(this,"callbackFinal");this.delay=e,this.startImmediate=t,this.tick=null,this.delay=e,this.startImmediate=t}start(e,t=null){this.stop(),this.callbackFinal=t,this.startImmediate&&e(),this.tick=setInterval(e,this.delay)}stop(){this.tick!==null&&(clearInterval(this.tick),this.tick=null),this.callbackFinal&&(this.callbackFinal(),this.callbackFinal=null)}}function H(){return/iPhone|Android/i.test(navigator.userAgent)}async function N(n){const e=[];for await(const t of n)e.push(await t());return e}function j(n){return new Promise(e=>setTimeout(e,n))}class W{constructor(){o(this,"pull",[]);o(this,"lock",!1)}getHighPriorityFirst(e=0){if(e>3||this.pull.length===0)return;const t=this.pull.findIndex(r=>r.p===e);if(t>=0){const r=this.pull[t].v;return this.pull=this.pull.slice(0,t).concat(this.pull.slice(t+1)),r}return this.getHighPriorityFirst(e+1)}*pullGenerator(){for(;this.pull.length>0;)yield this.getHighPriorityFirst()}async processPull(){if(!this.lock){this.lock=!0;for await(const e of this.pullGenerator())await e();this.lock=!1}}push(e){this.pull.push(e),this.processPull()}}function U(n,e){const t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,r+e));return t}function q(n,e=1){return[...Array(n).keys()].map(t=>t+e)}i.LazyImgLoader=h,i.MOBILE_UA=p,i.Observer=u,i.SyncPull=W,i.Tick=D,i.chunks=U,i.circularShift=A,i.computeAsyncOneAtTime=N,i.copyAttributes=m,i.downloader=M,i.fetchHtml=P,i.fetchText=z,i.fetchWith=d,i.findNextSibling=v,i.getAllUniqueParents=S,i.isMob=H,i.listenEvents=C,i.objectToFormData=F,i.parseCSSUrl=k,i.parseDataParams=E,i.parseDom=f,i.parseIntegerOr=T,i.range=q,i.replaceElementTag=I,i.sanitizeStr=c,i.stringToWords=l,i.timeToSeconds=w,i.wait=j,i.waitForElementExists=g,i.watchDomChangesWithThrottle=L,i.watchElementChildrenCount=O,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=billy-herrington-utils.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/strings/index.ts","../src/utils/parsers/index.ts","../src/utils/observers/index.ts","../src/utils/math/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/utils/events/index.ts","../src/utils/device/index.ts","../src/utils/async/index.ts","../src/utils/arrays/index.ts"],"sourcesContent":["export function stringToWords(s: string): Array<string> {\r\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\r\n}\r\n\r\nexport function sanitizeStr(s: string) {\r\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\r\n}\r\n","export function timeToSeconds(t: string): number {\r\n return (t?.match(/\\d+/gm) || [0])\r\n .reverse()\r\n .map((s, i) => parseInt(s as string) * 60 ** i)\r\n .reduce((a, b) => a + b);\r\n}\r\n\r\nexport function parseIntegerOr(n: string | number, or: number): number {\r\n return Number.isInteger(parseInt(n as string)) ? parseInt(n as string) : or;\r\n}\r\n\r\n// \"data:02;body+head:async;void:;zero:;\"\r\nexport function parseDataParams(str: string) {\r\n const params = str.split(';').flatMap(s => {\r\n const parsed = s.match(/([\\+\\w+]+):(\\w+)?/);\r\n const value = parsed?.[2];\r\n if (value) return parsed[1].split('+').map(p => ({ [p]: value }));\r\n }).filter(_ => _);\r\n return Object.assign({}, ...params);\r\n}\r\n\r\nexport function parseCSSUrl(s: string) {\r\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\r\n}","export class Observer {\r\n public observer: IntersectionObserver;\r\n constructor(private callback: (entry: Element) => void) {\r\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\r\n }\r\n\r\n observe(target: Element) {\r\n this.observer.observe(target);\r\n }\r\n\r\n throttle(target: Element, throttleTime: number) {\r\n this.observer.unobserve(target);\r\n setTimeout(() => this.observer.observe(target), throttleTime);\r\n }\r\n\r\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n this.callback(entry.target);\r\n }\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static observeWhile(target: Element, callback: any, throttleTime: number) {\r\n const observer_ = new Observer(async (target: Element) => {\r\n const condition = await callback();\r\n if (condition) observer_.throttle(target, throttleTime);\r\n });\r\n observer_.observe(target);\r\n return observer_;\r\n }\r\n}\r\n\r\nexport class LazyImgLoader {\r\n public lazyImgObserver: Observer;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n constructor(callback: any, private attributeName = 'data-lazy-load', private removeTagAfter = true) {\r\n this.lazyImgObserver = new Observer((target: Element) => {\r\n callback(target, this.delazify);\r\n });\r\n }\r\n\r\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\r\n if (!img || !imgSrc) return;\r\n img.setAttribute(this.attributeName, imgSrc);\r\n img.src = '';\r\n this.lazyImgObserver.observe(img);\r\n }\r\n\r\n delazify = (target: HTMLImageElement) => {\r\n this.lazyImgObserver.observer.unobserve(target);\r\n target.src = target.getAttribute(this.attributeName) as string;\r\n if (this.removeTagAfter) target.removeAttribute(this.attributeName);\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n static create(callback: any) {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n const lazyImgLoader = new LazyImgLoader((target: Element, delazify: any) => {\r\n if (callback(target)) {\r\n delazify(target);\r\n }\r\n });\r\n return lazyImgLoader;\r\n }\r\n}\r\n","export function circularShift(n: number, c = 6, s = 1): number {\r\n return (n + s) % c || c;\r\n}\r\n","export function parseDom(html: string): HTMLElement {\r\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\r\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\r\n}\r\n\r\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\r\n for (const attr of source.attributes) {\r\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\r\n }\r\n}\r\n\r\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\r\n const newTagElement = document.createElement(tagName);\r\n copyAttributes(newTagElement, e);\r\n newTagElement.innerHTML = e.innerHTML;\r\n e.parentNode?.replaceChild(newTagElement, e);\r\n return newTagElement;\r\n}\r\n\r\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\r\n return Array.from(elements).reduce((acc, v) => {\r\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\r\n return acc;\r\n }, [] as Array<HTMLElement | Element>);\r\n}\r\n\r\nexport function findNextSibling(el: HTMLElement | Element) {\r\n if (el.nextElementSibling) return el.nextElementSibling;\r\n if (el.parentElement) return findNextSibling(el.parentElement);\r\n return null;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: any): void {\r\n const observer = new MutationObserver((_mutations) => {\r\n const el = parent.querySelector(selector);\r\n if (el) {\r\n observer.disconnect();\r\n callback(el);\r\n }\r\n });\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchElementChildrenCount(element: HTMLElement | Element, callback: any): void {\r\n let count = element.children.length;\r\n const observer = new MutationObserver((mutationList, observer) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === \"childList\") {\r\n if (count !== element.children.length) {\r\n count = element.children.length;\r\n callback(observer, count);\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(element, { childList: true });\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function watchDomChangesWithThrottle(element: HTMLElement | Element, callback: any,\r\n throttle = 1000, options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }) {\r\n let lastMutationTime: number;\r\n let timeout: number;\r\n const observer = new MutationObserver((_mutationList, _observer) => {\r\n const now = Date.now();\r\n if (lastMutationTime && now - lastMutationTime < throttle) {\r\n timeout && clearTimeout(timeout);\r\n }\r\n timeout = setTimeout(callback, throttle);\r\n lastMutationTime = now;\r\n });\r\n observer.observe(element, options);\r\n}\r\n\r\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\r\n const btn = parseDom(options.button);\r\n\r\n if (options.append) document.querySelector(options.append)?.append(btn);\r\n if (options.after) document.querySelector(options.after)?.after(btn);\r\n\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n if (options.cbBefore) options.cbBefore();\r\n\r\n waitForElementExists(document.body, 'video', (video: HTMLVideoElement) => {\r\n window.location.href = video.getAttribute('src') as string;\r\n });\r\n });\r\n}","import { parseDom } from \"../dom\";\r\n\r\nexport const MOBILE_UA = [\r\n 'Mozilla/5.0 (Linux; Android 10; K)',\r\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\r\n 'Chrome/114.0.0.0 Mobile Safari/537.36'].join(' ');\r\n\r\nexport function fetchWith(url: string, options: Record<string, boolean> = { html: false, mobile: false }) {\r\n const reqOpts = {};\r\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ \"User-Agent\": MOBILE_UA }) });\r\n return fetch(url, reqOpts).then((r) => r.text()).then(r => options.html ? parseDom(r) : r);\r\n}\r\n\r\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true });\r\n\r\nexport const fetchText = (url: string) => fetchWith(url);\r\n\r\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\r\n const formData = new FormData();\r\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\r\n return formData;\r\n}\r\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: any): void {\r\n for (const e of events) {\r\n dom.addEventListener(e, callback, true);\r\n }\r\n}\r\n\r\nexport class Tick {\r\n private tick: null | number;\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n private callbackFinal: any;\r\n\r\n constructor(private delay: number, private startImmediate = true) {\r\n this.tick = null;\r\n this.delay = delay;\r\n this.startImmediate = startImmediate;\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n start(callback: any, callbackFinal = null) {\r\n this.stop();\r\n this.callbackFinal = callbackFinal;\r\n if (this.startImmediate) callback();\r\n this.tick = setInterval(callback, this.delay);\r\n }\r\n\r\n stop() {\r\n if (this.tick !== null) {\r\n clearInterval(this.tick);\r\n this.tick = null;\r\n }\r\n if (this.callbackFinal) {\r\n this.callbackFinal();\r\n this.callbackFinal = null;\r\n }\r\n }\r\n}","export function isMob() {\r\n return /iPhone|Android/i.test(navigator.userAgent);\r\n}","// https://2ality.com/2016/10/asynchronous-iteration.html\r\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\nexport async function computeAsyncOneAtTime(iterable: Iterable<any>) {\r\n const res = [];\r\n for await (const f of iterable) {\r\n res.push(await f());\r\n }\r\n return res;\r\n}\r\n\r\nexport function wait(milliseconds: number) {\r\n return new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n// do async one at time\r\nexport class SyncPull {\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n pull: Array<any> = [];\r\n lock = false;\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n getHighPriorityFirst(p = 0): any {\r\n if (p > 3 || this.pull.length === 0) return undefined;\r\n const i = this.pull.findIndex(e => e.p === p);\r\n if (i >= 0) {\r\n const res = this.pull[i].v;\r\n this.pull = this.pull.slice(0, i).concat(this.pull.slice(i + 1));\r\n return res;\r\n }\r\n return this.getHighPriorityFirst(p + 1);\r\n }\r\n\r\n *pullGenerator() {\r\n while (this.pull.length > 0) {\r\n yield this.getHighPriorityFirst();\r\n }\r\n }\r\n\r\n async processPull() {\r\n if (!this.lock) {\r\n this.lock = true;\r\n for await (const f of this.pullGenerator()) {\r\n await f();\r\n }\r\n this.lock = false;\r\n }\r\n }\r\n\r\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\r\n push(x: any) {\r\n this.pull.push(x);\r\n this.processPull();\r\n }\r\n}\r\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\r\n const res = [];\r\n for (let i = 0; i < arr.length; i += n) {\r\n res.push(arr.slice(i, i + n));\r\n }\r\n return res;\r\n}\r\n\r\nexport function range(size: number, startAt = 1): Array<number> {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n}"],"names":["stringToWords","s","_","sanitizeStr","timeToSeconds","t","i","a","b","parseIntegerOr","or","parseDataParams","str","params","parsed","value","p","parseCSSUrl","Observer","callback","__publicField","target","throttleTime","entries","entry","observer_","LazyImgLoader","attributeName","removeTagAfter","_target","img","imgSrc","delazify","circularShift","c","parseDom","html","copyAttributes","source","attr","replaceElementTag","e","tagName","newTagElement","_a","getAllUniqueParents","elements","acc","v","findNextSibling","el","waitForElementExists","parent","selector","observer","_mutations","watchElementChildrenCount","element","count","mutationList","mutation","watchDomChangesWithThrottle","throttle","options","lastMutationTime","timeout","_mutationList","_observer","now","downloader","btn","_b","video","MOBILE_UA","fetchWith","url","reqOpts","fetchHtml","fetchText","objectToFormData","object","formData","k","listenEvents","dom","events","Tick","delay","startImmediate","callbackFinal","isMob","computeAsyncOneAtTime","iterable","res","f","wait","milliseconds","resolve","SyncPull","x","chunks","arr","n","range","size","startAt"],"mappings":"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"}
|
package/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './src';
|
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.0.
|
|
4
|
+
"version": "1.0.5",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": ["utils", "observer", "dom", "fetch", "arrays"],
|
|
7
7
|
"author": "smartacephale atm.mormon@protonmail.com (https://github.com/smartacephale)",
|
package/vite.config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { defineConfig
|
|
2
|
+
import { defineConfig } from "vite";
|
|
3
3
|
|
|
4
4
|
export default ({ mode }) => {
|
|
5
5
|
return defineConfig({
|
|
@@ -10,7 +10,7 @@ export default ({ mode }) => {
|
|
|
10
10
|
entry: path.resolve(__dirname, "./src/index.html")
|
|
11
11
|
},
|
|
12
12
|
build: {
|
|
13
|
-
|
|
13
|
+
sourcemap: true,
|
|
14
14
|
lib: {
|
|
15
15
|
minify: true,
|
|
16
16
|
entry: path.resolve(__dirname, "./src/index.ts"),
|