memorium/_fresh/chunk-7JONXWSO.js.map
2023-08-24 00:13:09 +02:00

8 lines
7.3 KiB
Plaintext

{
"version": 3,
"sources": ["lib/hooks/useEventListener.ts", "lib/resources.ts", "lib/string.ts"],
"sourcesContent": ["import { useEffect, useRef } from \"preact/hooks\";\n\nexport function useEventListener<T extends Event>(\n eventName: string,\n handler: (event: T) => void,\n element: Window | HTMLElement = window,\n) {\n // Create a ref that stores handler\n const savedHandler = useRef<(event: Event) => void>();\n\n // Update ref.current value if handler changes.\n // This allows our effect below to always get latest handler ...\n // ... without us needing to pass it in effect deps array ...\n // ... and potentially cause effect to re-run every render.\n useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(\n () => {\n // Make sure element supports addEventListener\n // On\n const isSupported = element && element.addEventListener;\n if (!isSupported) return;\n\n // Create event listener that calls handler function stored in ref\n const eventListener = (event: T) => savedHandler?.current?.(event);\n\n // Add event listener\n element.addEventListener(eventName, eventListener);\n\n // Remove event listener on cleanup\n return () => {\n element.removeEventListener(eventName, eventListener);\n };\n },\n [eventName, element], // Re-run if eventName or element changes\n );\n}\n", "export const resources = {\n \"home\": {\n emoji: \"House with Garden.png\",\n name: \"Home\",\n link: \"/\",\n prefix: \"\",\n },\n \"recipe\": {\n emoji: \"Fork and Knife with Plate.png\",\n name: \"Recipes\",\n link: \"/recipes\",\n prefix: \"Recipes/\",\n },\n \"movie\": {\n emoji: \"Popcorn.png\",\n name: \"Movies\",\n link: \"/movies\",\n prefix: \"Media/movies/\",\n },\n \"article\": {\n emoji: \"Writing Hand Medium-Light Skin Tone.png\",\n name: \"Articles\",\n link: \"/articles\",\n prefix: \"Media/articles/\",\n },\n \"series\": {\n emoji: \"Television.png\",\n name: \"Series\",\n link: \"/series\",\n prefix: \"Media/series/\",\n },\n} as const;\n", "import { resources } from \"@lib/resources.ts\";\n\nexport function formatDate(date: Date): string {\n const options = { year: \"numeric\", month: \"long\", day: \"numeric\" } as const;\n return new Intl.DateTimeFormat(\"en-US\", options).format(date);\n}\n\nexport function safeFileName(inputString: string): string {\n // Convert the string to lowercase\n let fileName = inputString.toLowerCase();\n\n // Replace spaces with underscores\n fileName = fileName.replace(/ /g, \"_\");\n\n // Remove characters that are not safe for file names\n fileName = fileName.replace(/[^\\w.-]/g, \"\");\n\n fileName = fileName.replaceAll(\":\", \"\");\n\n return fileName;\n}\n\nexport function extractHashTags(inputString: string) {\n const hashtags = [];\n\n for (\n const [hashtag] of inputString.matchAll(/(?:^|\\s)#\\S*(?<!\\))/g)\n ) {\n const cleaned = hashtag.replace(/\\#/g, \"\").trim();\n if (cleaned.length > 2) {\n hashtags.push(cleaned);\n }\n }\n\n return hashtags;\n}\n\nexport const isYoutubeLink = (link: string) => {\n try {\n const url = new URL(link);\n return [\"youtu.be\", \"youtube.com\", \"www.youtube.com\"].includes(\n url.hostname,\n );\n } catch (_err) {\n return false;\n }\n};\n\nexport function extractYoutubeId(link: string) {\n const url = new URL(link);\n if (url.searchParams.has(\"v\")) {\n const id = url.searchParams.get(\"v\");\n\n if (id?.length && id.length > 4) {\n return id;\n }\n }\n\n return url.pathname.replace(/^\\//, \"\");\n}\n\nexport async function hash(message: string) {\n const data = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n return hashHex;\n}\n// Helper function to calculate SHA-256 hash\nexport async function sha256(input: string) {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n return base64urlencode(new Uint8Array(hashBuffer));\n}\n\n// Helper function to encode a byte array as a URL-safe base64 string\nfunction base64urlencode(data: Uint8Array) {\n const base64 = btoa(String.fromCharCode(...data));\n return base64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\nexport function getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const nameLenPlus = name.length + 1;\n return document.cookie\n .split(\";\")\n .map((c) => c.trim())\n .filter((cookie) => {\n return cookie.substring(0, nameLenPlus) === `${name}=`;\n })\n .map((cookie) => {\n return decodeURIComponent(cookie.substring(nameLenPlus));\n })[0] || null;\n}\n\nconst resourcePrefixes = Object.values(resources).map((v) => v.prefix).filter(\n (s) => s.length > 2,\n);\nexport const isLocalImage = (src: string) =>\n resourcePrefixes.some((p) => src.startsWith(p));\n\nexport const isString = (input: string | undefined): input is string => {\n return typeof input === \"string\";\n};\n\nfunction componentToHex(c: number) {\n if (c <= 1) {\n c = Math.round(c * 255);\n }\n const hex = c.toString(16);\n return hex.length == 1 ? \"0\" + hex : hex;\n}\n\nexport function getTimeCacheKey() {\n const d = new Date();\n const year = d.getFullYear();\n const month = d.getMonth().toString();\n const day = d.getDate().toString();\n const hour = d.getHours().toString();\n const minute = d.getMinutes().toString();\n const seconds = d.getSeconds().toString();\n return `${year}:${month}:${day}:${hour}:${minute}:${seconds}`;\n}\n\nexport function parseTimeCacheKey(key: string) {\n const [_year, _month, _day, _hour, _minute, _second] = key.split(\":\")\n .slice(1).map((s) => parseInt(s));\n const d = new Date();\n d.setFullYear(_year);\n d.setMonth(_month);\n d.setDate(_day);\n d.setHours(_hour);\n d.setMinutes(_minute);\n d.setSeconds(_second);\n return d;\n}\n\nexport function rgbToHex(r: number, g: number, b: number) {\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n}\n"],
"mappings": "qCAEO,SAAS,iBACd,UACA,QACA,QAAgC,OAChC,CAEA,IAAM,aAAe,EAA+B,EAMpD,EAAU,IAAM,CACd,aAAa,QAAU,OACzB,EAAG,CAAC,OAAO,CAAC,EAEZ,EACE,IAAM,CAIJ,GAAI,EADgB,SAAW,QAAQ,kBACrB,OAGlB,IAAM,cAAiB,OAAa,cAAc,UAAU,KAAK,EAGjE,eAAQ,iBAAiB,UAAW,aAAa,EAG1C,IAAM,CACX,QAAQ,oBAAoB,UAAW,aAAa,CACtD,CACF,EACA,CAAC,UAAW,OAAO,CACrB,CACF,CCtCO,IAAM,UAAY,CACvB,KAAQ,CACN,MAAO,wBACP,KAAM,OACN,KAAM,IACN,OAAQ,EACV,EACA,OAAU,CACR,MAAO,gCACP,KAAM,UACN,KAAM,WACN,OAAQ,UACV,EACA,MAAS,CACP,MAAO,cACP,KAAM,SACN,KAAM,UACN,OAAQ,eACV,EACA,QAAW,CACT,MAAO,0CACP,KAAM,WACN,KAAM,YACN,OAAQ,iBACV,EACA,OAAU,CACR,MAAO,iBACP,KAAM,SACN,KAAM,UACN,OAAQ,eACV,CACF,ECoDO,SAAS,UAAU,KAA6B,CACrD,GAAI,OAAO,SAAa,IAAa,OAAO,KAC5C,IAAM,YAAc,KAAK,OAAS,EAClC,OAAO,SAAS,OACb,MAAM,GAAG,EACT,IAAK,GAAM,EAAE,KAAK,CAAC,EACnB,OAAQ,QACA,OAAO,UAAU,EAAG,WAAW,IAAM,GAAG,IAAI,GACpD,EACA,IAAK,QACG,mBAAmB,OAAO,UAAU,WAAW,CAAC,CACxD,EAAE,CAAC,GAAK,IACb,CAEA,IAAM,iBAAmB,OAAO,OAAO,SAAS,EAAE,IAAK,GAAM,EAAE,MAAM,EAAE,OACpE,GAAM,EAAE,OAAS,CACpB,EACa,aAAgB,KAC3B,iBAAiB,KAAM,GAAM,IAAI,WAAW,CAAC,CAAC",
"names": []
}