"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var utils_exports = {};
__export(utils_exports, {
Multiset: () => Multiset,
Utils: () => Utils,
bufFromHex: () => bufFromHex,
bufReadHex: () => bufReadHex,
bufWriteHex: () => bufWriteHex,
clampIntRange: () => clampIntRange,
clearRequireCache: () => clearRequireCache,
compare: () => compare,
deepClone: () => deepClone,
deepFreeze: () => deepFreeze,
escapeHTML: () => escapeHTML,
escapeHTMLForceWrap: () => escapeHTMLForceWrap,
escapeRegex: () => escapeRegex,
forceWrap: () => forceWrap,
formatOrder: () => formatOrder,
formatSQLArray: () => formatSQLArray,
getString: () => getString,
html: () => html,
levenshtein: () => levenshtein,
parseExactInt: () => parseExactInt,
randomElement: () => randomElement,
shuffle: () => shuffle,
sortBy: () => sortBy,
splitFirst: () => splitFirst,
stripHTML: () => stripHTML,
uncacheModuleTree: () => uncacheModuleTree,
visualize: () => visualize,
waitUntil: () => waitUntil
});
module.exports = __toCommonJS(utils_exports);
function getString(str) {
return typeof str === "string" || typeof str === "number" ? `${str}` : "";
}
function escapeRegex(str) {
return str.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
}
function escapeHTML(str) {
if (str === null || str === void 0)
return "";
return `${str}`.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/\//g, "/").replace(/\n/g, "
");
}
function stripHTML(htmlContent) {
if (!htmlContent)
return "";
return htmlContent.replace(/<[^>]*>/g, "");
}
function formatOrder(place) {
let remainder = place % 100;
if (remainder >= 10 && remainder <= 20)
return `${place}th`;
remainder = place % 10;
if (remainder === 1)
return `${place}st`;
if (remainder === 2)
return `${place}nd`;
if (remainder === 3)
return `${place}rd`;
return `${place}th`;
}
function visualize(value, depth = 0) {
if (value === void 0)
return `undefined`;
if (value === null)
return `null`;
if (typeof value === "number" || typeof value === "boolean") {
return `${value}`;
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "symbol") {
return value.toString();
}
if (Array.isArray(value)) {
if (depth > 10)
return `[array]`;
return `[` + value.map((elem) => visualize(elem, depth + 1)).join(`, `) + `]`;
}
if (value instanceof RegExp || value instanceof Date || value instanceof Function) {
if (depth && value instanceof Function)
return `Function`;
return `${value}`;
}
let constructor = "";
if (typeof value.constructor?.name === "string") {
constructor = value.constructor.name;
if (constructor === "Object")
constructor = "";
} else {
constructor = "null";
}
const baseClass = value?.toString && /\[object (.*)\]/.exec(value.toString())?.[1] || constructor;
switch (baseClass) {
case "Map":
if (depth > 2)
return `Map`;
const mapped = [...value.entries()].map(
(val) => `${visualize(val[0], depth + 1)} => ${visualize(val[1], depth + 1)}`
);
return `${constructor} (${value.size}) { ${mapped.join(", ")} }`;
case "Set":
if (depth > 2)
return `Set`;
return `${constructor} (${value.size}) { ${[...value].map((v) => visualize(v), depth + 1).join(", ")} }`;
}
if (value.toString) {
try {
const stringValue = value.toString();
if (typeof stringValue === "string" && stringValue !== "[object Object]" && stringValue !== `[object ${constructor}]`) {
return `${constructor}(${stringValue})`;
}
} catch {
}
}
let buf = "";
for (const key in value) {
if (!Object.prototype.hasOwnProperty.call(value, key))
continue;
if (depth > 2 || depth && constructor) {
buf = "...";
break;
}
if (buf)
buf += `, `;
let displayedKey = key;
if (!/^[A-Za-z0-9_$]+$/.test(key))
displayedKey = JSON.stringify(key);
buf += `${displayedKey}: ` + visualize(value[key], depth + 1);
}
if (constructor && !buf && constructor !== "null")
return constructor;
return `${constructor}{${buf}}`;
}
function compare(a, b) {
if (typeof a === "number") {
return a - b;
}
if (typeof a === "string") {
return a.localeCompare(b);
}
if (typeof a === "boolean") {
return (a ? 1 : 2) - (b ? 1 : 2);
}
if (Array.isArray(a)) {
for (let i = 0; i < a.length; i++) {
const comparison = compare(a[i], b[i]);
if (comparison)
return comparison;
}
return 0;
}
if ("reverse" in a) {
return compare(b.reverse, a.reverse);
}
throw new Error(`Passed value ${a} is not comparable`);
}
function sortBy(array, callback) {
if (!callback)
return array.sort(compare);
return array.sort((a, b) => compare(callback(a), callback(b)));
}
function splitFirst(str, delimiter, limit = 1) {
const splitStr = [];
while (splitStr.length < limit) {
let delimiterIndex, delimiterLength;
if (typeof delimiter === "string") {
delimiterIndex = str.indexOf(delimiter);
delimiterLength = delimiter.length;
} else {
delimiter.lastIndex = 0;
const match = delimiter.exec(str);
delimiterIndex = match ? match.index : -1;
delimiterLength = match ? match[0].length : 0;
}
if (delimiterIndex >= 0) {
splitStr.push(str.slice(0, delimiterIndex));
str = str.slice(delimiterIndex + delimiterLength);
} else {
splitStr.push(str);
str = "";
}
}
splitStr.push(str);
return splitStr;
}
function html(strings, ...args) {
let buf = strings[0];
let i = 0;
while (i < args.length) {
buf += escapeHTML(args[i]);
buf += strings[++i];
}
return buf;
}
function escapeHTMLForceWrap(text) {
return escapeHTML(forceWrap(text)).replace(/\u200B/g, "");
}
function forceWrap(text) {
return text.replace(/[^\s]{30,}/g, (word) => {
let lastBreak = 0;
let brokenWord = "";
for (let i = 1; i < word.length; i++) {
if (i - lastBreak >= 10 || /[^a-zA-Z0-9([{][a-zA-Z0-9]/.test(word.slice(i - 1, i + 1))) {
brokenWord += word.slice(lastBreak, i) + "\u200B";
lastBreak = i;
}
}
brokenWord += word.slice(lastBreak);
return brokenWord;
});
}
function shuffle(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
function randomElement(arr) {
const i = Math.floor(Math.random() * arr.length);
return arr[i];
}
function clampIntRange(num, min, max) {
if (typeof num !== "number")
num = 0;
num = Math.floor(num);
if (min !== void 0 && num < min)
num = min;
if (max !== void 0 && num > max)
num = max;
return num;
}
function clearRequireCache(options = {}) {
const excludes = options?.exclude || [];
excludes.push("/node_modules/");
for (const path in require.cache) {
if (excludes.some((p) => path.includes(p)))
continue;
const mod = require.cache[path];
if (!mod)
continue;
uncacheModuleTree(mod, excludes);
delete require.cache[path];
}
}
function uncacheModuleTree(mod, excludes) {
if (!mod.children?.length || excludes.some((p) => mod.filename.includes(p)))
return;
for (const [i, child] of mod.children.entries()) {
if (excludes.some((p) => child.filename.includes(p)))
continue;
mod.children?.splice(i, 1);
uncacheModuleTree(child, excludes);
}
delete mod.children;
}
function deepClone(obj) {
if (obj === null || typeof obj !== "object")
return obj;
if (Array.isArray(obj))
return obj.map((prop) => deepClone(prop));
const clone = Object.create(Object.getPrototypeOf(obj));
for (const key of Object.keys(obj)) {
clone[key] = deepClone(obj[key]);
}
return clone;
}
function deepFreeze(obj) {
if (obj === null || typeof obj !== "object")
return obj;
if (Object.isFrozen(obj))
return obj;
Object.freeze(obj);
if (Array.isArray(obj)) {
for (const elem of obj)
deepFreeze(elem);
} else {
for (const elem of Object.values(obj))
deepFreeze(elem);
}
return obj;
}
function levenshtein(s, t, l) {
const d = [];
const n = s.length;
const m = t.length;
if (n === 0)
return m;
if (m === 0)
return n;
if (l && Math.abs(m - n) > l)
return Math.abs(m - n);
for (let i = n; i >= 0; i--)
d[i] = [];
for (let i = n; i >= 0; i--)
d[i][0] = i;
for (let j = m; j >= 0; j--)
d[0][j] = j;
for (let i = 1; i <= n; i++) {
const si = s.charAt(i - 1);
for (let j = 1; j <= m; j++) {
if (i === j && d[i][j] > 4)
return n;
const tj = t.charAt(j - 1);
const cost = si === tj ? 0 : 1;
let mi = d[i - 1][j] + 1;
const b = d[i][j - 1] + 1;
const c = d[i - 1][j - 1] + cost;
if (b < mi)
mi = b;
if (c < mi)
mi = c;
d[i][j] = mi;
}
}
return d[n][m];
}
function waitUntil(time) {
return new Promise((resolve) => {
setTimeout(() => resolve(), time - Date.now());
});
}
function parseExactInt(str) {
if (!/^-?(0|[1-9][0-9]*)$/.test(str))
return NaN;
return parseInt(str);
}
function formatSQLArray(arr, args) {
args?.push(...arr);
return [..."?".repeat(arr.length)].join(", ");
}
function bufFromHex(hex) {
const buf = new Uint8Array(Math.ceil(hex.length / 2));
bufWriteHex(buf, hex);
return buf;
}
function bufWriteHex(buf, hex, offset = 0) {
const size = Math.ceil(hex.length / 2);
for (let i = 0; i < size; i++) {
buf[offset + i] = parseInt(hex.slice(i * 2, i * 2 + 2).padEnd(2, "0"), 16);
}
}
function bufReadHex(buf, start = 0, end) {
return [...buf.slice(start, end)].map((val) => val.toString(16).padStart(2, "0")).join("");
}
class Multiset extends Map {
get(key) {
return super.get(key) ?? 0;
}
add(key) {
this.set(key, this.get(key) + 1);
return this;
}
remove(key) {
const newValue = this.get(key) - 1;
if (newValue <= 0)
return this.delete(key);
this.set(key, newValue);
return true;
}
}
const Utils = {
parseExactInt,
waitUntil,
html,
escapeHTML,
compare,
sortBy,
levenshtein,
shuffle,
deepClone,
deepFreeze,
clampIntRange,
clearRequireCache,
randomElement,
forceWrap,
splitFirst,
stripHTML,
visualize,
getString,
escapeRegex,
formatSQLArray,
bufFromHex,
bufReadHex,
bufWriteHex,
Multiset
};
//# sourceMappingURL=utils.js.map