{
"version": 3,
"sources": ["../../../lib/utils.ts"],
"sourcesContent": ["/**\r\n * Utils library\r\n *\r\n * Miscellaneous utility functions that don't really have a better place.\r\n *\r\n * It'll always be a judgment call whether or not a function goes into a\r\n * \"catch-all\" library like this, so here are some guidelines:\r\n *\r\n * - It must not have any dependencies\r\n *\r\n * - It must conceivably have a use in a wide variety of projects, not just\r\n * Pok\u00E9mon (if it's Pok\u00E9mon-specific, Dex is probably a good place for it)\r\n *\r\n * - A lot of Chat functions are kind of iffy, but I'm going to say for now\r\n * that if it's English-specific, it should be left out of here.\r\n */\r\n\r\nexport type Comparable = number | string | boolean | Comparable[] | {reverse: Comparable};\r\n\r\n/**\r\n * Safely converts the passed variable into a string. Unlike '' + str,\r\n * String(str), or str.toString(), Utils.getString is guaranteed not to\r\n * crash.\r\n *\r\n * Specifically, the fear with untrusted JSON is an object like:\r\n *\r\n * let a = {\"toString\": \"this is not a function\"};\r\n * console.log(`a is ${a}`);\r\n *\r\n * This will crash (because a.toString() is not a function). Instead,\r\n * getString simply returns '' if the passed variable isn't a\r\n * string or a number.\r\n */\r\n\r\nexport function getString(str: any): string {\r\n\treturn (typeof str === 'string' || typeof str === 'number') ? '' + str : '';\r\n}\r\n\r\nexport function escapeRegex(str: string) {\r\n\treturn str.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Escapes HTML in a string.\r\n*/\r\nexport function escapeHTML(str: string | number) {\r\n\tif (str === null || str === undefined) return '';\r\n\treturn ('' + str)\r\n\t\t.replace(/&/g, '&')\r\n\t\t.replace(//g, '>')\r\n\t\t.replace(/\"/g, '"')\r\n\t\t.replace(/'/g, ''')\r\n\t\t.replace(/\\//g, '/')\r\n\t\t.replace(/\\n/g, '
');\r\n}\r\n\r\n/**\r\n * Strips HTML from a string.\r\n */\r\nexport function stripHTML(htmlContent: string) {\r\n\tif (!htmlContent) return '';\r\n\treturn htmlContent.replace(/<[^>]*>/g, '');\r\n}\r\n\r\n/**\r\n * Maps numbers to their ordinal string.\r\n */\r\nexport function formatOrder(place: number) {\r\n\t// anything between 10 and 20 should always end with -th\r\n\tlet remainder = place % 100;\r\n\tif (remainder >= 10 && remainder <= 20) return place + 'th';\r\n\r\n\t// follow standard rules with -st, -nd, -rd, and -th\r\n\tremainder = place % 10;\r\n\tif (remainder === 1) return place + 'st';\r\n\tif (remainder === 2) return place + 'nd';\r\n\tif (remainder === 3) return place + 'rd';\r\n\treturn place + 'th';\r\n}\r\n\r\n/**\r\n * Visualizes eval output in a slightly more readable form\r\n */\r\nexport function visualize(value: any, depth = 0): string {\r\n\tif (value === undefined) return `undefined`;\r\n\tif (value === null) return `null`;\r\n\tif (typeof value === 'number' || typeof value === 'boolean') {\r\n\t\treturn `${value}`;\r\n\t}\r\n\tif (typeof value === 'string') {\r\n\t\treturn `\"${value}\"`; // NOT ESCAPED\r\n\t}\r\n\tif (typeof value === 'symbol') {\r\n\t\treturn value.toString();\r\n\t}\r\n\tif (Array.isArray(value)) {\r\n\t\tif (depth > 10) return `[array]`;\r\n\t\treturn `[` + value.map(elem => visualize(elem, depth + 1)).join(`, `) + `]`;\r\n\t}\r\n\tif (value instanceof RegExp || value instanceof Date || value instanceof Function) {\r\n\t\tif (depth && value instanceof Function) return `Function`;\r\n\t\treturn `${value}`;\r\n\t}\r\n\tlet constructor = '';\r\n\tif (value.constructor && value.constructor.name && typeof value.constructor.name === 'string') {\r\n\t\tconstructor = value.constructor.name;\r\n\t\tif (constructor === 'Object') constructor = '';\r\n\t} else {\r\n\t\tconstructor = 'null';\r\n\t}\r\n\t// If it has a toString, try to grab the base class from there\r\n\t// (This is for Map/Set subclasses like user.auth)\r\n\tconst baseClass = (value?.toString && /\\[object (.*)\\]/.exec(value.toString())?.[1]) || constructor;\r\n\r\n\tswitch (baseClass) {\r\n\tcase 'Map':\r\n\t\tif (depth > 2) return `Map`;\r\n\t\tconst mapped = [...value.entries()].map(\r\n\t\t\tval => `${visualize(val[0], depth + 1)} => ${visualize(val[1], depth + 1)}`\r\n\t\t);\r\n\t\treturn `${constructor} (${value.size}) { ${mapped.join(', ')} }`;\r\n\tcase 'Set':\r\n\t\tif (depth > 2) return `Set`;\r\n\t\treturn `${constructor} (${value.size}) { ${[...value].map(v => visualize(v), depth + 1).join(', ')} }`;\r\n\t}\r\n\r\n\tif (value.toString) {\r\n\t\ttry {\r\n\t\t\tconst stringValue = value.toString();\r\n\t\t\tif (typeof stringValue === 'string' &&\r\n\t\t\t\t\tstringValue !== '[object Object]' &&\r\n\t\t\t\t\tstringValue !== `[object ${constructor}]`) {\r\n\t\t\t\treturn `${constructor}(${stringValue})`;\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n\tlet buf = '';\r\n\tfor (const key in value) {\r\n\t\tif (!Object.prototype.hasOwnProperty.call(value, key)) continue;\r\n\t\tif (depth > 2 || (depth && constructor)) {\r\n\t\t\tbuf = '...';\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (buf) buf += `, `;\r\n\t\tlet displayedKey = key;\r\n\t\tif (!/^[A-Za-z0-9_$]+$/.test(key)) displayedKey = JSON.stringify(key);\r\n\t\tbuf += `${displayedKey}: ` + visualize(value[key], depth + 1);\r\n\t}\r\n\tif (constructor && !buf && constructor !== 'null') return constructor;\r\n\treturn `${constructor}{${buf}}`;\r\n}\r\n\r\n/**\r\n * Compares two variables; intended to be used as a smarter comparator.\r\n * The two variables must be the same type (TypeScript will not check this).\r\n *\r\n * - Numbers are sorted low-to-high, use `-val` to reverse\r\n * - Strings are sorted A to Z case-semi-insensitively, use `{reverse: val}` to reverse\r\n * - Booleans are sorted true-first (REVERSE of casting to numbers), use `!val` to reverse\r\n * - Arrays are sorted lexically in the order of their elements\r\n *\r\n * In other words: `[num, str]` will be sorted A to Z, `[num, {reverse: str}]` will be sorted Z to A.\r\n */\r\nexport function compare(a: Comparable, b: Comparable): number {\r\n\tif (typeof a === 'number') {\r\n\t\treturn a - (b as number);\r\n\t}\r\n\tif (typeof a === 'string') {\r\n\t\treturn a.localeCompare(b as string);\r\n\t}\r\n\tif (typeof a === 'boolean') {\r\n\t\treturn (a ? 1 : 2) - (b ? 1 : 2);\r\n\t}\r\n\tif (Array.isArray(a)) {\r\n\t\tfor (let i = 0; i < a.length; i++) {\r\n\t\t\tconst comparison = compare(a[i], (b as Comparable[])[i]);\r\n\t\t\tif (comparison) return comparison;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\tif ('reverse' in a) {\r\n\t\treturn compare((b as {reverse: string}).reverse, a.reverse);\r\n\t}\r\n\tthrow new Error(`Passed value ${a} is not comparable`);\r\n}\r\n\r\n/**\r\n * Sorts an array according to the callback's output on its elements.\r\n *\r\n * The callback's output is compared according to `PSUtils.compare`\r\n * (numbers low to high, strings A-Z, booleans true-first, arrays in order).\r\n */\r\nexport function sortBy(array: T[], callback: (a: T) => Comparable): T[];\r\n/**\r\n * Sorts an array according to `PSUtils.compare`\r\n * (numbers low to high, strings A-Z, booleans true-first, arrays in order).\r\n *\r\n * Note that array.sort() only works on strings, not numbers, so you'll need\r\n * this to sort numbers.\r\n */\r\nexport function sortBy(array: T[]): T[];\r\nexport function sortBy(array: T[], callback?: (a: T) => Comparable) {\r\n\tif (!callback) return (array as any[]).sort(compare);\r\n\treturn array.sort((a, b) => compare(callback(a), callback(b)));\r\n}\r\n\r\nexport function splitFirst(str: string, delimiter: string): [string, string];\r\nexport function splitFirst(str: string, delimiter: string, limit: 2): [string, string, string];\r\nexport function splitFirst(str: string, delimiter: string, limit: 3): [string, string, string, string];\r\nexport function splitFirst(str: string, delimiter: string, limit: number): string[];\r\n/**\r\n* Like string.split(delimiter), but only recognizes the first `limit`\r\n* delimiters (default 1).\r\n*\r\n* `\"1 2 3 4\".split(\" \", 2) => [\"1\", \"2\"]`\r\n*\r\n* `Utils.splitFirst(\"1 2 3 4\", \" \", 1) => [\"1\", \"2 3 4\"]`\r\n*\r\n* Returns an array of length exactly limit + 1.\r\n*\r\n*/\r\nexport function splitFirst(str: string, delimiter: string, limit = 1) {\r\n\tconst splitStr: string[] = [];\r\n\twhile (splitStr.length < limit) {\r\n\t\tconst delimiterIndex = str.indexOf(delimiter);\r\n\t\tif (delimiterIndex >= 0) {\r\n\t\t\tsplitStr.push(str.slice(0, delimiterIndex));\r\n\t\t\tstr = str.slice(delimiterIndex + delimiter.length);\r\n\t\t} else {\r\n\t\t\tsplitStr.push(str);\r\n\t\t\tstr = '';\r\n\t\t}\r\n\t}\r\n\tsplitStr.push(str);\r\n\treturn splitStr;\r\n}\r\n\r\n/**\r\n * Template string tag function for escaping HTML\r\n */\r\nexport function html(strings: TemplateStringsArray, ...args: any) {\r\n\tlet buf = strings[0];\r\n\tlet i = 0;\r\n\twhile (i < args.length) {\r\n\t\tbuf += escapeHTML(args[i]);\r\n\t\tbuf += strings[++i];\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\n/**\r\n * This combines escapeHTML and forceWrap. The combination allows us to use\r\n * instead of U+200B, which will make sure the word-wrapping hints\r\n * can't be copy/pasted (which would mess up code).\r\n */\r\nexport function escapeHTMLForceWrap(text: string): string {\r\n\treturn escapeHTML(forceWrap(text)).replace(/\\u200B/g, '');\r\n}\r\n\r\n/**\r\n * HTML doesn't support `word-wrap: break-word` in tables, but sometimes it\r\n * would be really nice if it did. This emulates `word-wrap: break-word` by\r\n * manually inserting U+200B to tell long words to wrap.\r\n */\r\nexport function forceWrap(text: string): string {\r\n\treturn text.replace(/[^\\s]{30,}/g, word => {\r\n\t\tlet lastBreak = 0;\r\n\t\tlet brokenWord = '';\r\n\t\tfor (let i = 1; i < word.length; i++) {\r\n\t\t\tif (i - lastBreak >= 10 || /[^a-zA-Z0-9([{][a-zA-Z0-9]/.test(word.slice(i - 1, i + 1))) {\r\n\t\t\t\tbrokenWord += word.slice(lastBreak, i) + '\\u200B';\r\n\t\t\t\tlastBreak = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tbrokenWord += word.slice(lastBreak);\r\n\t\treturn brokenWord;\r\n\t});\r\n}\r\n\r\nexport function shuffle(arr: T[]): T[] {\r\n\t// In-place shuffle by Fisher-Yates algorithm\r\n\tfor (let i = arr.length - 1; i > 0; i--) {\r\n\t\tconst j = Math.floor(Math.random() * (i + 1));\r\n\t\t[arr[i], arr[j]] = [arr[j], arr[i]];\r\n\t}\r\n\treturn arr;\r\n}\r\n\r\nexport function randomElement(arr: T[]): T {\r\n\tconst i = Math.floor(Math.random() * arr.length);\r\n\treturn arr[i];\r\n}\r\n\r\n/** Forces num to be an integer (between min and max). */\r\nexport function clampIntRange(num: any, min?: number, max?: number): number {\r\n\tif (typeof num !== 'number') num = 0;\r\n\tnum = Math.floor(num);\r\n\tif (min !== undefined && num < min) num = min;\r\n\tif (max !== undefined && num > max) num = max;\r\n\treturn num;\r\n}\r\n\r\nexport function clearRequireCache(options: {exclude?: string[]} = {}) {\r\n\tconst excludes = options?.exclude || [];\r\n\texcludes.push('/node_modules/');\r\n\r\n\tfor (const path in require.cache) {\r\n\t\tlet skip = false;\r\n\t\tfor (const exclude of excludes) {\r\n\t\t\tif (path.includes(exclude)) {\r\n\t\t\t\tskip = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!skip) delete require.cache[path];\r\n\t}\r\n}\r\n\r\nexport function deepClone(obj: any): any {\r\n\tif (obj === null || typeof obj !== 'object') return obj;\r\n\tif (Array.isArray(obj)) return obj.map(prop => deepClone(prop));\r\n\tconst clone = Object.create(Object.getPrototypeOf(obj));\r\n\tfor (const key of Object.keys(obj)) {\r\n\t\tclone[key] = deepClone(obj[key]);\r\n\t}\r\n\treturn clone;\r\n}\r\n\r\nexport function levenshtein(s: string, t: string, l: number): number {\r\n\t// Original levenshtein distance function by James Westgate, turned out to be the fastest\r\n\tconst d: number[][] = [];\r\n\r\n\t// Step 1\r\n\tconst n = s.length;\r\n\tconst m = t.length;\r\n\r\n\tif (n === 0) return m;\r\n\tif (m === 0) return n;\r\n\tif (l && Math.abs(m - n) > l) return Math.abs(m - n);\r\n\r\n\t// Create an array of arrays in javascript (a descending loop is quicker)\r\n\tfor (let i = n; i >= 0; i--) d[i] = [];\r\n\r\n\t// Step 2\r\n\tfor (let i = n; i >= 0; i--) d[i][0] = i;\r\n\tfor (let j = m; j >= 0; j--) d[0][j] = j;\r\n\r\n\t// Step 3\r\n\tfor (let i = 1; i <= n; i++) {\r\n\t\tconst si = s.charAt(i - 1);\r\n\r\n\t\t// Step 4\r\n\t\tfor (let j = 1; j <= m; j++) {\r\n\t\t\t// Check the jagged ld total so far\r\n\t\t\tif (i === j && d[i][j] > 4) return n;\r\n\r\n\t\t\tconst tj = t.charAt(j - 1);\r\n\t\t\tconst cost = (si === tj) ? 0 : 1; // Step 5\r\n\r\n\t\t\t// Calculate the minimum\r\n\t\t\tlet mi = d[i - 1][j] + 1;\r\n\t\t\tconst b = d[i][j - 1] + 1;\r\n\t\t\tconst c = d[i - 1][j - 1] + cost;\r\n\r\n\t\t\tif (b < mi) mi = b;\r\n\t\t\tif (c < mi) mi = c;\r\n\r\n\t\t\td[i][j] = mi; // Step 6\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 7\r\n\treturn d[n][m];\r\n}\r\n\r\nexport function waitUntil(time: number): Promise {\r\n\treturn new Promise(resolve => {\r\n\t\tsetTimeout(() => resolve(), time - Date.now());\r\n\t});\r\n}\r\n\r\n/** Like parseInt, but returns NaN if the int isn't already in normalized form */\r\nexport function parseExactInt(str: string): number {\r\n\tif (!/^-?(0|[1-9][0-9]*)$/.test(str)) return NaN;\r\n\treturn parseInt(str);\r\n}\r\n\r\n/** formats an array into a series of question marks and adds the elements to an arguments array */\r\nexport function formatSQLArray(arr: unknown[], args?: unknown[]) {\r\n\targs?.push(...arr);\r\n\treturn [...'?'.repeat(arr.length)].join(', ');\r\n}\r\n\r\nexport class Multiset extends Map {\r\n\tadd(key: T) {\r\n\t\tthis.set(key, (this.get(key) ?? 0) + 1);\r\n\t\treturn this;\r\n\t}\r\n\tremove(key: T) {\r\n\t\tconst newValue = (this.get(key) ?? 0) - 1;\r\n\t\tif (newValue <= 0) return this.delete(key);\r\n\t\tthis.set(key, newValue);\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// backwards compatibility\r\nexport const Utils = {\r\n\tparseExactInt, waitUntil, html, escapeHTML,\r\n\tcompare, sortBy, levenshtein,\r\n\tshuffle, deepClone, clearRequireCache,\r\n\trandomElement, forceWrap, splitFirst,\r\n\tstripHTML, visualize, getString,\r\n\tescapeRegex, formatSQLArray, Multiset,\r\n};\r\n"],
"mappings": "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",
"names": []
}