@ztimson/utils 0.27.19 → 0.27.20

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/arg-parser.ts","../src/json.ts","../src/objects.ts","../src/aset.ts","../src/array.ts","../src/cache.ts","../src/color.ts","../src/string.ts","../src/csv.ts","../src/time.ts","../src/database.ts","../src/promise-progress.ts","../src/files.ts","../src/emitter.ts","../src/errors.ts","../src/http.ts","../src/jwt.ts","../src/logger.ts","../src/math.ts","../src/misc.ts","../src/path-events.ts","../src/search.ts","../src/template.ts","../node_modules/var-persist/dist/persist.js","../node_modules/var-persist/dist/memory-storage.js","../node_modules/var-persist/dist/index.js"],"sourcesContent":["export type Arg<T = any> = {\n\t/** Argument/property name */\n\tname: string;\n\t/** Argument description for help page */\n\tdesc: string;\n\t/** Available shorthands */\n\tflags?: string[];\n\t/** Argument is not required */\n\toptional?: boolean;\n\t/** Default value if argument is not used */\n\tdefault?: T;\n\t/** Collects any unmatched arguments */\n\textras?: boolean;\n}\n\nexport class ArgParser {\n\tcommands: ArgParser[] = [];\n\targs: Arg[] = [];\n\tflags: Arg[] = [];\n\tdefaults!: {[key: string]: any};\n\n\t/**\n\t * Create a unix-like argument parser to extract flags from the argument list. Can also create help messages.\n\t *\n\t * @param {string} name Script name\n\t * @param {string} desc Help description\n\t * @param {(ArgParser | Arg[]} argList Array of CLI arguments\n\t * @param {string[]} examples Additional examples to display\n\t */\n\tconstructor(public readonly name: string,\n\t\t\t\tpublic readonly desc: string,\n\t\t\t\tpublic readonly argList: (ArgParser | Arg)[] = [],\n\t\t\t\tpublic readonly examples: string[] = []\n\t) {\n\t\t// Arguments\n\t\tthis.commands = argList.filter(arg => arg instanceof ArgParser);\n\t\tthis.args = <Arg[]>argList.filter(arg => !(arg instanceof ArgParser) && !arg.flags?.length);\n\t\tthis.flags = <Arg[]>[...argList.filter(arg => !(arg instanceof ArgParser) && arg.flags && arg.flags.length),\n\t\t\t{name: 'help', desc: 'Display command\\'s help message', flags: ['-h', '--help'], default: false}];\n\t\tthis.defaults = argList.reduce((acc, arg: any) => ({...acc, [arg.name]: arg['extras'] ? [] : (arg.default ?? null)}), {});\n\n\t\t// Examples\n\t\tthis.examples = <string[]>[\n\t\t\t...examples,\n\t\t\t`[OPTIONS] ${this.args.map(arg => (arg.optional ? `[${arg.name.toUpperCase()}]` : arg.name.toUpperCase()) + (arg.extras ? '...' : '')).join(' ')}`,\n\t\t\tthis.commands.length ? `[OPTIONS] COMMAND` : null,\n\t\t\t`--help ${this.commands.length ? '[COMMAND]' : ''}`\n\t\t].filter(e => !!e);\n\t}\n\n\t/**\n\t * Parse an array into an arguments dictionary using the configuration.\n\t *\n\t * @param {string[]} args Array of arguments to be parsed\n\t * @returns {object} Dictionary of arguments with defaults applied\n\t */\n\tparse(args: string[]) {\n\t\t// Parse arguments\n\t\tlet extras = [], parsed: any = {...this.defaults, '_error': []}, queue = [...args];\n\t\twhile(queue.length) {\n\t\t\tlet arg = queue.splice(0, 1)[0];\n\t\t\tif(arg[0] == '-') { // Flags\n\t\t\t\t// Check for combined shorthand\n\t\t\t\tif(arg[1] != '-' && arg.length > 2) {\n\t\t\t\t\tqueue = [...arg.substring(2).split('').map(a => `-${a}`), ...queue];\n\t\t\t\t\targ = `-${arg[1]}`;\n\t\t\t\t}\n\t\t\t\t// Find & add flag\n\t\t\t\tconst combined = arg.split('=');\n\t\t\t\tconst argDef = this.flags.find(flag => flag.flags?.includes(combined[0] || arg));\n\t\t\t\tif(argDef == null) { // Not found, add to extras\n\t\t\t\t\textras.push(arg);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst value = combined[1] != null ? combined [1] :\n\t\t\t\t\targDef.default === false ? true :\n\t\t\t\t\targDef.default === true ? false :\n\t\t\t\t\tqueue.splice(queue.findIndex(q => q[0] != '-'), 1)[0] ||\n\t\t\t\t\targDef.default;\n\t\t\t\tif(value == null) parsed['_error'].push(`Option missing value: ${argDef.name || combined[0]}`);\n\t\t\t\tparsed[argDef.name] = value;\n\t\t\t} else { // Command\n\t\t\t\tconst c = this.commands.find(command => command.name == arg);\n\t\t\t\tif(!!c) {\n\t\t\t\t\tconst parsedCommand = c.parse(queue.splice(0, queue.length));\n\t\t\t\t\tObject.keys(parsedCommand).forEach(key => {\n\t\t\t\t\t\tif(parsed[key] != parsedCommand[key] && parsedCommand[key] == c.defaults[key])\n\t\t\t\t\t\t\tdelete parsedCommand[key];\n\t\t\t\t\t});\n\t\t\t\t\tparsed = {\n\t\t\t\t\t\t...parsed,\n\t\t\t\t\t\t...parsedCommand,\n\t\t\t\t\t\t_command: c.name\n\t\t\t\t\t};\n\t\t\t\t} else extras.push(arg); // Not found, add to extras\n\t\t\t}\n\t\t}\n\t\t// Arguments\n\t\tthis.args.filter(arg => !arg.extras).forEach(arg => {\n\t\t\tif(!arg.optional && !extras.length) parsed['_error'].push(`Argument missing: ${arg.name.toUpperCase()}`);\n\t\t\tif(extras.length) parsed[arg.name] = extras.splice(0, 1)[0];\n\t\t});\n\t\t// Extras\n\t\tconst extraKey = this.args.find(arg => arg.extras)?.name || '_extra';\n\t\tparsed[extraKey] = extras;\n\t\treturn parsed;\n\t}\n\n\t/**\n\t * Create help message from the provided description & argument list.\n\t *\n\t * @returns {string} Help message\n\t * @param opts Help options: command - display a commands help, message - override help description\n\t */\n\thelp(opts: {command?: string, message?: string} = {}): string {\n\t\tconst spacer = (text: string) => Array(24 - text.length || 1).fill(' ').join('');\n\n\t\t// Help with specific command\n\t\tif(opts.command) {\n\t\t\tconst argParser = this.commands.find(parser => parser.name == opts.command);\n\t\t\tif(!argParser) throw new Error(`${opts.command.toUpperCase()} is not a command`)\n\t\t\treturn argParser.help({...opts, command: undefined});\n\t\t}\n\n\t\t// Description\n\t\tlet msg = `\\n\\n${opts.message || this.desc}`;\n\t\t// Examples\n\t\tmsg += '\\n\\nUsage:\\t' + this.examples.map(ex => `${this.name} ${ex}`).join('\\n\\t');\n\t\t// Arguments\n\t\tif(this.args.length) msg += '\\n\\n\\t' + this.args.map(arg =>\n\t\t\t`${arg.name.toUpperCase()}${spacer(arg.name)}${arg.desc}`).join('\\n\\t');\n\t\t// Flags\n\t\tmsg += '\\n\\nOptions:\\n\\t' + this.flags.map(flag => {\n\t\t\tconst flags = flag.flags?.join(', ') || '';\n\t\t\treturn `${flags}${spacer(flags)}${flag.desc}`;\n\t\t}).join('\\n\\t');\n\t\t// Commands\n\t\tif(this.commands.length) msg += '\\n\\nCommands:\\n\\t' + this.commands.map(command =>\n\t\t\t`${command.name}${spacer(command.name)}${command.desc}`).join('\\n\\t');\n\t\treturn `${msg}\\n\\n`;\n\t}\n}\n","/**\n * Parse JSON but return the original string if it fails\n *\n * @param {any} json JSON string to parse\n * @param fallback Fallback value if unable to parse, defaults to original string\n * @return {string | T} Object if successful, original string otherwise\n */\nexport function JSONAttemptParse<T1, T2>(json: T2, fallback?: T1): T1 | T2 {\n\ttry { return JSON.parse(<any>json); }\n\tcatch { return fallback ?? json; }\n}\n\n/**\n * Stringifies objects & skips primitives\n *\n * @param {any} obj Object to convert to serializable value\n * @return {string | T} Serialized value\n */\nexport function JSONSerialize<T1>(obj: T1): T1 | string {\n\tif(typeof obj == 'object' && obj != null) return JSONSanitize(obj);\n\treturn obj;\n}\n\n/**\n * Convert an object to a JSON string avoiding any circular references.\n *\n * @param obj Object to convert to JSON\n * @param {number} space Format the JSON with spaces\n * @return {string} JSON string\n */\nexport function JSONSanitize(obj: any, space?: number): string {\n\tconst cache: any[] = [];\n\treturn JSON.stringify(obj, (key, value) => {\n\t\tif(typeof value === 'object' && value !== null) {\n\t\t\tif(cache.includes(value)) return '[Circular]';\n\t\t\tcache.push(value);\n\t\t}\n\t\treturn value;\n\t}, space);\n}\n","import {JSONSanitize} from './json.ts';\r\n\r\nexport type Delta = { [key: string]: any | Delta | null };\r\n\r\n/**\r\n * Applies deltas to `target`.\r\n * @param base starting point\r\n * @param deltas List of deltas to apply\r\n * @returns Mutated target\r\n */\r\nexport function applyDeltas(base: any, ...deltas: any[]): any {\r\n\tfunction applyDelta(base: any, delta: any): any {\r\n\t\tif(delta === null) return null;\r\n\t\tif(typeof base !== 'object' || base === null) return delta === undefined ? base : delta;\r\n\t\tconst result = Array.isArray(base) ? [...base] : { ...base };\r\n\t\tfor(const key in delta) {\r\n\t\t\tconst val = delta[key];\r\n\t\t\tif(val === undefined) delete result[key];\r\n\t\t\telse if(typeof val === 'object' && val !== null && !Array.isArray(val)) result[key] = applyDelta(result[key], val);\r\n\t\t\telse result[key] = val;\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfor(const d of deltas.flat()) base = applyDelta(base, d?.delta ?? d);\r\n\treturn base;\r\n}\r\n\r\n/**\r\n * Creates a nested delta that reverts `target` back to `old`.\r\n * @param old - Original object\r\n * @param updated - Modified object\r\n * @returns New changes\r\n */\r\nexport function calcDelta(old: any, updated: any): any {\r\n\tif(updated == null) return null; // full delete\r\n\tconst delta: any = {};\r\n\tconst isObj = (v: any) => v && typeof v === 'object' && !Array.isArray(v);\r\n\tfor (const key of new Set([...(old ? Object.keys(old) : []), ...(updated ? Object.keys(updated) : [])])) {\r\n\t\tconst oldVal = old?.[key];\r\n\t\tconst newVal = updated?.[key];\r\n\t\tif(isObj(oldVal) && isObj(newVal)) {\r\n\t\t\tconst nested = calcDelta(oldVal, newVal);\r\n\t\t\tif(nested !== null && Object.keys(nested).length > 0) delta[key] = nested;\r\n\t\t} else if(JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\r\n\t\t\tdelta[key] = newVal;\r\n\t\t}\r\n\t}\r\n\treturn Object.keys(delta).length === 0 ? {} : delta;\r\n}\r\n\r\n/**\r\n * Removes any null values from an object in-place\r\n *\r\n * @example\r\n * ```ts\r\n * let test = {a: 0, b: false, c: null, d: 'abc'}\r\n * console.log(clean(test)); // Output: {a: 0, b: false, d: 'abc'}\r\n * ```\r\n *\r\n * @param {T} obj Object reference that will be cleaned\r\n * @param undefinedOnly Ignore null values\r\n * @returns {Partial<T>} Cleaned object\r\n */\r\nexport function clean<T>(obj: T, undefinedOnly = false): Partial<T> {\r\n\tif(obj == null) throw new Error(\"Cannot clean a NULL value\");\r\n\tif(Array.isArray(obj)) {\r\n\t\tobj = <any>obj.filter(o => undefinedOnly ? o !== undefined : o != null);\r\n\t} else {\r\n\t\tObject.entries(obj).forEach(([key, value]) => {\r\n\t\t\tif((undefinedOnly && value === undefined) || (!undefinedOnly && value == null)) delete (<any>obj)[key];\r\n\t\t});\r\n\t}\r\n\treturn <any>obj;\r\n}\r\n\r\n/**\r\n * Create a deep copy of an object (vs. a shallow copy of references)\r\n *\r\n * Should be replaced by `structuredClone` once released.\r\n * @param {T} value Object to copy\r\n * @returns {T} Type\r\n */\r\nexport function deepCopy<T>(value: T): T {\r\n\tif(value == null) return value;\r\n\tconst t = typeof value;\r\n\tif(t === 'string' || t === 'number' || t === 'boolean' || t === 'function') return value;\r\n\ttry {return structuredClone(value); }\r\n\tcatch { return JSON.parse(JSONSanitize(value)); }\r\n}\r\n\r\n/**\r\n * Merge any number of objects into the target\r\n *\r\n * @param target Destination of all properties\r\n * @param sources Objects that will copied into target\r\n * @return {any} The des\r\n */\r\nexport function deepMerge<T>(target: any, ...sources: any[]): T {\r\n\tsources.forEach(s => {\r\n\t\tfor(const key in s) {\r\n\t\t\tif(s[key] && typeof s[key] == 'object' && !Array.isArray(s[key])) {\r\n\t\t\t\tif(!target[key]) target[key] = {};\r\n\t\t\t\tdeepMerge(target[key], s[key]);\r\n\t\t\t} else {\r\n\t\t\t\ttarget[key] = s[key];\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\treturn target;\r\n}\r\n\r\n/**\r\n * Get/set a property of an object using dot notation\r\n *\r\n * @example\r\n * ```ts\r\n * // Get a value\r\n * const name = dotNotation<string>(person, 'firstName');\r\n * const familyCarMake = dotNotation(family, 'cars[0].make');\r\n * // Set a value\r\n * dotNotation(family, 'cars[0].make', 'toyota');\r\n * ```\r\n *\r\n * @type T Return type\r\n * @param {Object} obj source object to search\r\n * @param {string} prop property name (Dot notation & indexing allowed)\r\n * @param {any} set Set object property to value, omit to fetch value instead\r\n * @return {T} property value\r\n */\r\nexport function dotNotation<T>(obj: any, prop: string, set: T): T;\r\nexport function dotNotation<T>(obj: any, prop: string): T | undefined;\r\nexport function dotNotation<T>(obj: any, prop: string, set?: T): T | undefined {\r\n\tif(obj == null || !prop) return undefined;\r\n\t// Split property string by '.' or [index]\r\n\treturn <T>prop.split(/[.[\\]]/g).filter(prop => prop.length).reduce((obj, prop, i, arr) => {\r\n\t\tif(prop[0] == '\"' || prop[0] == \"'\") prop = prop.slice(1, -1); // Take quotes out\r\n\t\tif(!obj?.hasOwnProperty(prop)) {\r\n\t\t\tif(set == undefined) return undefined;\r\n\t\t\tobj[prop] = {};\r\n\t\t}\r\n\t\tif(set !== undefined && i == arr.length - 1)\r\n\t\t\treturn obj[prop] = set;\r\n\t\treturn obj[prop];\r\n\t}, obj);\r\n}\r\n\r\n/**\r\n * Convert object into URL encoded query string\r\n *\r\n * @example\r\n * ```js\r\n * const query = encodeQuery({page: 1, size: 20});\r\n * console.log(query); // Output: \"page=1&size=20\"\r\n * ```\r\n *\r\n * @param {any} data - data to convert\r\n * @returns {string} - Encoded form data\r\n */\r\nexport function encodeQuery(data: any): string {\r\n\treturn Object.entries(data).map(([key, value]) =>\r\n\t\tencodeURIComponent(key) + '=' + encodeURIComponent(<any>value)\r\n\t).join('&');\r\n}\r\n\r\n/**\r\n * Recursively flatten a nested object, while maintaining key structure\r\n *\r\n * @example\r\n * ```ts\r\n * const car = {honda: {model: \"Civic\"}};\r\n * console.log(flattenObj(car)); //Output {honda.model: \"Civic\"}\r\n * ```\r\n *\r\n * @param obj - Object to flatten\r\n * @param parent - Recursively check if key is a parent key or not\r\n * @param result - Result\r\n * @returns {object} - Flattened object\r\n */\r\nexport function flattenObj(obj: any, parent?: any, result: any = {}) {\r\n\tif(typeof obj === \"object\" && !Array.isArray(obj)) {\r\n\t\tfor(const key of Object.keys(obj)) {\r\n\t\t\tconst propName = parent ? `${parent}.${key}` : key;\r\n\t\t\tif(typeof obj[key] === 'object' && obj[key] != null && !Array.isArray(obj[key])) {\r\n\t\t\t\tflattenObj(obj[key], propName, result);\r\n\t\t\t} else {\r\n\t\t\t\tresult[propName] = obj[key];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n}\r\n\r\n/**\r\n * Convert object to FormData\r\n *\r\n * @param target - Object to convert\r\n * @return {FormData} - Form object\r\n */\r\nexport function formData(target: any): FormData {\r\n\tconst data = new FormData();\r\n\tObject.entries(target).forEach(([key, value]) => data.append(key, <any>value));\r\n\treturn data;\r\n}\r\n\r\n/**\r\n * Check that an object has the following values\r\n *\r\n * @example\r\n * ```ts\r\n * const test = {a: 2, b: 2};\r\n * includes(test, {a: 1}); // true\r\n * includes(test, {b: 1, c: 3}); // false\r\n * ```\r\n *\r\n * @param target Object to search\r\n * @param values Criteria to check against\r\n * @param allowMissing Only check the keys that are available on the target\r\n * @returns {boolean} Does target include all the values\r\n */\r\nexport function includes(target: any, values: any, allowMissing = false): boolean {\r\n\tif(target == undefined) return allowMissing;\r\n\tif(Array.isArray(values)) return values.findIndex((e: any, i: number) => !includes(target[i], values[i], allowMissing)) == -1;\r\n\tconst type = typeof values;\r\n\tif(type != typeof target) return false;\r\n\tif(type == 'object') {\r\n\t\treturn Object.keys(values).find(key => !includes(target[key], values[key], allowMissing)) == null;\r\n\t}\r\n\tif(type == 'function') return target.toString() == values.toString();\r\n\treturn target == values;\r\n}\r\n\r\n/**\r\n * Deep check if two items are equal.\r\n * Handles primitives, objects, arrays, functions, Date, RegExp, and circular references.\r\n *\r\n * @param {any} a - first item to compare\r\n * @param {any} b - second item to compare\r\n * @param {WeakMap<object, object>} [seen] - Internal parameter to track circular references\r\n * @returns {boolean} True if they match\r\n */\r\nexport function isEqual(a: any, b: any, seen = new WeakMap<object, object>()): boolean {\r\n\t// Simple cases\r\n\tif(a === b) return true;\r\n\tif(a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\r\n\tif(a instanceof RegExp && b instanceof RegExp) return a.source === b.source && a.flags === b.flags;\r\n\r\n\t// Null checks\r\n\tif(typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n\t\tif(Number.isNaN(a) && Number.isNaN(b)) return true;\r\n\t\tif(typeof a === 'function' && typeof b === 'function') return a.toString() === b.toString()\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Circular references\r\n\tif(seen.has(a)) return seen.get(a) === b;\r\n\tseen.set(a, b);\r\n\tconst isArrayA = Array.isArray(a);\r\n\tconst isArrayB = Array.isArray(b);\r\n\r\n\t// Array checks\r\n\tif(isArrayA && isArrayB) {\r\n\t\tif(a.length !== b.length) return false;\r\n\t\tfor(let i = 0; i < a.length; i++) {\r\n\t\t\tif(!isEqual(a[i], b[i], seen)) return false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\tif(isArrayA !== isArrayB) return false;\r\n\r\n\t// Key & value deep comparison\r\n\tconst keysA = Object.keys(a);\r\n\tconst keysB = Object.keys(b);\r\n\tif(keysA.length !== keysB.length) return false;\r\n\tfor(const key of keysA) {\r\n\t\tif(!Object.prototype.hasOwnProperty.call(b, key) || !isEqual(a[key], b[key], seen)) return false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\n/**\r\n * Experimental: Combine multiple object prototypes into one\r\n *\r\n * @param target Object that will have prototypes added\r\n * @param {any[]} constructors Additionally prototypes that should be merged into target\r\n */\r\nexport function mixin(target: any, constructors: any[]) {\r\n\tconstructors.forEach(c => {\r\n\t\tObject.getOwnPropertyNames(c.prototype).forEach((name) => {\r\n\t\t\tObject.defineProperty(\r\n\t\t\t\ttarget.prototype,\r\n\t\t\t\tname,\r\n\t\t\t\tObject.getOwnPropertyDescriptor(c.prototype, name) ||\r\n\t\t\t\tObject.create(null)\r\n\t\t\t);\r\n\t\t});\r\n\t});\r\n}\r\n\r\n/**\r\n * Run a map function on each property\r\n * @param obj Object that will be iterated\r\n * @param {(key: string, value: any) => any} fn Transformer function - receives key & value\r\n * @returns {{}}\r\n */\r\nexport function objectMap<T>(obj: any, fn: (key: string, value: any) => any): T {\r\n\treturn <any>Object.entries(obj).map(([key, value]: [string, any]) => [key, fn(key, value)])\r\n\t\t.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\r\n}\r\n","import {isEqual} from './objects.ts';\n\n/**\n * An array which functions as a set. It guarantees unique elements\n * and provides set functions for comparisons\n */\nexport class ASet<T> extends Array {\n\t/** Number of elements in set */\n\tget size() {\n\t\treturn this.length;\n\t}\n\n\t/**\n\t * Array to create set from, duplicate values will be removed\n\t * @param {T[]} elements Elements which will be added to set\n\t */\n\tconstructor(elements: T[] = []) {\n\t\tsuper();\n\t\tif(!!elements?.['forEach'])\n\t\t\telements.forEach(el => this.add(el));\n\t}\n\n\t/**\n\t * Add elements to set if unique\n\t * @param items\n\t */\n\tadd(...items: T[]) {\n\t\titems.filter(el => !this.has(el)).forEach(el => this.push(el));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove all elements\n\t */\n\tclear() {\n\t\tthis.splice(0, this.length);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Delete elements from set\n\t * @param items Elements that will be deleted\n\t */\n\tdelete(...items: T[]) {\n\t\titems.forEach(el => {\n\t\t\tconst index = this.indexOf(el);\n\t\t\tif(index != -1) this.splice(index, 1);\n\t\t})\n\t\treturn this;\n\t}\n\n\t/**\n\t * Create list of elements this set has which the comparison set does not\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {ASet<T>} Different elements\n\t */\n\tdifference(set: ASet<T>) {\n\t\treturn new ASet<T>(this.filter(el => !set.has(el)));\n\t}\n\n\t/**\n\t * Check if set includes element\n\t * @param {T} el Element to look for\n\t * @return {boolean} True if element was found, false otherwise\n\t */\n\thas(el: T) {\n\t\treturn this.indexOf(el) != -1;\n\t}\n\n\t/**\n\t * Find index number of element, or -1 if it doesn't exist. Matches by equality not reference\n\t *\n\t * @param {T} search Element to find\n\t * @param {number} fromIndex Starting index position\n\t * @return {number} Element index number or -1 if missing\n\t */\n\tindexOf(search: T, fromIndex?: number): number {\n\t\treturn super.findIndex((el: T) => isEqual(el, search), fromIndex);\n\t}\n\n\t/**\n\t * Create list of elements this set has in common with the comparison set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} Set of common elements\n\t */\n\tintersection(set: ASet<T>) {\n\t\treturn new ASet<T>(this.filter(el => set.has(el)));\n\t}\n\n\t/**\n\t * Check if this set has no elements in common with the comparison set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} True if nothing in common, false otherwise\n\t */\n\tisDisjointFrom(set: ASet<T>) {\n\t\treturn this.intersection(set).size == 0;\n\t}\n\n\t/**\n\t * Check if all elements in this set are included in the comparison set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} True if all elements are included, false otherwise\n\t */\n\tisSubsetOf(set: ASet<T>) {\n\t\treturn this.findIndex(el => !set.has(el)) == -1;\n\t}\n\n\t/**\n\t * Check if all elements from comparison set are included in this set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} True if all elements are included, false otherwise\n\t */\n\tisSuperset(set: ASet<T>) {\n\t\treturn set.findIndex(el => !this.has(el)) == -1;\n\t}\n\n\t/**\n\t * Create list of elements that are only in one set but not both (XOR)\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {ASet<T>} New set of unique elements\n\t */\n\tsymmetricDifference(set: ASet<T>) {\n\t\treturn new ASet([...this.difference(set), ...set.difference(this)]);\n\t}\n\n\t/**\n\t * Create joined list of elements included in this & the comparison set\n\t * @param {ASet<T>} set Set join\n\t * @return {ASet<T>} New set of both previous sets combined\n\t */\n\tunion(set: ASet<T> | Array<T>) {\n\t\treturn new ASet([...this, ...set]);\n\t}\n}\n","import {ASet} from './aset.ts';\nimport {dotNotation, isEqual} from './objects';\n\n/**\n * Only add element to array if it isn't already included\n *\n * @example\n * ```js\n * const arr = addUnique([1, 2, 3], 3);\n * console.log(arr); // Output: [1, 2, 3]\n * ```\n *\n * @param {T[]} array Target array element will be added to\n * @param {T} el Unique element to add\n * @return {T[]} Array with element if it was unique\n * @deprecated Use ASet to create unique arrays\n */\nexport function addUnique<T>(array: T[], el: T): T[] {\n\tif(array.indexOf(el) === -1) array.push(el);\n\treturn array;\n}\n\n/**\n * Find all unique elements in arrays\n *\n * @param {any[]} a First array to compare\n * @param {any[]} b Second array to compare\n * @return {any[]} Unique elements\n * @deprecated Use ASet to perform Set operations on arrays\n */\nexport function arrayDiff(a: any[], b: any[]): any[] {\n\treturn new ASet(a).symmetricDifference(new ASet(b));\n}\n\n/**\n * Provides a shorthand for sorting arrays of complex objects by a string property\n *\n * @example\n * ```ts\n * let arr = [{a: 'Apple', b: 123}, {a: 'Carrot', b: 789}, {a: 'banana', b: 456}];\n * arr.sort(caseInsensitiveSort('a'));\n * ```\n *\n * @param {string} prop - Name of property to use, supports dot notation\n * @returns {(a, b) => (number)} - Function to handle sort (Meant to be passed to Array.prototype.sort or used in sortFn)\n */\nexport function caseInsensitiveSort(prop: string) {\n\treturn function (a: any, b: any) {\n\t\tconst aVal = dotNotation<string>(a, prop);\n\t\tconst bVal = dotNotation<string>(b, prop);\n\t\tif(typeof aVal !== 'string' || typeof bVal !== 'string') return 1;\n\t\treturn aVal.toLowerCase().localeCompare(bVal.toLowerCase());\n\t};\n}\n\n/**\n * Shorthand to find objects with a property value\n *\n * @example\n * ```js\n * const found = [\n * {name: 'Batman'},\n * {name: 'Superman'},\n * ].filter(findByProp('name', 'Batman'));\n * ```\n *\n * @param {string} prop Property to compare (Dot nation supported)\n * @param value Value property must have\n * @return {(v: any) => boolean} Function used by `filter` or `find`\n */\nexport function findByProp(prop: string, value: any) {\n\treturn (v: any) => isEqual(dotNotation(v, prop), value);\n}\n\n/**\n * Recursively flatten nested arrays\n *\n * @example\n * ```ts\n * const arr = [\n * {label: null, url: '/'},\n * {label: 'Model Admin', url: '/model-admin'},\n * [\n * {label: 'Elements', url: '/model-admin/elements'},\n * {label: 'Example', url: null}\n * ]\n * ];\n *\n * console.log(flattenArr(arr));\n * // Output:\n * [\n * {label: null, url: '/'},\n * {label: 'Model Admin', url: '/model-admin'},\n * {label: 'Elements', url: '/model-admin/elements'},\n * {label: 'Example', url: null}\n * ]\n * ```\n *\n * @param {any[]} arr - n-dimensional array\n * @param {any[]} result - Internal use only -- Keeps track of recursion\n * @returns {any[]} - Flattened array\n */\nexport function flattenArr(arr: any[], result: any[] = []): any[] {\n\tarr.forEach(el => Array.isArray(el) ? flattenArr(el, result) : result.push(el));\n\treturn result;\n}\n\n/**\n * Provides a shorthand for sorting arrays of complex objects\n *\n * @example\n * ```ts\n * let arr = [{a: {b: 2}}, {a: {b: 3}}, {a: {b: 1}}];\n * arr.sort(sortByProp('a.b'));\n * ```\n *\n * @param {string} prop - Name of property to use, supports dot notation\n * @param {boolean} reverse - Reverse the order of the sort\n * @returns {(a, b) => (number)} - Function to handle sort (Meant to be passed to Array.prototype.sort)\n */\nexport function sortByProp(prop: string, reverse = false) {\n\treturn function (a: any, b: any) {\n\t\tconst aVal = dotNotation<any>(a, prop);\n\t\tconst bVal = dotNotation<any>(b, prop);\n\t\tif(typeof aVal == 'number' && typeof bVal == 'number')\n\t\t\treturn (reverse ? -1 : 1) * (aVal - bVal);\n\t\tif(aVal > bVal) return reverse ? -1 : 1;\n\t\tif(aVal < bVal) return reverse ? 1 : -1;\n\t\treturn 0;\n\t};\n}\n\n/**\n * Make sure every element in array is unique\n *\n * @param {any[]} arr Array that will be filtered in place\n * @return {any[]} Original array\n * @deprecated Please use ASet to create a guaranteed unique array\n */\nexport function makeUnique(arr: any[]) {\n\tfor(let i = arr.length - 1; i >= 0; i--) {\n\t\tif(arr.slice(0, i).find(n => isEqual(n, arr[i]))) arr.splice(i, 1);\n\t}\n\treturn arr;\n}\n\n/**\n * Make sure value is an array, if it isn't wrap it in one\n *\n * @param {T[] | T} value Value that should be an array\n * @returns {T[]} Value in an array\n */\nexport function makeArray<T>(value: T | T[]): T[] {\n\treturn Array.isArray(value) ? value : [value];\n}\n","import {Database, Table} from './database.ts';\nimport {JSONSanitize} from './json.ts';\nimport {deepCopy, includes} from './objects.ts';\n\nexport type CacheOptions = {\n\t/** Delete keys automatically after x amount of seconds */\n\tttl?: number;\n\t/** Storage to persist cache */\n\tpersistentStorage?: {storage: Storage | Database, key: string} | string;\n\t/** Keep or delete cached items once expired, defaults to delete */\n\texpiryPolicy?: 'delete' | 'keep';\n\t/** Least Recently Used size limit */\n\tsizeLimit?: number;\n}\n\nexport type CachedValue<T> = T & {_expired?: boolean};\n\n/**\n * Map of data which tracks whether it is a complete collection & offers optional expiry of cached values\n */\nexport class Cache<K extends string | number | symbol, T> {\n\tprivate _loading!: Function;\n\tprivate store: Map<K, T> = new Map();\n\tprivate timers: Map<K, NodeJS.Timeout> = new Map();\n\tprivate lruOrder: K[] = [];\n\n\t/** Support index lookups */\n\t[key: string | number | symbol]: CachedValue<T> | any;\n\t/** Whether cache is complete */\n\tcomplete = false;\n\t/** Await initial loading */\n\tloading = new Promise<void>(r => this._loading = r);\n\n\t/**\n\t * Create new cache\n\t * @param {keyof T} key Default property to use as primary key\n\t * @param options\n\t */\n\tconstructor(public readonly key?: keyof T, public readonly options: CacheOptions = {}) {\n\t\t// Persistent storage\n\t\tif(this.options.persistentStorage != null) {\n\t\t\tif(typeof this.options.persistentStorage == 'string')\n\t\t\t\tthis.options.persistentStorage = {storage: localStorage, key: this.options.persistentStorage};\n\n\t\t\tif(this.options.persistentStorage?.storage?.database != undefined) {\n\t\t\t\t(async () => {\n\t\t\t\t\tconst persists: any = this.options.persistentStorage;\n\t\t\t\t\tconst table: Table<any, any> = await persists.storage.createTable({name: persists.key, key: this.key});\n\t\t\t\t\tconst rows = await table.getAll();\n\t\t\t\t\tfor(const row of rows) this.store.set(this.getKey(row), row);\n\t\t\t\t\tthis._loading();\n\t\t\t\t})();\n\t\t\t} else if((<any>this.options.persistentStorage?.storage)?.getItem != undefined) {\n\t\t\t\tconst {storage, key} = <{storage: Storage, key: string}>this.options.persistentStorage;\n\t\t\t\tconst stored = storage.getItem(key);\n\t\t\t\tif(stored != null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst obj = JSON.parse(stored);\n\t\t\t\t\t\tfor(const k of Object.keys(obj)) this.store.set(<any>k, obj[k]);\n\t\t\t\t\t} catch { /* ignore */ }\n\t\t\t\t}\n\t\t\t\tthis._loading();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._loading();\n\t\t}\n\n\t\t// Handle index lookups\n\t\treturn new Proxy(this, {\n\t\t\tget: (target: this, prop: string | symbol) => {\n\t\t\t\tif(prop in target) return (target as any)[prop];\n\t\t\t\treturn this.get(prop as K, true);\n\t\t\t},\n\t\t\tset: (target: this, prop: string | symbol, value: any) => {\n\t\t\t\tif(prop in target) (target as any)[prop] = value;\n\t\t\t\telse this.set(prop as K, value);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getKey(value: T): K {\n\t\tif(!this.key) throw new Error('No key defined');\n\t\tif((value as any)[this.key] === undefined) throw new Error(`${this.key.toString()} Doesn't exist on ${JSON.stringify(value, null, 2)}`);\n\t\treturn <K>(value as any)[this.key];\n\t}\n\n\t/** Save item to storage */\n\tprivate save(key?: K) {\n\t\tconst persists: {storage: any, key: string} = <any>this.options.persistentStorage;\n\t\tif(!!persists?.storage) {\n\t\t\tif(persists.storage?.database != undefined) {\n\t\t\t\t(<Database>persists.storage).createTable({name: persists.key, key: <string>this.key}).then(table => {\n\t\t\t\t\tif(key !== undefined) {\n\t\t\t\t\t\tconst value = this.get(key, true);\n\t\t\t\t\t\tif(value != null) table.set(value, key);\n\t\t\t\t\t\telse table.delete(key);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttable.clear();\n\t\t\t\t\t\tthis.all(true).forEach(row => table.add(row));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if(persists.storage?.setItem != undefined) {\n\t\t\t\tconst obj: Record<any, any> = {};\n\t\t\t\tfor(const [k, v] of this.store.entries()) obj[k as any] = v;\n\t\t\t\tpersists.storage.setItem(persists.key, JSONSanitize(obj));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate clearTimer(key: K) {\n\t\tconst t = this.timers.get(key);\n\t\tif(t) { clearTimeout(t); this.timers.delete(key); }\n\t}\n\n\tprivate touchLRU(key: K) {\n\t\tif(!this.options.sizeLimit || this.options.sizeLimit <= 0) return;\n\t\tconst idx = this.lruOrder.indexOf(key);\n\t\tif(idx >= 0) this.lruOrder.splice(idx, 1);\n\t\tthis.lruOrder.push(key);\n\t\twhile(this.lruOrder.length > (this.options.sizeLimit || 0)) {\n\t\t\tconst lru = this.lruOrder.shift();\n\t\t\tif(lru !== undefined) this.delete(lru);\n\t\t}\n\t}\n\n\t/**\n\t * Get all cached items\n\t * @return {T[]} Array of items\n\t */\n\tall(expired?: boolean): CachedValue<T>[] {\n\t\tconst out: CachedValue<T>[] = [];\n\t\tfor(const v of this.store.values()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) out.push(deepCopy(val));\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * Add a new item to the cache. Like set, but finds key automatically\n\t */\n\tadd(value: T, ttl = this.ttl): this {\n\t\tconst key = this.getKey(value);\n\t\tthis.set(key, value, ttl);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add several rows to the cache\n\t */\n\taddAll(rows: T[], complete = true): this {\n\t\tthis.clear();\n\t\trows.forEach(r => this.add(r));\n\t\tthis.complete = complete;\n\t\treturn this;\n\t}\n\n\t/** Remove all keys */\n\tclear(): this {\n\t\tthis.complete = false;\n\t\tfor (const [k, t] of this.timers) clearTimeout(t);\n\t\tthis.timers.clear();\n\t\tthis.lruOrder = [];\n\t\tthis.store.clear();\n\t\tthis.save();\n\t\treturn this;\n\t}\n\n\t/** Delete a cached item */\n\tdelete(key: K): this {\n\t\tthis.clearTimer(key);\n\t\tconst idx = this.lruOrder.indexOf(key);\n\t\tif(idx >= 0) this.lruOrder.splice(idx, 1);\n\t\tthis.store.delete(key);\n\t\tthis.save(key);\n\t\treturn this;\n\t}\n\n\t/** Return entries as array */\n\tentries(expired?: boolean): [K, CachedValue<T>][] {\n\t\tconst out: [K, CachedValue<T>][] = [];\n\t\tfor(const [k, v] of this.store.entries()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) out.push([k, deepCopy(val)]);\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Manually expire a cached item */\n\texpire(key: K): this {\n\t\tthis.complete = false;\n\t\tif(this.options.expiryPolicy == 'keep') {\n\t\t\tconst v: any = this.store.get(key);\n\t\t\tif(v) {\n\t\t\t\tv._expired = true;\n\t\t\t\tthis.store.set(key, v);\n\t\t\t\tthis.save(key);\n\t\t\t}\n\t\t} else this.delete(key);\n\t\treturn this;\n\t}\n\n\t/** Find first matching item */\n\tfind(filter: Partial<T>, expired?: boolean): T | undefined {\n\t\tfor(const v of this.store.values()) {\n\t\t\tconst row: any = v;\n\t\t\tif((expired || !row._expired) && includes(row, filter)) return deepCopy(row);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Get cached item by key */\n\tget(key: K, expired?: boolean): CachedValue<T> | null {\n\t\tconst raw = this.store.get(key);\n\t\tif(raw == null) return null;\n\t\tthis.touchLRU(key);\n\t\tconst isExpired = (raw as any)?._expired;\n\t\tif(expired || !isExpired) return deepCopy(raw);\n\t\treturn null;\n\t}\n\n\t/** Return list of keys */\n\tkeys(expired?: boolean): K[] {\n\t\tconst out: K[] = [];\n\t\tfor(const [k, v] of this.store.entries()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) out.push(k);\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Return map of key → item */\n\tmap(expired?: boolean): Record<K, CachedValue<T>> {\n\t\tconst copy: any = {};\n\t\tfor(const [k, v] of this.store.entries()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) copy[k as any] = deepCopy(val);\n\t\t}\n\t\treturn copy;\n\t}\n\n\t/** Add item manually specifying the key */\n\tset(key: K, value: T, ttl = this.options.ttl): this {\n\t\tif(this.options.expiryPolicy == 'keep') delete (<any>value)._expired;\n\t\tthis.clearTimer(key);\n\t\tthis.store.set(key, value);\n\t\tthis.touchLRU(key);\n\t\tthis.save(key);\n\t\tif(ttl) {\n\t\t\tconst t = setTimeout(() => {\n\t\t\t\tthis.expire(key);\n\t\t\t\tthis.save(key);\n\t\t\t}, ttl * 1000);\n\t\t\tthis.timers.set(key, t);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/** Get all cached items */\n\tvalues = this.all;\n}\n","/**\n * Determine if either black or white provides more contrast to the provided color\n * @param {string} background Color to compare against\n * @return {\"white\" | \"black\"} Color with the most contrast\n */\nexport function contrast(background: string): 'white' | 'black' {\n\tconst exploded = background?.match(background.length >= 6 ? /[0-9a-fA-F]{2}/g : /[0-9a-fA-F]/g);\n\tif(!exploded || exploded?.length < 3) return 'black';\n\tconst [r, g, b] = exploded.map(hex => parseInt(hex.length == 1 ? `${hex}${hex}` : hex, 16));\n\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\treturn luminance > 0.5 ? 'black' : 'white';\n}\n","/**\r\n * String of all letters\r\n */\r\nexport const LETTER_LIST = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n\r\n/**\r\n * String of all numbers\r\n */\r\nexport const NUMBER_LIST = '0123456789';\r\n\r\n/**\r\n * String of all symbols\r\n */\r\nexport const SYMBOL_LIST = '~`!@#$%^&*()_-+={[}]|\\\\:;\"\\'<,>.?/';\r\n\r\n/**\r\n * String of all letters, numbers & symbols\r\n */\r\nexport const CHAR_LIST = LETTER_LIST + LETTER_LIST.toLowerCase() + NUMBER_LIST + SYMBOL_LIST;\r\n\r\n/**\r\n * Converts text to camelCase\r\n */\r\nexport function camelCase(str?: string): string {\r\n\tif(!str) return '';\r\n\tconst pascal = pascalCase(str);\r\n\treturn pascal.charAt(0).toLowerCase() + pascal.slice(1);\r\n}\r\n\r\n\r\n/**\r\n * Convert number of bytes into a human-readable size\r\n *\r\n * @param {number} bytes Number of bytes\r\n * @param {number} decimals Decimal places to preserve\r\n * @return {string} Formated size\r\n */\r\nexport function formatBytes(bytes: number, decimals = 2) {\r\n\tif (bytes === 0) return '0 Bytes';\r\n\tconst k = 1024;\r\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * Convert milliseconds to human-readable duration\r\n * @param {string} ms milliseconds\r\n * @param {boolean} short Use unit initial instead of word\r\n * @return {string} formated duration\r\n */\r\nexport function formatMs(ms: number, short = false): string {\r\n\tif (isNaN(ms) || ms < 0) return \"Invalid input\";\r\n\tconst seconds = ms / 1000;\r\n\tconst minutes = seconds / 60;\r\n\tconst hours = minutes / 60;\r\n\tconst days = hours / 24;\r\n\tif (days >= 1) return `${days.toFixed(1)} ${short ? 'd' : 'days'}`;\r\n\telse if (hours >= 1) return `${hours.toFixed(1)} ${short ? 'h' : 'hours'}`;\r\n\telse if (minutes >= 1) return `${minutes.toFixed(1)} ${short ? 'm' : 'minutes'}`;\r\n\telse return `${seconds.toFixed(1)} ${short ? 's' : 'seconds'}`;\r\n}\r\n\r\n/**\r\n * Extract numbers from a string & create a formated phone number: +1 (123) 456-7890\r\n *\r\n * @param {string} number String that will be parsed for numbers\r\n * @return {string} Formated phone number\r\n */\r\nexport function formatPhoneNumber(number: string) {\r\n\tconst parts = /(\\+?1)?.*?(\\d{3}).*?(\\d{3}).*?(\\d{4})/g.exec(number);\r\n\tif(!parts) throw new Error(`Number cannot be parsed: ${number}`);\r\n\treturn `${parts[1] ? '+1' : ''} (${parts[2]}) ${parts[3]}-${parts[4]}`.trim();\r\n}\r\n\r\n/**\r\n * Insert a string into another string at a given position\r\n *\r\n * @example\r\n * ```js\r\n * console.log(insertAt('Hello world!', ' glorious', 5);\r\n * // Output: Hello glorious world!\r\n * ```\r\n *\r\n * @param {string} target - Parent string you want to modify\r\n * @param {string} str - Value that will be injected to parent\r\n * @param {number} index - Position to inject string at\r\n * @returns {string} - New string\r\n * @deprecated use `strSplice()`\r\n */\r\nexport function insertAt(target: string, str: string, index: number): String {\r\n\treturn `${target.slice(0, index)}${str}${target.slice(index + 1)}`;\r\n}\r\n\r\n/**\r\n * Converts text to kebab-case\r\n */\r\nexport function kebabCase(str?: string): string {\r\n\tif(!str) return '';\r\n\treturn wordSegments(str).map(w => w.toLowerCase()).join(\"-\");\r\n}\r\n\r\n\r\n/**\r\n * Add padding to string\r\n *\r\n * @example\r\n * ```js\r\n * const now = new Date();\r\n * const padded = now.getHours() + ':' + pad(now.getMinutes(), 2, '0');\r\n * console.log(padded); // Output: \"2:05\"\r\n * ```\r\n *\r\n * @param text Text that will be padded\r\n * @param {number} length Target length\r\n * @param {string} char Character to use as padding, defaults to space\r\n * @param {boolean} start Will pad start of text if true, or the end if false\r\n * @return {string} Padded string\r\n * @deprecated Please use `String.padStart` & `String.padEnd`\r\n */\r\nexport function pad(text: any, length: number, char: string = ' ', start = true) {\r\n\tif(start) return text.toString().padStart(length, char);\r\n\treturn text.toString().padEnd(length, char);\r\n}\r\n\r\n/**\r\n * Convert text to PascalCase\r\n * @param {string} str\r\n * @return {string}\r\n */\r\nexport function pascalCase(str?: string): string {\r\n\tif(!str) return '';\r\n\treturn wordSegments(str)\r\n\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\r\n\t\t.join('');\r\n}\r\n\r\n\r\n\r\n/**\r\n * Generate a random hexadecimal value\r\n *\r\n * @param {number} length Number of hexadecimal place values\r\n * @return {string} Hexadecimal number as a string\r\n */\r\nexport function randomHex(length: number) {\r\n\treturn Array(length).fill(null).map(() => Math.round(Math.random() * 0xF).toString(16)).join('');\r\n}\r\n\r\n/**\r\n * Generate a string of random characters.\r\n *\r\n * @example\r\n * ```ts\r\n * const random = randomString();\r\n * const randomByte = randomString(8, \"01\")\r\n * ```\r\n *\r\n * @param {number} length - length of generated string\r\n * @param {string} pool - character pool to generate string from\r\n * @return {string} generated string\r\n */\r\nexport function randomString(length: number, pool: string = CHAR_LIST): string {\r\n\treturn Array(length).fill(null).map(() => {\r\n\t\tconst n = ~~(Math.random() * pool.length);\r\n\t\treturn pool[n];\r\n\t}).join('');\r\n}\r\n\r\n/**\r\n * Generate a random string with fine control over letters, numbers & symbols\r\n *\r\n * @example\r\n * ```ts\r\n * const randomLetter = randomString(1, true);\r\n * const randomChar = randomString(1, true, true, true);\r\n * ```\r\n *\r\n * @param {number} length - length of generated string\r\n * @param {boolean} letters - Add letters to pool\r\n * @param {boolean} numbers - Add numbers to pool\r\n * @param {boolean} symbols - Add symbols to pool\r\n * @return {string} generated string\r\n */\r\nexport function randomStringBuilder(length: number, letters = false, numbers = false, symbols = false): string {\r\n\tif(!letters && !numbers && !symbols) throw new Error('Must enable at least one: letters, numbers, symbols');\r\n\treturn Array(length).fill(null).map(() => {\r\n\t\tlet c;\r\n\t\tdo {\r\n\t\t\tconst type = ~~(Math.random() * 3);\r\n\t\t\tif(letters && type == 0) {\r\n\t\t\t\tc = LETTER_LIST[~~(Math.random() * LETTER_LIST.length)];\r\n\t\t\t} else if(numbers && type == 1) {\r\n\t\t\t\tc = NUMBER_LIST[~~(Math.random() * NUMBER_LIST.length)];\r\n\t\t\t} else if(symbols && type == 2) {\r\n\t\t\t\tc = SYMBOL_LIST[~~(Math.random() * SYMBOL_LIST.length)];\r\n\t\t\t}\r\n\t\t} while(!c);\r\n\t\treturn c;\r\n\t}).join('');\r\n}\r\n\r\n/**\r\n * Converts text to snake_case\r\n */\r\nexport function snakeCase(str?: string): string {\r\n\tif(!str) return '';\r\n\treturn wordSegments(str).map(w => w.toLowerCase()).join(\"_\");\r\n}\r\n\r\n\r\n/**\r\n * Splice a string together (Similar to Array.splice)\r\n *\r\n * @param {string} str String that will be modified\r\n * @param {number} start Start index of splice\r\n * @param {number} deleteCount Number of characters to remove in splice\r\n * @param {string} insert Insert new string into splice\r\n * @return {string} Returned spliced string\r\n */\r\nexport function strSplice(str: string, start: number, deleteCount: number, insert = '') {\r\n\tconst before = str.slice(0, start);\r\n\tconst after = str.slice(start + deleteCount);\r\n\treturn before + insert + after;\r\n}\r\n\r\n/**\r\n * Find all substrings that match a given pattern.\r\n *\r\n * Roughly based on `String.prototype.matchAll`.\r\n *\r\n * @param {string} value - String to search.\r\n * @param {RegExp | string} regex - Regular expression to match.\r\n * @return {RegExpExecArray[]} Found matches.\r\n */\r\nexport function matchAll(value: string, regex: RegExp | string): RegExpExecArray[] {\r\n\tif(typeof regex === 'string') {\r\n\t\tregex = new RegExp(regex, 'g');\r\n\t}\r\n\r\n\t// https://stackoverflow.com/a/60290199\r\n\tif(!regex.global) {\r\n\t\tthrow new TypeError('Regular expression must be global.');\r\n\t}\r\n\r\n\tlet ret: RegExpExecArray[] = [];\r\n\tlet match: RegExpExecArray | null;\r\n\twhile((match = regex.exec(value)) !== null) {\r\n\t\tret.push(match);\r\n\t}\r\n\r\n\treturn ret;\r\n}\r\n\r\n/** Parts of a URL */\r\nexport type ParsedUrl = {\r\n\tprotocol?: string,\r\n\tsubdomain?: string,\r\n\tdomain: string,\r\n\thost: string,\r\n\tport?: number,\r\n\tpath?: string,\r\n\tquery?: {[name: string]: string}\r\n\tfragment?: string\r\n}\r\n\r\n/**\r\n * Break a URL string into its parts for easy parsing\r\n *\r\n * @param {string} url URL string that will be parsed\r\n * @returns {RegExpExecArray} Parts of URL\r\n * @deprecated Use built-in URL object: `new URL('...')`;\r\n */\r\nexport function parseUrl(url: string): ParsedUrl {\r\n\tconst processed = new RegExp(\r\n\t\t'(?:(?<protocol>[\\\\w\\\\d]+)\\\\:\\\\/\\\\/)?(?:(?<user>.+)\\\\@)?(?<host>(?<domain>[^:\\\\/\\\\?#@\\\\n]+)(?:\\\\:(?<port>\\\\d*))?)(?<path>\\\\/.*?)?(?:\\\\?(?<query>.*?))?(?:#(?<fragment>.*?))?$',\r\n\t\t'gm').exec(url);\r\n\tconst groups: ParsedUrl = <any>processed?.groups ?? {};\r\n\tconst domains = groups.domain.split('.');\r\n\tif(groups['port'] != null) groups.port = Number(groups.port);\r\n\tif(domains.length > 2) {\r\n\t\tgroups.domain = domains.splice(-2, 2).join('.');\r\n\t\tgroups.subdomain = domains.join('.');\r\n\t}\r\n\tif(groups.query) {\r\n\t\tconst split = (<any>groups.query).split('&'), query: any = {};\r\n\t\tsplit.forEach((q: any) => {\r\n\t\t\tconst [key, val] = q.split('=');\r\n\t\t\tquery[key] = val;\r\n\t\t});\r\n\t\tgroups.query = query;\r\n\t}\r\n\treturn groups;\r\n}\r\n\r\n\r\n/**\r\n * Create MD5 hash using native javascript\r\n *\r\n * @param d String to hash\r\n * @returns {string} Hashed string\r\n */\r\nexport function md5(d: string) {\r\n\tvar r = M(V(Y(X(d),8*d.length)));return r.toLowerCase()};\r\n\tfunction M(d:any){for(var _,m=\"0123456789ABCDEF\",f=\"\",r=0;r<d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_>>>4&15)+m.charAt(15&_);return f}\r\n\tfunction X(d:any){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<<m%32;return _}\r\n\tfunction V(d:any){for(var _=\"\",m=0;m<32*d.length;m+=8)_+=String.fromCharCode(d[m>>5]>>>m%32&255);return _}\r\n\tfunction Y(d:any,_:any){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n<d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}\r\n\tfunction md5_cmn(d:any,_:any,m:any,f:any,r:any,i:any){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}\r\n\tfunction md5_ff(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(_&m|~_&f,d,_,r,i,n)}\r\n\tfunction md5_gg(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(_&f|m&~f,d,_,r,i,n)}\r\n\tfunction md5_hh(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(_^m^f,d,_,r,i,n)}\r\n\tfunction md5_ii(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(m^(_|~f),d,_,r,i,n)}\r\n\tfunction safe_add(d:any,_:any){var m=(65535&d)+(65535&_);return(d>>16)+(_>>16)+(m>>16)<<16|65535&m}\r\n\tfunction bit_rol(d:any,_:any){return d<<_|d>>>32-_\r\n}\r\n\r\n/**\r\n * Splits a string into logical word segments\r\n */\r\nexport function wordSegments(str?: string): string[] {\r\n\tif (!str) return [];\r\n\treturn str\r\n\t\t.replace(/([a-z])([A-Z])/g, \"$1 $2\")\r\n\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\r\n\t\t.replace(/([0-9]+)([a-zA-Z])/g, \"$1 $2\")\r\n\t\t.replace(/([a-zA-Z])([0-9]+)/g, \"$1 $2\")\r\n\t\t.replace(/[_\\-\\s]+/g, \" \")\r\n\t\t.trim()\r\n\t\t.split(/\\s+/)\r\n\t\t.filter(Boolean);\r\n}\r\n\r\n\r\n/**\r\n * Check if email is valid\r\n *\r\n * @param {string} email - Target\r\n * @returns {boolean} - Follows format\r\n */\r\nexport function validateEmail(email: string) {\r\n\treturn /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(email);\r\n}\r\n","import {makeArray} from './array.ts';\nimport {ASet} from './aset.ts';\nimport {JSONSanitize} from './json.ts';\nimport {dotNotation, flattenObj} from './objects.ts';\nimport {LETTER_LIST} from './string.ts';\n\n/**\n * Parse a CSV string into an array of objects\n *\n * @param csv String with CSV\n * @param hasHeaders First line of CSV contains headers\n * @return {T[]} Array of parsed objects\n */\nexport function fromCsv<T = any>(csv: string, hasHeaders = true): T[] {\n\tfunction parseLine(line: string): (string | null)[] {\n\t\tconst columns: string[] = [];\n\t\tlet current = '', inQuotes = false;\n\t\tfor (let i = 0; i < line.length; i++) {\n\t\t\tconst char = line[i];\n\t\t\tconst nextChar = line[i + 1];\n\t\t\tif (char === '\"') {\n\t\t\t\tif (inQuotes && nextChar === '\"') {\n\t\t\t\t\tcurrent += '\"'; // Handle escaped quotes\n\t\t\t\t\ti++;\n\t\t\t\t} else inQuotes = !inQuotes;\n\t\t\t} else if (char === ',' && !inQuotes) {\n\t\t\t\tcolumns.push(current.trim()); // Trim column values\n\t\t\t\tcurrent = '';\n\t\t\t} else current += char;\n\t\t}\n\t\tcolumns.push(current.trim()); // Trim last column value\n\t\treturn columns.map(col => col.replace(/^\"|\"$/g, '').replace(/\"\"/g, '\"'));\n\t}\n\n\t// Normalize line endings and split rows\n\tconst rows = [];\n\tlet currentRow = '', inQuotes = false;\n\tfor (const char of csv.replace(/\\r\\n/g, '\\n')) { // Normalize \\r\\n to \\n\n\t\tif (char === '\"') inQuotes = !inQuotes;\n\t\tif (char === '\\n' && !inQuotes) {\n\t\t\trows.push(currentRow.trim()); // Trim row\n\t\t\tcurrentRow = '';\n\t\t} else currentRow += char;\n\t}\n\tif (currentRow) rows.push(currentRow.trim()); // Trim last row\n\n\t// Extract headers\n\tlet headers: any = hasHeaders ? rows.splice(0, 1)[0] : null;\n\tif (headers) headers = headers.match(/(?:[^,\"']+|\"(?:[^\"]|\"\")*\"|'(?:[^']|'')*')+/g)?.map((h: any) => h.trim());\n\n\t// Parse rows\n\treturn <T[]>rows.map(r => {\n\t\tconst props = parseLine(r);\n\t\tconst h = headers || (Array(props.length).fill(null).map((_, i) => {\n\t\t\tlet letter = '';\n\t\t\tconst first = i / 26;\n\t\t\tif (first > 1) letter += LETTER_LIST[Math.floor(first - 1)];\n\t\t\tletter += LETTER_LIST[i % 26];\n\t\t\treturn letter;\n\t\t}));\n\t\treturn h.reduce((acc: any, h: any, i: number) => {\n\t\t\tdotNotation(acc, h, props[i]);\n\t\t\treturn acc;\n\t\t}, {});\n\t});\n}\n\n\n/**\n * Convert an array of objects to a CSV string\n *\n * @param {any[]} target Array of objects to create CSV from\n * @param {boolean} flatten Should nested object be flattened or treated as values\n * @return {string} CSV string\n */\nexport function toCsv(target: any, flatten=true) {\n\tconst t = makeArray(target);\n\tconst headers = new ASet(t.reduce((acc, row) => [...acc, ...Object.keys(flatten ? flattenObj(row) : row)], []));\n\treturn [\n\t\theaders.join(','),\n\t\t...t.map(row => headers.map((h: string) => {\n\t\t\tconst value = dotNotation<any>(row, h);\n\t\t\tif(value == null) return '';\n\t\t\tif(typeof value == 'object') return `\"${JSONSanitize(value).replaceAll('\"', '\"\"')}\"`;\n\t\t\tif(typeof value == 'string' && /[\\n\",]/g.test(value)) return `\"${value.replaceAll('\"', '\"\"')}\"`;\n\t\t\treturn value;\n\t\t}).join(','))\n\t].join('\\n');\n}\n","/**\r\n * Like setInterval but will adjust the timeout value to account for runtime\r\n * @param {Function} cb Callback function that will be ran\r\n * @param {number} ms Run function ever x seconds\r\n * @return {() => void}\r\n */\r\nexport function adjustedInterval(cb: Function, ms: number) {\r\n\tlet cancel = false, timeout: any = null;\r\n\tconst p = async () => {\r\n\t\tif (cancel) return;\r\n\t\tconst start = new Date().getTime();\r\n\t\tawait cb();\r\n\t\tconst end = new Date().getTime();\r\n\t\ttimeout = setTimeout(() => p(), ms - (end - start) || 1);\r\n\t};\r\n\tp();\r\n\treturn () => {\r\n\t\tcancel = true;\r\n\t\tif(timeout) clearTimeout(timeout);\r\n\t}\r\n}\r\n\r\nexport function dayOfWeek(d: number): string {\r\n\treturn ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d];\r\n}\r\n\r\nexport function dayOfYear(date: Date): number {\r\n\tconst start = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\r\n\treturn Math.ceil((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\r\n}\r\n\r\n/**\r\n * Format date\r\n *\r\n * Year:\r\n * - YYYY = 2025 (4-digit year)\r\n * - YY = 25 (2-digit year)\r\n *\r\n * Month:\r\n * - MMMM = January (full month name)\r\n * - MMM = Jan (abbreviated month name)\r\n * - MM = 01 (zero-padded month number)\r\n * - M = 1 (month number)\r\n *\r\n * Day:\r\n * - DDD = 123 (day of year)\r\n * - DD = 01 (zero-padded day)\r\n * - Do = 1st (day with ordinal suffix)\r\n * - D = 1 (day number)\r\n * - dddd = Monday (full day name)\r\n * - ddd = Mon (abbreviated day name)\r\n *\r\n * Hour:\r\n * - HH = 13 (24-hour format, zero-padded)\r\n * - H = 13 (24-hour format)\r\n * - hh = 01 (12-hour format, zero-padded)\r\n * - h = 1 (12-hour format)\r\n *\r\n * Minute:\r\n * - mm = 05 (zero-padded minutes)\r\n * - m = 5 (minutes)\r\n *\r\n * Second:\r\n * - ss = 09 (zero-padded seconds)\r\n * - s = 9 (seconds)\r\n *\r\n * Millisecond:\r\n * - SSS = 123 (3-digit milliseconds)\r\n *\r\n * AM/PM:\r\n * - A = AM/PM (uppercase)\r\n * - a = am/pm (lowercase)\r\n *\r\n * Timezone:\r\n * - ZZ = +0500 (timezone offset without colon)\r\n * - Z = +05:00 (timezone offset with colon)\r\n * - z = EST (timezone abbreviation)\r\n *\r\n * @param {string} format How date string will be formatted, default: `YYYY-MM-DD H:mm A`\r\n * @param {Date | number | string} date Date or timestamp, defaults to now\r\n * @param tz Set timezone offset\r\n * @return {string} Formated date\r\n */\r\nexport function formatDate(format: string = 'YYYY-MM-DD H:mm', date: Date | number | string = new Date(), tz: string | number = 'local'): string {\r\n\tif (typeof date === 'number' || typeof date === 'string') date = new Date(date);\r\n\tif (isNaN(date.getTime())) throw new Error('Invalid date input');\r\n\tconst numericTz = typeof tz === 'number';\r\n\tconst localTz = tz === 'local' || (!numericTz && tz.toLowerCase?.() === 'local');\r\n\tconst tzName = localTz ? Intl.DateTimeFormat().resolvedOptions().timeZone : numericTz ? 'UTC' : tz;\r\n\r\n\tif (!numericTz && tzName !== 'UTC') {\r\n\t\ttry {\r\n\t\t\tnew Intl.DateTimeFormat('en-US', { timeZone: tzName }).format();\r\n\t\t} catch {\r\n\t\t\tthrow new Error(`Invalid timezone: ${tzName}`);\r\n\t\t}\r\n\t}\r\n\r\n\tlet zonedDate = new Date(date);\r\n\tlet get: (fn: 'FullYear' | 'Month' | 'Date' | 'Day' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds') => number;\r\n\tconst partsMap: Record<string, string> = {};\r\n\tif (!numericTz && tzName !== 'UTC') {\r\n\t\tconst parts = new Intl.DateTimeFormat('en-US', {\r\n\t\t\ttimeZone: tzName,\r\n\t\t\tyear: 'numeric', month: '2-digit', day: '2-digit', weekday: 'long',\r\n\t\t\thour: '2-digit', minute: '2-digit', second: '2-digit',\r\n\t\t\thour12: false\r\n\t\t}).formatToParts(date);\r\n\t\tparts.forEach(p => {\r\n\t\t\tpartsMap[p.type] = p.value;\r\n\t\t});\r\n\r\n\t\tconst monthValue = parseInt(partsMap.month) - 1;\r\n\t\tconst dayOfWeekValue = new Date(`${partsMap.year}-${partsMap.month}-${partsMap.day}`).getDay();\r\n\t\tconst hourValue = parseInt(partsMap.hour);\r\n\r\n\t\tget = (fn: 'FullYear' | 'Month' | 'Date' | 'Day' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds'): number => {\r\n\t\t\tswitch (fn) {\r\n\t\t\t\tcase 'FullYear': return parseInt(partsMap.year);\r\n\t\t\t\tcase 'Month': return monthValue;\r\n\t\t\t\tcase 'Date': return parseInt(partsMap.day);\r\n\t\t\t\tcase 'Day': return dayOfWeekValue;\r\n\t\t\t\tcase 'Hours': return hourValue;\r\n\t\t\t\tcase 'Minutes': return parseInt(partsMap.minute);\r\n\t\t\t\tcase 'Seconds': return parseInt(partsMap.second);\r\n\t\t\t\tdefault: return 0;\r\n\t\t\t}\r\n\t\t};\r\n\t} else {\r\n\t\tconst offset = numericTz ? tz as number : 0;\r\n\t\tzonedDate = new Date(date.getTime() + offset * 60 * 60 * 1000);\r\n\t\tget = (fn: 'FullYear' | 'Month' | 'Date' | 'Day' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds'): number => zonedDate[`getUTC${fn}`]();\r\n\t}\r\n\r\n\tfunction numSuffix(n: number): string {\r\n\t\tconst s = [\"th\", \"st\", \"nd\", \"rd\"];\r\n\t\tconst v = n % 100;\r\n\t\treturn n + (s[(v - 20) % 10] || s[v] || s[0]);\r\n\t}\r\n\r\n\tfunction getTZOffset(): string {\r\n\t\tif (numericTz) {\r\n\t\t\tconst total = (tz as number) * 60;\r\n\t\t\tconst hours = Math.floor(Math.abs(total) / 60);\r\n\t\t\tconst mins = Math.abs(total) % 60;\r\n\t\t\treturn `${tz >= 0 ? '+' : '-'}${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst offset = new Intl.DateTimeFormat('en-US', {timeZone: tzName, timeZoneName: 'longOffset', hour: '2-digit', minute: '2-digit',})\r\n\t\t\t\t.formatToParts(<Date>date).find(p => p.type === 'timeZoneName')?.value.match(/([+-]\\d{2}:\\d{2})/)?.[1];\r\n\t\t\tif (offset) return offset;\r\n\t\t} catch {}\r\n\t\treturn '+00:00';\r\n\t}\r\n\r\n\tfunction getTZAbbr(): string {\r\n\t\tif (numericTz && tz === 0) return 'UTC';\r\n\t\ttry {\r\n\t\t\treturn new Intl.DateTimeFormat('en-US', { timeZone: tzName, timeZoneName: 'short' })\r\n\t\t\t\t.formatToParts(<Date>date).find(p => p.type === 'timeZoneName')?.value || '';\r\n\t\t} catch {\r\n\t\t\treturn tzName;\r\n\t\t}\r\n\t}\r\n\r\n\tconst tokens: Record<string, string> = {\r\n\t\tYYYY: get('FullYear').toString(),\r\n\t\tYY: get('FullYear').toString().slice(2),\r\n\t\tMMMM: month(get('Month')),\r\n\t\tMMM: month(get('Month')).slice(0, 3),\r\n\t\tMM: (get('Month') + 1).toString().padStart(2, '0'),\r\n\t\tM: (get('Month') + 1).toString(),\r\n\t\tDDD: dayOfYear(zonedDate).toString(),\r\n\t\tDD: get('Date').toString().padStart(2, '0'),\r\n\t\tDo: numSuffix(get('Date')),\r\n\t\tD: get('Date').toString(),\r\n\t\tdddd: dayOfWeek(get('Day')),\r\n\t\tddd: dayOfWeek(get('Day')).slice(0, 3),\r\n\t\tHH: get('Hours').toString().padStart(2, '0'),\r\n\t\tH: get('Hours').toString(),\r\n\t\thh: (get('Hours') % 12 || 12).toString().padStart(2, '0'),\r\n\t\th: (get('Hours') % 12 || 12).toString(),\r\n\t\tmm: get('Minutes').toString().padStart(2, '0'),\r\n\t\tm: get('Minutes').toString(),\r\n\t\tss: get('Seconds').toString().padStart(2, '0'),\r\n\t\ts: get('Seconds').toString(),\r\n\t\tSSS: (zonedDate[`getUTC${'Milliseconds'}`]()).toString().padStart(3, '0'),\r\n\t\tA: get('Hours') >= 12 ? 'PM' : 'AM',\r\n\t\ta: get('Hours') >= 12 ? 'pm' : 'am',\r\n\t\tZZ: getTZOffset().replace(':', ''),\r\n\t\tZ: getTZOffset(),\r\n\t\tz: getTZAbbr(),\r\n\t};\r\n\r\n\treturn format.replace(/YYYY|YY|MMMM|MMM|MM|M|DDD|DD|Do|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|SSS|A|a|ZZ|Z|z/g, token => tokens[token]);\r\n}\r\n\r\n/**\r\n * Run a function immediately & repeat every x ms\r\n *\r\n * @param {() => any} fn Callback function\r\n * @param {number} interval Repeat in ms\r\n * @return {number} Clear Interval ID\r\n */\r\nexport function instantInterval(fn: () => any, interval: number) {\r\n\tfn();\r\n\treturn setInterval(fn, interval);\r\n}\r\n\r\nexport function month(m: number): string {\r\n\treturn ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][m];\r\n}\r\n\r\n/**\r\n * Use in conjunction with `await` to pause an async script\r\n *\r\n * @example\r\n * ```js\r\n * await sleep(1000) // Pause for 1 second\r\n * ```\r\n *\r\n * @param {number} ms - Time to pause for in milliseconds\r\n * @returns {Promise<unknown>} - Resolves promise when it's time to resume\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n\treturn new Promise(res => setTimeout(res, ms));\r\n}\r\n\r\n/**\r\n * Sleep while function returns true\r\n *\r\n * @example\r\n * ```js\r\n * let loading = true;\r\n * setTimeout(() => wait = false, 1000);\r\n * await sleepWhile(() => loading); // Won't continue until loading flag is false\r\n * ```\r\n *\r\n * @param {() => boolean | Promise<boolean>} fn Return true to continue\r\n * @param {number} checkInterval Run function ever x milliseconds\r\n * @return {Promise<void>} Callback when sleep is over\r\n */\r\nexport async function sleepWhile(fn : () => boolean | Promise<boolean>, checkInterval = 100): Promise<void> {\r\n\twhile(await fn()) await sleep(checkInterval);\r\n}\r\n\r\n/**\r\n * Calculate the number of milliseconds until date/time\r\n *\r\n * @param {Date | number} date - Target\r\n * @returns {number} - Number of milliseconds until target\r\n */\r\nexport function timeUntil(date: Date | number): number {\r\n\treturn (date instanceof Date ? date.getTime() : date) - (new Date()).getTime();\r\n}\r\n\r\n\r\n/**\r\n * Convert a timezone string (e.g., \"America/Toronto\") to its current UTC offset in minutes.\r\n * @param {string} tz - Timezone string, e.g. \"America/Toronto\"\r\n * @param {Date} [date=new Date()] - The date for which you want the offset (default is now)\r\n * @returns {number} - Offset in minutes (e.g., -240)\r\n */\r\nexport function timezoneOffset(tz: string, date: Date = new Date()): number {\r\n\tconst dtf = new Intl.DateTimeFormat('en-US', {\r\n\t\ttimeZone: tz,\r\n\t\thour12: false,\r\n\t\tyear: 'numeric',\r\n\t\tmonth: '2-digit',\r\n\t\tday: '2-digit',\r\n\t\thour: '2-digit',\r\n\t\tminute: '2-digit',\r\n\t\tsecond: '2-digit',\r\n\t});\r\n\tconst parts = dtf.formatToParts(date);\r\n\tconst get = (type: string) => Number(parts.find(v => v.type === type)?.value);\r\n\tconst y = get('year');\r\n\tconst mo = get('month');\r\n\tconst d = get('day');\r\n\tconst h = get('hour');\r\n\tconst m = get('minute');\r\n\tconst s = get('second');\r\n\r\n\tconst asUTC = Date.UTC(y, mo - 1, d, h, m, s);\r\n\tconst asLocal = date.getTime();\r\n\treturn Math.round((asLocal - asUTC) / 60000);\r\n}\r\n","import {findByProp} from './array.ts';\nimport {ASet} from './aset.ts';\nimport {sleepWhile} from './time.ts';\n\nexport type TableOptions = {\n\tname: string;\n\tkey?: string;\n\tautoIncrement?: boolean;\n};\n\nclass AsyncLock {\n\tprivate p = Promise.resolve();\n\trun<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst res = this.p.then(fn, fn);\n\t\tthis.p = res.then(() => {}, () => {});\n\t\treturn res;\n\t}\n}\n\nexport class Database {\n\tprivate schemaLock = new AsyncLock();\n\tprivate upgrading = false;\n\n\tconnection!: Promise<IDBDatabase>;\n\ttables!: TableOptions[];\n\n\tget ready() { return !this.upgrading; }\n\n\tconstructor(public readonly database: string, tables?: (string | TableOptions)[], public version?: number) {\n\t\tthis.connection = new Promise((resolve, reject) => {\n\t\t\tlet req: IDBOpenDBRequest;\n\t\t\ttry { req = indexedDB.open(this.database, this.version); }\n\t\t\tcatch (err) { return reject(err); }\n\n\t\t\tthis.tables = !tables ? [] : tables.map(t => {\n\t\t\t\tt = typeof t == 'object' ? t : {name: t};\n\t\t\t\treturn {...t, name: t.name.toString()};\n\t\t\t});\n\n\t\t\treq.onerror = () => reject(req.error);\n\n\t\t\treq.onsuccess = () => {\n\t\t\t\tlet db: IDBDatabase;\n\t\t\t\ttry { db = req.result; }\n\t\t\t\tcatch (err) { return reject(err); }\n\n\t\t\t\tconst existing = Array.from(db.objectStoreNames);\n\t\t\t\tif(!tables) {\n\t\t\t\t\tthis.tables = existing.map(t => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = db.transaction(t, 'readonly');\n\t\t\t\t\t\t\tconst store = tx.objectStore(t);\n\t\t\t\t\t\t\treturn {name: t, key: <string>store.keyPath};\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn {name: t}; // 🛡️ fallback\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst desired = new ASet((tables || []).map(t => typeof t == 'string' ? t : t.name));\n\t\t\t\tif(tables && desired.symmetricDifference(new ASet(existing)).length) {\n\t\t\t\t\tdb.close();\n\t\t\t\t\tObject.assign(this, new Database(this.database, this.tables, db.version + 1));\n\t\t\t\t\tthis.connection.then(resolve);\n\t\t\t\t} else {\n\t\t\t\t\tthis.version = db.version;\n\t\t\t\t\tresolve(db);\n\t\t\t\t}\n\t\t\t\tthis.upgrading = false;\n\t\t\t};\n\n\t\t\treq.onupgradeneeded = () => {\n\t\t\t\tthis.upgrading = true;\n\t\t\t\tlet db: IDBDatabase;\n\t\t\t\ttry { db = req.result; }\n\t\t\t\tcatch { return; }\n\t\t\t\ttry {\n\t\t\t\t\tconst existingTables = new ASet(Array.from(db.objectStoreNames));\n\t\t\t\t\tif(tables) {\n\t\t\t\t\t\tconst desired = new ASet((tables || []).map(t => typeof t == 'string' ? t : t.name));\n\t\t\t\t\t\texistingTables.difference(desired).forEach(name => db.deleteObjectStore(name));\n\t\t\t\t\t\tdesired.difference(existingTables).forEach(name => {\n\t\t\t\t\t\t\tconst t = this.tables.find(findByProp('name', name));\n\t\t\t\t\t\t\tdb.createObjectStore(name, {\n\t\t\t\t\t\t\t\tkeyPath: t?.key,\n\t\t\t\t\t\t\t\tautoIncrement: t?.autoIncrement || !t?.key,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch { }\n\t\t\t};\n\t\t});\n\t}\n\n\twaitForUpgrade = () => sleepWhile(() => this.upgrading);\n\n\tasync createTable<K extends IDBValidKey = any, T = any>(table: string | TableOptions): Promise<Table<K, T>> {\n\t\treturn this.schemaLock.run(async () => {\n\t\t\tif(typeof table == 'string') table = { name: table };\n\t\t\tconst conn = await this.connection;\n\t\t\tif(!this.includes(table.name)) {\n\t\t\t\tconst newDb = new Database(this.database, [...this.tables, table], (this.version ?? 0) + 1);\n\t\t\t\tconn.close();\n\t\t\t\tthis.connection = newDb.connection;\n\t\t\t\tawait this.connection;\n\t\t\t\tObject.assign(this, newDb);\n\t\t\t}\n\t\t\treturn this.table<K, T>(table.name);\n\t\t});\n\t}\n\n\tasync deleteTable(table: string | TableOptions): Promise<void> {\n\t\treturn this.schemaLock.run(async () => {\n\t\t\tif(typeof table == 'string') table = { name: table };\n\t\t\tif(!this.includes(table.name)) return;\n\t\t\tconst conn = await this.connection;\n\t\t\tconst newDb = new Database(this.database, this.tables.filter(t => t.name != (<TableOptions>table).name), (this.version ?? 0) + 1);\n\t\t\tconn.close();\n\t\t\tthis.connection = newDb.connection;\n\t\t\tawait this.connection;\n\t\t\tObject.assign(this, newDb);\n\t\t});\n\t}\n\n\tincludes(name: any): boolean {\n\t\treturn !!this.tables.find(t => t.name == (typeof name == 'object' ? name.name : name.toString()));\n\t}\n\n\ttable<K extends IDBValidKey = any, T = any>(name: any): Table<K, T> {\n\t\treturn new Table<K, T>(this, name.toString());\n\t}\n}\n\nexport class Table<K extends IDBValidKey = any, T = any> {\n\tconstructor(private readonly database: Database, public readonly name: string, public readonly key: keyof T | string = 'id') {\n\t\tthis.database.connection.then(() => {\n\t\t\tconst exists = !!this.database.tables.find(findByProp('name', this.name));\n\t\t\tif(!exists) this.database.createTable(this.name);\n\t\t});\n\t}\n\n\tasync tx<R>(table: string, fn: (store: IDBObjectStore) => IDBRequest, readonly = false): Promise<R> {\n\t\tawait this.database.waitForUpgrade();\n\t\tconst db = await this.database.connection;\n\t\tconst tx = db.transaction(table, readonly ? 'readonly' : 'readwrite');\n\t\treturn new Promise<R>((resolve, reject) => {\n\t\t\tconst request = fn(tx.objectStore(table));\n\t\t\trequest.onsuccess = () => resolve(request.result as R);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t});\n\t}\n\n\tadd(value: T, key?: K): Promise<void> {\n\t\treturn this.tx(this.name, store => store.add(value, key));\n\t}\n\n\tall = this.getAll;\n\n\tclear(): Promise<void> {\n\t\treturn this.tx(this.name, store => store.clear());\n\t}\n\n\tcount(): Promise<number> {\n\t\treturn this.tx(this.name, store => store.count(), true);\n\t}\n\n\tcreate = this.add;\n\n\tdelete(key: K): Promise<void> {\n\t\treturn this.tx(this.name, store => store.delete(key));\n\t}\n\n\tget(key: K): Promise<T> {\n\t\treturn this.tx(this.name, store => store.get(key), true);\n\t}\n\n\tgetAll(): Promise<T[]> {\n\t\treturn this.tx(this.name, store => store.getAll(), true);\n\t}\n\n\tgetAllKeys(): Promise<K[]> {\n\t\treturn this.tx(this.name, store => store.getAllKeys(), true);\n\t}\n\n\tput(value: T, key?: string): Promise<void> {\n\t\treturn this.tx(this.name, store => {\n\t\t\tif(store.keyPath) return store.put(value);\n\t\t\treturn store.put(value, key);\n\t\t});\n\t}\n\n\tread(): Promise<T[]>;\n\tread(key: K): Promise<T>;\n\tread(key?: K): Promise<T | T[]> {\n\t\treturn key ? this.get(key) : this.getAll();\n\t}\n\n\tset(value: T, key?: K): Promise<void> {\n\t\tif(key) (<any>value)[this.key] = key;\n\t\tif(!(<any>value)[this.key]) return this.add(value);\n\t\treturn this.put(value);\n\t}\n\n\tupdate = this.set;\n}\n","export type ProgressCallback = (progress: number) => any;\n\n/**\n * A promise that fires the `onProgress` callback on incremental progress\n *\n * @example\n * ```js\n * const promise = new Promise((resolve, reject, progress) => {\n * const max = 10;\n * \t for(let i = 0; i < max; i++) progress(i / max);\n * \t resolve(1);\n * });\n *\n * console.log(promise.progress);\n *\n * promise.onProgress(console.log)\n * .then(console.log)\n * .catch(console.error)\n * .finally(...);\n *\n * ```\n */\nexport class PromiseProgress<T> extends Promise<T> {\n\tprivate listeners: ProgressCallback[] = [];\n\n\tprivate _progress = 0;\n\tget progress() { return this._progress; }\n\tset progress(p: number) {\n\t\tif(p == this._progress) return;\n\t\tthis._progress = p;\n\t\tthis.listeners.forEach(l => l(p));\n\t}\n\n\tconstructor(executor: (resolve: (value: T) => any, reject: (reason: any) => void, progress: (progress: number) => any) => void) {\n\t\tsuper((resolve, reject) => executor(\n\t\t\t(value: T) => resolve(value),\n\t\t\t(reason: any) => reject(reason),\n\t\t\t(progress: number) => this.progress = progress,\n\t\t));\n\t}\n\n\tstatic from<T>(promise: Promise<T>): PromiseProgress<T> {\n\t\tif(promise instanceof PromiseProgress) return promise;\n\t\treturn new PromiseProgress<T>((res, rej) => promise\n\t\t\t.then((...args) => res(...args))\n\t\t\t.catch((...args) => rej(...args)));\n\t}\n\n\tprivate from(promise: Promise<T>): PromiseProgress<T> {\n\t\tconst newPromise = PromiseProgress.from(promise);\n\t\tthis.onProgress(p => newPromise.progress = p);\n\t\treturn newPromise;\n\t}\n\n\tonProgress(callback: ProgressCallback) {\n\t\tthis.listeners.push(callback);\n\t\treturn this;\n\t}\n\n\tthen(res?: (v: T) => any, rej?: (err: any) => any): PromiseProgress<any> {\n\t\tconst resp = super.then(res, rej);\n\t\treturn this.from(resp);\n\t}\n\n\tcatch(rej?: (err: any) => any): PromiseProgress<any> {\n\t\treturn this.from(super.catch(rej));\n\t}\n\n\tfinally(res?: () => any): PromiseProgress<any> {\n\t\treturn this.from(super.finally(res));\n\t}\n}\n","import {makeArray} from './array.ts';\nimport {JSONAttemptParse} from './json.ts';\nimport {PromiseProgress} from './promise-progress';\nimport {formatDate} from './time.ts';\n\n/**\n * Download blob as a file\n *\n * @param {Blob} blob File as a blob\n * @param {string} name Name blob will be downloaded as\n */\nexport function downloadFile(blob: Blob | string | string[], name: string) {\n\tif(!(blob instanceof Blob)) blob = new Blob(makeArray(blob));\n\tconst url = URL.createObjectURL(blob);\n\tdownloadUrl(url, name);\n\tURL.revokeObjectURL(url);\n}\n\n/**\n * Download a file from a URL\n *\n * @param href URL that will be downloaded\n * @param {string} name Override download name\n */\nexport function downloadUrl(href: any, name?: string) {\n\tconst a = document.createElement('a');\n\ta.href = href;\n\ta.download = name || href.split('/').pop();\n\tdocument.body.appendChild(a);\n\ta.click();\n\tdocument.body.removeChild(a);\n}\n\n/**\n * Open filebrowser & return selected file\n *\n * @param {{accept?: string, multiple?: boolean}} options accept - selectable mimetypes, multiple - Allow selecting more than 1 file\n * @return {Promise<File[]>} Array of selected files\n */\nexport function fileBrowser(options: {accept?: string, multiple?: boolean} = {}): Promise<File[]> {\n\treturn new Promise(res => {\n\t\tconst input = document.createElement('input');\n\t\tinput.type = 'file';\n\t\tinput.accept = options.accept || '*';\n\t\tinput.style.display='none';\n\t\tinput.multiple = !!options.multiple;\n\t\tinput.onblur = input.onchange = async () => {\n\t\t\tres(Array.from(<any>input.files));\n\t\t\tinput.remove();\n\t\t}\n\t\tdocument.body.appendChild(input);\n\t\tinput.click();\n\t});\n}\n\n/**\n * Extract text from a file\n *\n * @param file File to extract text from\n * @return {Promise<string | null>} File contents\n */\nexport function fileText(file: any): Promise<string | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(<string>reader.result);\n\t\treader.onerror = () => reject(reader.error);\n\t\treader.readAsText(file);\n\t});\n}\n\n/**\n * Create timestamp intended for filenames from a date\n *\n * @param {string} name Name of file, `{{TIMESTAMP}}` will be replaced\n * @param {Date | number | string} date Date to use for timestamp\n * @return {string} Interpolated filename, or the raw timestamp if name was omitted\n */\nexport function timestampFilename(name?: string, date: Date | number | string = new Date()) {\n\tif(typeof date == 'number' || typeof date == 'string') date = new Date(date);\n\tconst timestamp = formatDate('YYYY-MM-DD_HH-mm', date);\n\treturn name ? name.replace('{{TIMESTAMP}}', timestamp) : timestamp;\n}\n\n/**\n * Upload file to URL with progress callback using PromiseProgress\n *\n * @param {{url: string, files: File[], headers?: {[p: string]: string}, withCredentials?: boolean}} options\n * @return {PromiseProgress<T>} Promise of request with `onProgress` callback\n */\nexport function uploadWithProgress<T>(options: {\n\turl: string;\n\tfiles: File[];\n\theaders?: {[key: string]: string};\n\twithCredentials?: boolean;\n}): PromiseProgress<T> {\n\treturn new PromiseProgress<T>((res, rej, prog) => {\n\t\tconst xhr = new XMLHttpRequest();\n\t\tconst formData = new FormData();\n\t\toptions.files.forEach(f => formData.append('file', f));\n\n\t\txhr.withCredentials = !!options.withCredentials;\n\t\txhr.upload.addEventListener('progress', (event) => event.lengthComputable ? prog(event.loaded / event.total) : null);\n\t\txhr.addEventListener('loadend', () => res(<T>JSONAttemptParse(xhr.responseText)));\n\t\txhr.addEventListener('error', () => rej(JSONAttemptParse(xhr.responseText)));\n\t\txhr.addEventListener('timeout', () => rej({error: 'Request timed out'}));\n\n\t\txhr.open('POST', options.url);\n\t\tObject.entries(options.headers || {}).forEach(([key, value]) => xhr.setRequestHeader(key, value));\n\t\txhr.send(formData);\n\t});\n}\n","export type TypedListener = (...args: any[]) => any;\r\nexport type TypedEvents = {[k in string | symbol]: TypedListener} & {'*': (event: string, ...args: any[]) => any};\r\n\r\nexport type NamespaceEvents<Namespace extends string, Events extends TypedEvents> = {\r\n\t[K in keyof Events as `${Namespace}:${Extract<K, string>}`]: Events[K];\r\n};\r\n\r\nexport class TypedEmitter<T extends TypedEvents = TypedEvents> {\r\n\tprivate static listeners: {[key: string]: TypedListener[]} = {};\r\n\r\n\tprivate listeners: { [key in keyof T]?: TypedListener[] } = {};\r\n\r\n\tstatic emit(event: any, ...args: any[]) {\r\n\t\t(this.listeners['*'] || []).forEach(l => l(event, ...args));\r\n\t\t(this.listeners[event.toString()] || []).forEach(l => l(...args));\r\n\t};\r\n\r\n\tstatic off(event: any, listener: TypedListener) {\r\n\t\tconst e = event.toString();\r\n\t\tthis.listeners[e] = (this.listeners[e] || []).filter(l => l != listener);\r\n\t}\r\n\r\n\tstatic on(event: any, listener: TypedListener) {\r\n\t\tconst e = event.toString();\r\n\t\tif(!this.listeners[e]) this.listeners[e] = [];\r\n\t\tthis.listeners[e]?.push(listener);\r\n\t\treturn () => this.off(event, listener);\r\n\t}\r\n\r\n\tstatic once(event: any, listener?: TypedListener): Promise<any> {\r\n\t\treturn new Promise(res => {\r\n\t\t\tconst unsubscribe = this.on(event, <any>((...args: any) => {\r\n\t\t\t\tres(args.length == 1 ? args[0] : args);\r\n\t\t\t\tif(listener) listener(...args);\r\n\t\t\t\tunsubscribe();\r\n\t\t\t}));\r\n\t\t});\r\n\t}\r\n\r\n\temit<K extends keyof T>(event: K, ...args: Parameters<T[K]>) {\r\n\t\t(this.listeners['*'] || []).forEach(l => l(event, ...args));\r\n\t\t(this.listeners[event] || []).forEach(l => l(...args));\r\n\t};\r\n\r\n\toff<K extends keyof T = string>(event: K, listener: T[K]) {\r\n\t\tthis.listeners[event] = (this.listeners[event] || []).filter(l => l != listener);\r\n\t}\r\n\r\n\ton<K extends keyof T = string>(event: K, listener: T[K]) {\r\n\t\tif(!this.listeners[event]) this.listeners[event] = [];\r\n\t\tthis.listeners[event]?.push(listener);\r\n\t\treturn () => this.off(event, listener);\r\n\t}\r\n\r\n\tonce<K extends keyof T = string>(event: K, listener?: T[K]): Promise<any> {\r\n\t\treturn new Promise(res => {\r\n\t\t\tconst unsubscribe = this.on(event, <any>((...args: any) => {\r\n\t\t\t\tres(args.length == 1 ? args[0] : args);\r\n\t\t\t\tif(listener) listener(...args);\r\n\t\t\t\tunsubscribe();\r\n\t\t\t}));\r\n\t\t});\r\n\t}\r\n}\r\n","export class CustomError extends Error {\r\n\tstatic code = 500;\r\n\r\n\tprivate _code?: number;\r\n\tget code(): number { return this._code || (<any>this).constructor.code; }\r\n\tset code(c: number) { this._code = c; }\r\n\r\n\tconstructor(message?: string, code?: number) {\r\n\t\tsuper(message);\r\n\t\tif(code != null) this._code = code;\r\n\t}\r\n\r\n\tstatic from(err: Error): CustomError {\r\n\t\tconst code = Number((<any>err).statusCode) ?? Number((<any>err).code);\r\n\t\tconst newErr = new this(err.message || err.toString());\r\n\t\treturn Object.assign(newErr, {\r\n\t\t\tstack: err.stack,\r\n\t\t\t...err,\r\n\t\t\tcode: code ?? undefined\r\n\t\t});\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code != undefined;\r\n\t}\r\n\r\n\ttoString() {\r\n\t\treturn this.message || super.toString();\r\n\t}\r\n}\r\n\r\nexport class BadRequestError extends CustomError {\r\n\tstatic code = 400;\r\n\r\n\tconstructor(message: string = 'Bad Request') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class UnauthorizedError extends CustomError {\r\n\tstatic code = 401;\r\n\r\n\tconstructor(message: string = 'Unauthorized') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class PaymentRequiredError extends CustomError {\r\n\tstatic code = 402;\r\n\r\n\tconstructor(message: string = 'Payment Required') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class ForbiddenError extends CustomError {\r\n\tstatic code = 403;\r\n\r\n\tconstructor(message: string = 'Forbidden') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class NotFoundError extends CustomError {\r\n\tstatic code = 404;\r\n\r\n\tconstructor(message: string = 'Not Found') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class MethodNotAllowedError extends CustomError {\r\n\tstatic code = 405;\r\n\r\n\tconstructor(message: string = 'Method Not Allowed') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class NotAcceptableError extends CustomError {\r\n\tstatic code = 406;\r\n\r\n\tconstructor(message: string = 'Not Acceptable') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class InternalServerError extends CustomError {\r\n\tstatic code = 500;\r\n\r\n\tconstructor(message: string = 'Internal Server Error') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class NotImplementedError extends CustomError {\r\n\tstatic code = 501;\r\n\r\n\tconstructor(message: string = 'Not Implemented') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class BadGatewayError extends CustomError {\r\n\tstatic code = 502;\r\n\r\n\tconstructor(message: string = 'Bad Gateway') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class ServiceUnavailableError extends CustomError {\r\n\tstatic code = 503;\r\n\r\n\tconstructor(message: string = 'Service Unavailable') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class GatewayTimeoutError extends CustomError {\r\n\tstatic code = 504;\r\n\r\n\tconstructor(message: string = 'Gateway Timeout') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\n/**\r\n * Create the correct error object from a status code\r\n * @param {number} code Will be converted to respective error (ex. 404 -> NotFoundError)\r\n * @param {string} message Override default error message\r\n * @return {CustomError} The proper error type\r\n */\r\nexport function errorFromCode(code: number, message?: string) {\r\n\tswitch(code) {\r\n\t\tcase 400:\r\n\t\t\treturn new BadRequestError(message);\r\n\t\tcase 401:\r\n\t\t\treturn new UnauthorizedError(message);\r\n\t\tcase 402:\r\n\t\t\treturn new PaymentRequiredError(message);\r\n\t\tcase 403:\r\n\t\t\treturn new ForbiddenError(message);\r\n\t\tcase 404:\r\n\t\t\treturn new NotFoundError(message);\r\n\t\tcase 405:\r\n\t\t\treturn new MethodNotAllowedError(message);\r\n\t\tcase 406:\r\n\t\t\treturn new NotAcceptableError(message);\r\n\t\tcase 500:\r\n\t\t\treturn new InternalServerError(message);\r\n\t\tcase 501:\r\n\t\t\treturn new NotImplementedError(message);\r\n\t\tcase 502:\r\n\t\t\treturn new BadGatewayError(message);\r\n\t\tcase 503:\r\n\t\t\treturn new ServiceUnavailableError(message);\r\n\t\tcase 504:\r\n\t\t\treturn new GatewayTimeoutError(message);\r\n\t\tdefault:\r\n\t\t\treturn new CustomError(message, code);\r\n\t}\r\n}\r\n","import {clean} from './objects';\nimport {PromiseProgress} from './promise-progress';\n\nexport type DecodedResponse<T> = Response & {data: T | null}\n\nexport type HttpInterceptor = (response: Response, next: () => void) => void;\n\nexport type HttpRequestOptions = {\n\tbody?: any;\n\tdecode?: boolean;\n\tfragment?: string;\n\theaders?: {[key: string | symbol]: string | null | undefined};\n\tmethod?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n\tquery?: {key: string, value: string}[] | {[key: string]: string};\n\turl?: string;\n\t[key: string]: any;\n}\n\nexport type HttpDefaults = {\n\theaders?: {[key: string | symbol]: string | null | undefined};\n\tinterceptors?: HttpInterceptor[];\n\turl?: string;\n}\n\nclass HttpResponse<T = any> extends Response {\n\tdata?: T\n\tok!: boolean;\n\tredirected!: boolean;\n\ttype!: ResponseType;\n\turl!: string;\n\n\tconstructor(resp: Response, stream: ReadableStream) {\n\t\tconst body = [204, 205, 304].includes(resp.status) ? null : stream;\n\t\tsuper(body, {\n\t\t\theaders: resp.headers,\n\t\t\tstatus: resp.status,\n\t\t\tstatusText: resp.statusText,\n\t\t});\n\n\t\tthis.ok = resp.ok;\n\t\tthis.redirected = resp.redirected;\n\t\tthis.type = resp.type;\n\t\tthis.url = resp.url;\n\t}\n}\n\nexport class Http {\n\tprivate static interceptors: {[key: string]: HttpInterceptor} = {};\n\n\tstatic headers: {[key: string]: string | null | undefined} = {};\n\n\tprivate interceptors: {[key: string]: HttpInterceptor} = {}\n\n\theaders: {[key: string]: string | null | undefined} = {}\n\turl!: string | null;\n\n\tconstructor(defaults: HttpDefaults = {}) {\n\t\tthis.url = defaults.url ?? null;\n\t\tthis.headers = defaults.headers || {};\n\t\tif(defaults.interceptors) {\n\t\t\tdefaults.interceptors.forEach(i => Http.addInterceptor(i));\n\t\t}\n\t}\n\n\tstatic addInterceptor(fn: HttpInterceptor): () => void {\n\t\tconst key = Object.keys(Http.interceptors).length.toString();\n\t\tHttp.interceptors[key] = fn;\n\t\treturn () => { Http.interceptors[key] = <any>null; }\n\t}\n\n\taddInterceptor(fn: HttpInterceptor): () => void {\n\t\tconst key = Object.keys(this.interceptors).length.toString();\n\t\tthis.interceptors[key] = fn;\n\t\treturn () => { this.interceptors[key] = <any>null; }\n\t}\n\n\trequest<T>(opts: HttpRequestOptions = {}): PromiseProgress<DecodedResponse<T>> {\n\t\tif(!this.url && !opts.url) throw new Error('URL needs to be set');\n\t\tlet url = opts.url?.startsWith('http') ? opts.url : (this.url || '') + (opts.url || '');\n\t\turl = url.replaceAll(/([^:]\\/)\\/+/g, '$1');\n\t\tif(opts.fragment) url.includes('#') ? url.replace(/#.*([?\\n])/g, (match, arg1) => `#${opts.fragment}${arg1}`) : `${url}#${opts.fragment}`;\n\t\tif(opts.query) {\n\t\t\tconst q = Array.isArray(opts.query) ? opts.query :\n\t\t\t\tObject.keys(opts.query).map(k => ({key: k, value: (<any>opts.query)[k]}))\n\t\t\turl += (url.includes('?') ? '&' : '?') + q.map(q => `${q.key}=${q.value}`).join('&');\n\t\t}\n\n\t\t// Prep headers\n\t\tconst headers = <any>clean({\n\t\t\t'Content-Type': !opts.body ? undefined : (opts.body instanceof FormData ? 'multipart/form-data' : 'application/json'),\n\t\t\t...Http.headers,\n\t\t\t...this.headers,\n\t\t\t...opts.headers\n\t\t});\n\n\t\tif(typeof opts.body == 'object' && opts.body != null && headers['Content-Type'] == 'application/json')\n\t\t\topts.body = JSON.stringify(opts.body);\n\n\t\t// Send request\n\t\treturn new PromiseProgress((res, rej, prog) => {\n\t\t\ttry {\n\t\t\t\tfetch(url, {\n\t\t\t\t\theaders,\n\t\t\t\t\tmethod: opts.method || (opts.body ? 'POST' : 'GET'),\n\t\t\t\t\tbody: opts.body\n\t\t\t\t}).then(async (resp: any) => {\n\t\t\t\t\tfor(let fn of [...Object.values(Http.interceptors), ...Object.values(this.interceptors)]) {\n\t\t\t\t\t\tawait new Promise<void>(res => fn(resp, () => res()));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst contentLength = resp.headers.get('Content-Length');\n\t\t\t\t\tconst total = contentLength ? parseInt(contentLength, 10) : 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\tconst reader = resp.body?.getReader();\n\t\t\t\t\tconst stream = new ReadableStream({\n\t\t\t\t\t\tstart(controller) {\n\t\t\t\t\t\t\tfunction push() {\n\t\t\t\t\t\t\t\treader?.read().then((event: any) => {\n\t\t\t\t\t\t\t\t\tif(event.done) return controller.close();\n\t\t\t\t\t\t\t\t\tloaded += event.value.byteLength;\n\t\t\t\t\t\t\t\t\tprog(loaded / total);\n\t\t\t\t\t\t\t\t\tcontroller.enqueue(event.value);\n\t\t\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t\t\t}).catch((error: any) => controller.error(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tresp = new HttpResponse<T>(resp, stream);\n\t\t\t\t\tif(opts.decode !== false) {\n\t\t\t\t\t\tconst content = resp.headers.get('Content-Type')?.toLowerCase();\n\t\t\t\t\t\tif(content?.includes('form')) resp.data = <T>await resp.formData();\n\t\t\t\t\t\telse if(content?.includes('json')) resp.data = <T>await resp.json();\n\t\t\t\t\t\telse if(content?.includes('text')) resp.data = <T>await resp.text();\n\t\t\t\t\t\telse if(content?.includes('application')) resp.data = <T>await resp.blob();\n\t\t\t\t\t}\n\n\t\t\t\t\tif(resp.ok) res(resp);\n\t\t\t\t\telse rej(resp);\n\t\t\t\t}).catch(err => rej(err));\n\t\t\t} catch(err) {\n\t\t\t\trej(err);\n\t\t\t}\n\t\t});\n\t}\n}\n","import {JSONAttemptParse} from './json.ts';\n\n/**\n * Creates a JSON Web Token (JWT) using the provided payload.\n *\n * @param {object} payload The payload to include in the JWT.\n * @param signature Add a JWT signature\n * @return {string} The generated JWT string.\n */\nexport function createJwt(payload: object, signature = 'unsigned'): string {\n\tconst header = Buffer.from(JSON.stringify({ alg: \"HS256\", typ: \"JWT\" }))\n\t\t.toString('base64url');\n\tconst body = Buffer.from(JSON.stringify(payload))\n\t\t.toString('base64url');\n\t// Signature is irrelevant for decodeJwt\n\treturn `${header}.${body}.${signature}`;\n}\n\n/**\n * Decode a JSON Web Token (JWT) payload, this will not check for tampering so be careful\n *\n * @param {string} token JWT to decode\n * @return {unknown} JWT payload\n */\nexport function decodeJwt<T>(token: string): T {\n\tconst base64 = token.split('.')[1]\n\t\t.replace(/-/g, '+').replace(/_/g, '/');\n\treturn <T>JSONAttemptParse(decodeURIComponent(atob(base64).split('').map(function(c) {\n\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t}).join('')));\n}\n","import {TypedEmitter, TypedEvents} from './emitter';\r\nimport {JSONSanitize} from './json.ts';\r\n\r\nexport const CliEffects = {\r\n\tCLEAR: \"\\x1b[0m\",\r\n\tBRIGHT: \"\\x1b[1m\",\r\n\tDIM: \"\\x1b[2m\",\r\n\tUNDERSCORE: \"\\x1b[4m\",\r\n\tBLINK: \"\\x1b[5m\",\r\n\tREVERSE: \"\\x1b[7m\",\r\n\tHIDDEN: \"\\x1b[8m\",\r\n}\r\n\r\nexport const CliForeground = {\r\n\tBLACK: '\\x1b[30m',\r\n\tRED: '\\x1b[31m',\r\n\tGREEN: '\\x1b[32m',\r\n\tYELLOW: '\\x1b[33m',\r\n\tBLUE: '\\x1b[34m',\r\n\tMAGENTA: '\\x1b[35m',\r\n\tCYAN: '\\x1b[36m',\r\n\tLIGHT_GREY: '\\x1b[37m',\r\n\tGREY: '\\x1b[90m',\r\n\tLIGHT_RED: '\\x1b[91m',\r\n\tLIGHT_GREEN: '\\x1b[92m',\r\n\tLIGHT_YELLOW: '\\x1b[93m',\r\n\tLIGHT_BLUE: '\\x1b[94m',\r\n\tLIGHT_MAGENTA: '\\x1b[95m',\r\n\tLIGHT_CYAN: '\\x1b[96m',\r\n\tWHITE: '\\x1b[97m',\r\n}\r\n\r\nexport const CliBackground = {\r\n\tBLACK: \"\\x1b[40m\",\r\n\tRED: \"\\x1b[41m\",\r\n\tGREEN: \"\\x1b[42m\",\r\n\tYELLOW: \"\\x1b[43m\",\r\n\tBLUE: \"\\x1b[44m\",\r\n\tMAGENTA: \"\\x1b[45m\",\r\n\tCYAN: \"\\x1b[46m\",\r\n\tWHITE: \"\\x1b[47m\",\r\n\tGREY: \"\\x1b[100m\",\r\n}\r\n\r\nexport type LogLevels = 'debug' | 'log' | 'info' | 'warn' | 'error';\r\n\r\nexport enum LOG_LEVEL {\r\n\tERROR = 0,\r\n\tWARN = 1,\r\n\tINFO = 2,\r\n\tLOG = 3,\r\n\tDEBUG = 4,\r\n}\r\n\r\nexport type LoggerEvents = TypedEvents & {\r\n\t'ERROR': (...args: any[]) => any;\r\n\t'WARN': (...args: any[]) => any;\r\n\t'INFO': (...args: any[]) => any;\r\n\t'LOG': (...args: any[]) => any;\r\n\t'DEBUG': (...args: any[]) => any;\r\n};\r\n\r\nexport class Logger extends TypedEmitter<LoggerEvents> {\r\n\tstatic LOG_LEVEL: LOG_LEVEL = LOG_LEVEL.DEBUG;\r\n\r\n\tconstructor(public readonly namespace?: string) {\r\n\t\tsuper();\r\n\t}\r\n\r\n\tprotected format(...text: any[]): string {\r\n\t\tconst now = new Date();\r\n\t\tconst timestamp = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}.${now.getMilliseconds().toString().padEnd(3, '0')}`;\r\n\t\treturn `${timestamp}${this.namespace ? ` [${this.namespace}]` : ''} ${text.map(t => typeof t == 'string' ? t : JSONSanitize(t, 2)).join(' ')}`;\r\n\t}\r\n\r\n\tdebug(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.DEBUG) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.DEBUG, str);\r\n\t\tconsole.debug(CliForeground.LIGHT_GREY + str + CliEffects.CLEAR);\r\n\t}\r\n\r\n\tlog(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.LOG) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.LOG, str);\r\n\t\tconsole.log(CliEffects.CLEAR + str);\r\n\t}\r\n\r\n\tinfo(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.INFO) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.INFO, str);\r\n\t\tconsole.info(CliForeground.BLUE + str + CliEffects.CLEAR);\r\n\t}\r\n\r\n\twarn(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.WARN) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.WARN, str);\r\n\t\tconsole.warn(CliForeground.YELLOW + str + CliEffects.CLEAR);\r\n\t}\r\n\r\n\terror(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.ERROR) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.ERROR, str);\r\n\t\tconsole.error(CliForeground.RED + str + CliEffects.CLEAR);\r\n\t}\r\n}\r\n","/**\n * Convert decimal number to fraction\n *\n * @example\n * ```js\n * dec2Frac(1.25) // Outputs: \"1 1/4\"\n * ```\n *\n * @param {number} num Number to convert\n * @param maxDen\n * @return {string} Fraction with remainder\n */\nexport function dec2Frac(num: number, maxDen=1000): string {\n\tlet sign = Math.sign(num);\n\tnum = Math.abs(num);\n\tif (Number.isInteger(num)) return (sign * num) + \"\";\n\tlet closest = { n: 0, d: 1, diff: Math.abs(num) };\n\tfor (let d = 1; d <= maxDen; d++) {\n\t\tlet n = Math.round(num * d);\n\t\tlet diff = Math.abs(num - n / d);\n\t\tif (diff < closest.diff) {\n\t\t\tclosest = { n, d, diff };\n\t\t\tif (diff < 1e-8) break; // Close enough\n\t\t}\n\t}\n\tlet integer = Math.floor(closest.n / closest.d);\n\tlet numerator = closest.n - integer * closest.d;\n\treturn (sign < 0 ? '-' : '') +\n\t\t(integer ? integer + ' ' : '') +\n\t\t(numerator ? numerator + '/' + closest.d : '');\n}\n\n\n/**\n * Convert fraction to decimal number\n *\n * @example\n * ```js\n * fracToDec('1 1/4') // Outputs: 1.25\n * ```\n *\n * @param {string} frac Fraction to convert\n * @return {number} Faction as a decimal\n */\nexport function fracToDec(frac: string) {\n\tlet split = frac.split(' ');\n\tconst whole = split.length == 2 ? Number(split[0]) : 0;\n\tsplit = (<string>split.pop()).split('/');\n\treturn whole + (Number(split[0]) / Number(split[1]));\n}\n\n/**\n * Add a suffix to a number:\n * 1 = 1st\n * 2 = 2nd\n * 3 = 3rd\n * N = Nth\n * @param {number} n\n * @returns {string}\n */\nexport function numSuffix(n: number): string {\n\tconst s = ['th', 'st', 'nd', 'rd'], v = n % 100;\n\treturn `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;\n}\n","import {LogLevels} from './logger.ts';\r\nimport {PathEvent} from './path-events.ts';\r\nimport {md5} from './string';\r\n\r\n/**\r\n * Compare version numbers\r\n * @param {string} target\r\n * @param {string} vs\r\n * @return {number} -1 = target is lower, 0 = equal, 1 = higher\r\n */\r\nexport function compareVersions(target: string, vs: string): -1 | 0 | 1 {\r\n\tconst [tMajor, tMinor, tPatch] = target.split('.').map(v => +v.replace(/[^0-9]/g, ''));\r\n\tconst [vMajor, vMinor, vPatch] = vs.split('.').map(v => +v.replace(/[^0-9]/g, ''));\r\n\treturn (tMajor > vMajor || tMinor > vMinor || tPatch > vPatch) ? 1 :\r\n\t\t(tMajor < vMajor || tMinor < vMinor || tPatch < vPatch) ? -1 : 0;\r\n}\r\n\r\n/**\r\n * Create a console object to intercept logs with optional passthrough\r\n * @param {null | {debug: Function, log: Function, info: Function, warn: Function, error: Function}} out Passthrough logs, null to silence\r\n * @param {{[K in LogLevels]?: LogLevels | \"none\"}} map Map log levels: {log: 'debug', warn: 'error'} = Suppress debug logs, elevate warnings\r\n * @returns {{debug: Function, log: Function, info: Function, warn: Function, error: Function, stderr: string[], stdout: string[]}}\r\n */\r\nexport function consoleInterceptor(\r\n\tout: null | {debug: Function, log: Function, info: Function, warn: Function, error: Function} = console,\r\n\tmap?: {[K in LogLevels]?: LogLevels | 'none'}\r\n): {debug: Function, log: Function, info: Function, warn: Function, error: Function, output: {debug: any[], log: any[], info: any[], warn: any[], error: any[], stderr: any[], stdout: any[]}} {\r\n\tconst logs: any = {debug: [], log: [], info: [], warn: [], error: [], stderr: [], stdout: [],}\r\n\tconst cWrapper = (type: 'debug' | 'log' | 'info' | 'warn' | 'error') => ((...args: any[]) => {\r\n\t\tif(out) out[type](...args);\r\n\t\tlogs[type].push(...args);\r\n\t\tif(type == 'error') logs.stderr.push(...args);\r\n\t\telse logs.stdout.push(...args);\r\n\t});\r\n\treturn {\r\n\t\tdebug: map?.debug != 'none' ? cWrapper(map?.debug || 'debug') : () => {},\r\n\t\tlog: map?.log != 'none' ? cWrapper(map?.log || 'log') : () => {},\r\n\t\tinfo: map?.info != 'none' ? cWrapper(map?.info || 'info') : () => {},\r\n\t\twarn: map?.warn != 'none' ? cWrapper(map?.warn || 'warn') : () => {},\r\n\t\terror: map?.error != 'none' ? cWrapper(map?.error || 'error') : () => {},\r\n\t\toutput: logs\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * Escape any regex special characters to avoid misinterpretation during search\r\n * @param {string} value String which should be escaped\r\n * @return {string} New escaped sequence\r\n */\r\nexport function escapeRegex(value: string) {\r\n\treturn value.replace(/[.*+?^${}()|\\[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Run a stringified function with arguments asynchronously\r\n * @param {object} args Map of key/value arguments\r\n * @param {string} fn Function as string\r\n * @param {boolean} async Run with async (returns a promise)\r\n * @return {T | Promise<T>} Function return result\r\n */\r\nexport function fn<T>(args: object, fn: string, async: boolean = false): T {\r\n\tconst keys = Object.keys(args);\r\n\treturn new Function(...keys, `return (${async ? 'async ' : ''}(${keys.join(',')}) => { ${fn} })(${keys.join(',')})`)(...keys.map(k => (<any>args)[k]));\r\n}\r\n\r\n/**\r\n * Get profile image from Gravatar\r\n *\r\n * @param {string} email Account email address\r\n * @param {string} def Default image, can be a link or '404', see: https://docs.gravatar.com/general/images/\r\n * @returns {string} Gravatar URL\r\n */\r\nexport function gravatar(email: string, def='mp') {\r\n\tif(!email) return '';\r\n\treturn `https://www.gravatar.com/avatar/${md5(email)}?d=${def}`;\r\n}\r\n\r\n/**\r\n * Convert IPv6 to v4 because who uses that, NAT4Life\r\n * @param {string} ip IPv6 address, e.g. 2001:0db8:85a3:0000:0000:8a2e:0370:7334\r\n * @returns {string | null} IPv4 address, e.g. 172.16.58.3\r\n */\r\nexport function ipV6ToV4(ip: string) {\r\n\tif(!ip) return null;\r\n\tconst ipv4 = ip.split(':').splice(-1)[0];\r\n\tif(ipv4 == '1') return '127.0.0.1';\r\n\treturn ipv4;\r\n}\r\n\r\n/**\r\n * Check if IP is reserved, e.g. localhost, private IPs, etc.\r\n * @param {string} ip\r\n * @returns {boolean}\r\n */\r\nexport function reservedIp(ip: string): boolean {\r\n\tif(ip == 'localhost' || ip == '127.0.0.1') return true;\r\n\treturn /\\b(10\\.(?:[0-9]{1,3}\\.){2}[0-9]{1,3})\\b|\\b(172\\.(?:1[6-9]|2[0-9]|3[0-1])\\.(?:[0-9]{1,3}\\.)[0-9]{1,3})\\b|\\b(192\\.168\\.(?:[0-9]{1,3}\\.)[0-9]{1,3})\\b/.test(ip);\r\n}\r\n\r\n\r\n/**\r\n * Represents a function that listens for events and handles them accordingly.\r\n *\r\n * @param {PathEvent} event - The event object containing data related to the triggered event.\r\n * @param {...any} args - Additional arguments that may be passed to the listener.\r\n * @returns {any} The return value of the listener, which can vary based on implementation.\r\n */\r\nexport type Listener = (event: PathEvent, ...args: any[]) => any;\r\n\r\n/** Represents a function that can be called to unsubscribe from an event, stream, or observer */\r\nexport type Unsubscribe = () => void;\r\n","import {makeArray} from './array.ts';\nimport {ASet} from './aset.ts';\n\n/**\n * Available methods:\n * * - All/Wildcard\n * n - None\n * c - Create\n * r - Read\n * u - Update\n * d - Delete\n * x - Execute\n */\nexport type Method = '*' | 'n' | 'c' | 'r' | 'u' | 'd' | 'x';\n\n/**\n * Shorthand for creating Event from a string\n *\n * @example\n * ```ts\n * const event: Event = PE`users/system:*`;\n * ```\n *\n * @param {TemplateStringsArray} str String that will be parsed into Event\n * @param {string} args\n * @return {PathEvent} Event object\n */\nexport function PE(str: TemplateStringsArray, ...args: any[]) {\n\tconst combined = [];\n\tfor(let i = 0; i < str.length || i < args.length; i++) {\n\t\tif(str[i]) combined.push(str[i]);\n\t\tif(args[i]) combined.push(args[i]);\n\t}\n\treturn new PathEvent(combined.join('/'));\n}\n\n/**\n * Shorthand for creating Event strings, ensures paths are correct\n *\n * @param {TemplateStringsArray} str\n * @param {string} args\n * @return {string}\n * @constructor\n */\nexport function PES(str: TemplateStringsArray, ...args: any[]) {\n\tlet combined = [];\n\tfor(let i = 0; i < str.length || i < args.length; i++) {\n\t\tif(str[i]) combined.push(str[i]);\n\t\tif(args[i]) combined.push(args[i]);\n\t}\n\tconst [paths, methods] = combined.join('/').split(':');\n\treturn PathEvent.toString(paths, <any>methods?.split(''));\n}\n\nexport class PathError extends Error { }\n\n/**\n * A event broken down into its core components for easy processing\n * Event Structure: `module/path/name:method`\n * Example: `users/system:crud` or `storage/some/path/file.txt:r`\n * Supports glob patterns: `users/*:r` or `storage/**:rw`\n */\nexport class PathEvent {\n\t/** First directory in path */\n\tmodule!: string;\n\t/** Entire path, including the module & name */\n\tfullPath!: string;\n\t/** Path including the name, excluding the module */\n\tpath!: string;\n\t/** Last segment of path */\n\tname!: string;\n\t/** List of methods */\n\tmethods!: ASet<Method>;\n\t/** Whether this path contains glob patterns */\n\thasGlob!: boolean;\n\n\t/** Internal cache for PathEvent instances to avoid redundant parsing */\n\tprivate static pathEventCache: Map<string, PathEvent> = new Map();\n\t/** Cache for compiled permissions (path + required permissions → result) */\n\tprivate static permissionCache: Map<string, PathEvent> = new Map();\n\t/** Max size for permission cache before LRU eviction */\n\tprivate static readonly MAX_PERMISSION_CACHE_SIZE = 1000;\n\n\t/** All/Wildcard specified */\n\tget all(): boolean { return this.methods.has('*') }\n\tset all(v: boolean) { v ? this.methods = new ASet<Method>(['*']) : this.methods.delete('*'); }\n\t/** None specified */\n\tget none(): boolean { return this.methods.has('n') }\n\tset none(v: boolean) { v ? this.methods = new ASet<Method>(['n']) : this.methods.delete('n'); }\n\t/** Create method specified */\n\tget create(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('c')) }\n\tset create(v: boolean) { v ? this.methods.delete('n').delete('*').add('c') : this.methods.delete('c'); }\n\t/** Execute method specified */\n\tget execute(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('x')) }\n\tset execute(v: boolean) { v ? this.methods.delete('n').delete('*').add('x') : this.methods.delete('x'); }\n\t/** Read method specified */\n\tget read(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('r')) }\n\tset read(v: boolean) { v ? this.methods.delete('n').delete('*').add('r') : this.methods.delete('r'); }\n\t/** Update method specified */\n\tget update(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('u')) }\n\tset update(v: boolean) { v ? this.methods.delete('n').delete('*').add('u') : this.methods.delete('u'); }\n\t/** Delete method specified */\n\tget delete(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('d')) }\n\tset delete(v: boolean) { v ? this.methods.delete('n').delete('*').add('d') : this.methods.delete('d'); }\n\n\tconstructor(e: string | PathEvent) {\n\t\tif(typeof e == 'object') {\n\t\t\tObject.assign(this, e);\n\t\t\treturn;\n\t\t}\n\n\t\tif(PathEvent.pathEventCache.has(e)) {\n\t\t\tObject.assign(this, PathEvent.pathEventCache.get(e)!);\n\t\t\treturn;\n\t\t}\n\n\t\tlet [p, method] = e.replaceAll(/(^|\\/)\\*+\\/?$/g, '').split(':');\n\t\tif(!method) method = '*';\n\n\t\t// Handle special cases\n\t\tif(p === '' || p === undefined || p === '*') {\n\t\t\tthis.module = '';\n\t\t\tthis.path = '';\n\t\t\tthis.fullPath = '**';\n\t\t\tthis.name = '';\n\t\t\tthis.methods = new ASet<Method>(p === '*' ? ['*'] : <any>method.split(''));\n\t\t\tthis.hasGlob = true;\n\t\t\tPathEvent.pathEventCache.set(e, this);\n\t\t\treturn;\n\t\t}\n\n\t\tlet temp = p.split('/').filter(p => !!p);\n\t\tthis.module = temp.splice(0, 1)[0] || '';\n\t\tthis.path = temp.join('/');\n\t\tthis.fullPath = `${this.module}${this.module && this.path ? '/' : ''}${this.path}`;\n\t\tthis.name = temp.pop() || '';\n\t\tthis.hasGlob = this.fullPath.includes('*');\n\t\tthis.methods = new ASet(<any>method.split(''));\n\t\tPathEvent.pathEventCache.set(e, this);\n\t}\n\n\t/**\n\t * Check if a filter pattern matches a target path\n\t * @private\n\t */\n\tprivate static matches(pattern: PathEvent, target: PathEvent): boolean {\n\t\tconst methodsMatch = pattern.all || target.all || pattern.methods.intersection(target.methods).length > 0;\n\t\tif(!methodsMatch) return false;\n\t\tif(!pattern.hasGlob && !target.hasGlob) {\n\t\t\tconst last = pattern.fullPath[target.fullPath.length];\n\t\t\treturn pattern.fullPath.startsWith(target.fullPath) && (last == null || last == '/');\n\t\t}\n\t\tif(pattern.hasGlob) return this.pathMatchesGlob(target.fullPath, pattern.fullPath);\n\t\treturn this.pathMatchesGlob(pattern.fullPath, target.fullPath);\n\t}\n\n\t/**\n\t * Check if a path matches a glob pattern\n\t * @private\n\t */\n\tprivate static pathMatchesGlob(path: string, pattern: string): boolean {\n\t\tif(pattern === path) return true;\n\t\tconst pathParts = path.split('/').filter(p => !!p);\n\t\tconst patternParts = pattern.split('/').filter(p => !!p);\n\n\t\tlet pathIdx = 0;\n\t\tlet patternIdx = 0;\n\t\twhile (patternIdx < patternParts.length && pathIdx < pathParts.length) {\n\t\t\tconst patternPart = patternParts[patternIdx];\n\t\t\tif(patternPart === '**') {\n\t\t\t\tif(patternIdx === patternParts.length - 1) return true;\n\t\t\t\twhile (pathIdx < pathParts.length) {\n\t\t\t\t\tif(PathEvent.pathMatchesGlob(pathParts.slice(pathIdx).join('/'), patternParts.slice(patternIdx + 1).join('/'))) return true;\n\t\t\t\t\tpathIdx++;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} else if(patternPart === '*') {\n\t\t\t\tpathIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t} else {\n\t\t\t\tif(patternPart !== pathParts[pathIdx]) return false;\n\t\t\t\tpathIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t}\n\t\t}\n\t\tif(patternIdx < patternParts.length) return patternParts.slice(patternIdx).every(p => p === '**');\n\t\treturn pathIdx === pathParts.length;\n\t}\n\n\t/**\n\t * Score a path for specificity ranking (lower = more specific = higher priority)\n\t * @private\n\t */\n\tprivate static scoreSpecificity(path: string): number {\n\t\tif(path === '**' || path === '') return Number.MAX_SAFE_INTEGER;\n\t\tconst segments = path.split('/').filter(p => !!p);\n\t\tlet score = -segments.length;\n\t\tsegments.forEach(seg => {\n\t\t\tif(seg === '**') score += 0.5;\n\t\t\telse if(seg === '*') score += 0.25;\n\t\t});\n\t\treturn score;\n\t}\n\n\t/** Clear the cache of all PathEvents */\n\tstatic clearCache(): void {\n\t\tPathEvent.pathEventCache.clear();\n\t}\n\n\t/** Clear the permission cache */\n\tstatic clearPermissionCache(): void {\n\t\tPathEvent.permissionCache.clear();\n\t}\n\n\t/**\n\t * Combine multiple events into one parsed object. Longest path takes precedent, but all subsequent methods are\n\t * combined until a \"none\" is reached\n\t *\n\t * @param {string | PathEvent} paths Events as strings or pre-parsed\n\t * @return {PathEvent} Final combined permission\n\t */\n\tstatic combine(...paths: (string | PathEvent)[]): PathEvent {\n\t\tconst parsed = paths.map(p => p instanceof PathEvent ? p : new PathEvent(p));\n\t\tconst sorted = parsed.toSorted((p1, p2) => {\n\t\t\tconst score1 = PathEvent.scoreSpecificity(p1.fullPath);\n\t\t\tconst score2 = PathEvent.scoreSpecificity(p2.fullPath);\n\t\t\treturn score1 - score2;\n\t\t});\n\t\tlet result: PathEvent | null = null;\n\t\tfor (const p of sorted) {\n\t\t\tif(!result) {\n\t\t\t\tresult = p;\n\t\t\t} else {\n\t\t\t\tif(result.fullPath.startsWith(p.fullPath)) {\n\t\t\t\t\tif(p.none) break;\n\t\t\t\t\tresult.methods = new ASet([...result.methods, ...p.methods]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result || new PathEvent('');\n\t}\n\n\t/**\n\t * Filter a set of paths based on the target\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of events that will filtered\n\t * @param filter {...PathEvent} Must contain one of\n\t * @return {PathEvent[]} Filtered results\n\t */\n\tstatic filter(target: string | PathEvent | (string | PathEvent)[], ...filter: (string | PathEvent)[]): PathEvent[] {\n\t\tconst parsedTarget = makeArray(target).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\tconst parsedFilter = makeArray(filter).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\treturn parsedTarget.filter(t => !!parsedFilter.find(r => PathEvent.matches(r, t)));\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if any overlap is found\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have at least one of these path\n\t * @return {boolean} Whether there is any overlap\n\t */\n\tstatic has(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): boolean {\n\t\tconst parsedTarget = makeArray(target).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\tconst parsedRequired = makeArray(has).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\treturn !!parsedRequired.find(r => !!parsedTarget.find(t => PathEvent.matches(r, t)));\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if the target has all paths\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have all these paths\n\t * @return {boolean} Whether all are present\n\t */\n\tstatic hasAll(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): boolean {\n\t\treturn has.filter(h => PathEvent.has(target, h)).length == has.length;\n\t}\n\n\t/**\n\t * Same as `has` but raises an error if there is no overlap\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have at least one of these path\n\t */\n\tstatic hasFatal(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): void {\n\t\tif(!PathEvent.has(target, ...has)) throw new PathError(`Requires one of: ${makeArray(has).join(', ')}`);\n\t}\n\n\t/**\n\t * Same as `hasAll` but raises an error if the target is missing any paths\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have all these paths\n\t */\n\tstatic hasAllFatal(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): void {\n\t\tif(!PathEvent.hasAll(target, ...has)) throw new PathError(`Requires all: ${makeArray(has).join(', ')}`);\n\t}\n\n\t/**\n\t * Create event string from its components\n\t *\n\t * @param {string | string[]} path Event path\n\t * @param {Method} methods Event method\n\t * @return {string} String representation of Event\n\t */\n\tstatic toString(path: string | string[], methods: Method | Method[]): string {\n\t\tlet p = makeArray(path).filter(p => !!p).join('/');\n\t\tp = p?.trim().replaceAll(/\\/{2,}/g, '/').replaceAll(/(^\\/|\\/$)/g, '');\n\t\tif(methods?.length) p += `:${makeArray(methods).map(m => m.toLowerCase()).join('')}`;\n\t\treturn p;\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if any overlap is found\n\t *\n\t * @param has Target must have at least one of these path\n\t * @return {boolean} Whether there is any overlap\n\t */\n\thas(...has: (string | PathEvent)[]): boolean {\n\t\treturn PathEvent.has(this, ...has);\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if the target has all paths\n\t *\n\t * @param has Target must have all these paths\n\t * @return {boolean} Whether all are present\n\t */\n\thasAll(...has: (string | PathEvent)[]): boolean {\n\t\treturn PathEvent.hasAll(this, ...has);\n\t}\n\n\t/**\n\t * Same as `has` but raises an error if there is no overlap\n\t *\n\t * @param has Target must have at least one of these path\n\t */\n\thasFatal(...has: (string | PathEvent)[]): void {\n\t\treturn PathEvent.hasFatal(this, ...has);\n\t}\n\n\t/**\n\t * Same as `hasAll` but raises an error if the target is missing any paths\n\t *\n\t * @param has Target must have all these paths\n\t */\n\thasAllFatal(...has: (string | PathEvent)[]): void {\n\t\treturn PathEvent.hasAllFatal(this, ...has);\n\t}\n\n\t/**\n\t * Filter a set of paths based on this event\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of events that will filtered\n\t * @return {PathEvent[]} Filtered results\n\t */\n\tfilter(target: string | PathEvent | (string | PathEvent)[]): PathEvent[] {\n\t\treturn PathEvent.filter(target, this);\n\t}\n\n\t/**\n\t * Create event string from its components\n\t *\n\t * @return {string} String representation of Event\n\t */\n\ttoString() {\n\t\treturn PathEvent.toString(this.fullPath, this.methods);\n\t}\n}\n\nexport type PathListener = (event: PathEvent, ...args: any[]) => any;\nexport type PathUnsubscribe = () => void;\n\nexport type Event = string | PathEvent;\nexport interface IPathEventEmitter {\n\temit(event: Event, ...args: any[]): void;\n\toff(listener: PathListener): void;\n\ton(event: Event | Event[], listener: PathListener): PathUnsubscribe;\n\tonce(event: Event | Event[], listener?: PathListener): Promise<any>;\n\trelayEvents(emitter: PathEventEmitter): void;\n}\n\n/**\n * Event emitter that uses paths allowing listeners to listen to different combinations of modules, paths & methods\n */\nexport class PathEventEmitter implements IPathEventEmitter{\n\tprivate listeners: [PathEvent, PathListener][] = [];\n\n\tconstructor(public readonly prefix: string = '') { }\n\n\temit(event: Event, ...args: any[]) {\n\t\tconst parsed = event instanceof PathEvent ? event : new PathEvent(`${this.prefix}/${event}`);\n\t\tthis.listeners.filter(l => PathEvent.has(l[0], parsed))\n\t\t\t.forEach(l => l[1](parsed, ...args));\n\t};\n\n\toff(listener: PathListener) {\n\t\tthis.listeners = this.listeners.filter(l => l[1] != listener);\n\t}\n\n\ton(event: Event | Event[], listener: PathListener): PathUnsubscribe {\n\t\tmakeArray(event).forEach(e => {\n\t\t\tlet fullEvent: string;\n\t\t\tif(typeof e === 'string') {\n\t\t\t\t// If event starts with ':', it's a scope specifier - prepend prefix\n\t\t\t\tif(e[0] === ':' && this.prefix) {\n\t\t\t\t\tfullEvent = `${this.prefix}${e}`;\n\t\t\t\t} else if(this.prefix) {\n\t\t\t\t\tfullEvent = `${this.prefix}/${e}`;\n\t\t\t\t} else {\n\t\t\t\t\tfullEvent = e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfullEvent = e instanceof PathEvent ? PathEvent.toString(e.fullPath, e.methods) : (e as string);\n\t\t\t}\n\t\t\tthis.listeners.push([\n\t\t\t\tnew PathEvent(fullEvent),\n\t\t\t\tlistener\n\t\t\t])\n\t\t});\n\t\treturn () => this.off(listener);\n\t}\n\n\tonce(event: Event | Event[], listener?: PathListener): Promise<any> {\n\t\treturn new Promise(res => {\n\t\t\tconst unsubscribe = this.on(event, (event: PathEvent, ...args: any[]) => {\n\t\t\t\tres(args.length < 2 ? args[0] : args);\n\t\t\t\tif(listener) listener(event, ...args);\n\t\t\t\tunsubscribe();\n\t\t\t});\n\t\t});\n\t}\n\n\trelayEvents(emitter: IPathEventEmitter) {\n\t\temitter.on('**', (event, ...args) => this.emit(event, ...args));\n\t}\n}\n","import {JSONAttemptParse, JSONSerialize} from './json.ts';\nimport {dotNotation} from './objects.ts';\n\n/**\n * Filters an array of objects based on a search term and optional regex checking.\n *\n * @param {Array} rows Array of objects to filter\n * @param {string} search The logic string or regext to filter on\n * @param {boolean} [regex=false] Treat search expression as regex\n * @param {Function} [transform=(r) => r] - Transform rows before filtering\n * @return {Array} The filtered array of objects that matched search\n */\nexport function search(rows: any[], search: string, regex?: boolean, transform: Function = (r: any) => r) {\n\tif(!rows) return [];\n\treturn rows.filter(r => {\n\t\t// Empty search\n\t\tif(!search) return true;\n\t\tconst value = transform(r);\n\t\t// Regex search\n\t\tif(regex) {\n\t\t\treturn !!Object.values(value).filter((v: any) => {\n\t\t\t\ttry { return RegExp(search, 'gm').test(v.toString()); }\n\t\t\t\tcatch { return false; }\n\t\t\t}).length\n\t\t} else {\n\t\t\treturn logicTest(value, search);\n\t\t}\n\t});\n}\n\n/**\n * Test an object against a logic condition. By default values are checked\n * @param {string} condition\n * @param {object} target\n * @return {boolean}\n */\nexport function logicTest(target: object, condition: string): boolean {\n\tconst evalBoolean = (a: any, op: string, b: any): boolean => {\n\t\tswitch(op) {\n\t\t\tcase '=':\n\t\t\tcase '==': return a == b;\n\t\t\tcase '!=': return a != b;\n\t\t\tcase '+=': return a?.toString().includes(b);\n\t\t\tcase '-=': return !a?.toString().includes(b);\n\t\t\tcase '>': return a > b;\n\t\t\tcase '>=': return a >= b;\n\t\t\tcase '<': return a < b;\n\t\t\tcase '<=': return a <= b;\n\t\t\tdefault: return false;\n\t\t}\n\t}\n\n\tconst or = condition.split('||').map(p => p.trim()).filter(p => !!p);\n\treturn -1 != or.findIndex(p => {\n\t\t// Make sure all ANDs pass\n\t\tconst and = p.split('&&').map(p => p.trim()).filter(p => !!p);\n\t\treturn and.filter(p => {\n\t\t\t// Boolean operator\n\t\t\tconst prop = /(\\S+)\\s*(==?|!=|\\+=|-=|>=|>|<=|<)\\s*(\\S+)/g.exec(p);\n\t\t\tif(prop) {\n\t\t\t\tconst key = Object.keys(target).find(k => k.toLowerCase() == prop[1].toLowerCase());\n\t\t\t\treturn evalBoolean(dotNotation<any>(target, key || prop[1]), prop[2], JSONAttemptParse(prop[3]));\n\t\t\t}\n\t\t\t// Case-sensitive\n\t\t\tconst v = Object.values(target).map(JSONSerialize).join('');\n\t\t\tif(/[A-Z]/g.test(condition)) return v.includes(p);\n\t\t\t// Case-insensitive\n\t\t\treturn v.toLowerCase().includes(p);\n\t\t}).length == and.length;\n\t});\n}\n","import {BadRequestError} from './errors.ts';\nimport {dotNotation} from './objects.ts';\nimport {matchAll} from './string.ts';\nimport {formatDate} from './time.ts';\n\nexport class TemplateError extends BadRequestError { }\n\nexport async function renderTemplate(template: string, data: any, fetch?: (file: string) => Promise<string>) {\n\tlet content = template, found: any;\n\tconst now = new Date(), d = {\n\t\tdate: {\n\t\t\tday: now.getDate(),\n\t\t\tmonth: now.toLocaleString('default', { month: 'long' }),\n\t\t\tyear: now.getFullYear(),\n\t\t\ttime: now.toLocaleTimeString(),\n\t\t\tformat: formatDate\n\t\t},\n\t\t...(data || {}),\n\t};\n\n\tif(!fetch) fetch = (file) => {\n\t\tthrow new TemplateError(`Unable to fetch template: ${file}`);\n\t}\n\n\tconst evaluate = (code: string, data: object, fatal = true) => {\n\t\ttry {\n\t\t\treturn Function('data', `with(data) { return ${code}; }`)(data);\n\t\t} catch {\n\t\t\tif(fatal) throw new TemplateError(`Failed to evaluate: ${code}`);\n\t\t\telse return false;\n\t\t}\n\t}\n\n\t// If Statements - Optimize what we render: `{{ ? javascript }} TRUE CONTENT {{ !? }} FALSE CONTENT {{ /? }}`\n\twhile(!!(found = /\\{\\{\\s*?\\?\\s*?(.+?)\\s*?}}([\\s\\S]*?)(?:\\{\\{\\s*?!\\?\\s*?}}([\\s\\S]*?))?\\{\\{\\s*?\\/\\?\\s*?}}/g.exec(content))) {\n\t\tconst nested = matchAll(found[0], /\\{\\{\\s*?\\?.+?}}/g).slice(-1)?.[0]?.index;\n\t\tif(nested != 0)\n\t\t\tfound = /\\{\\{\\s*?\\?\\s*?(.+?)\\s*?}}([\\s\\S]*?)(?:\\{\\{\\s*?!\\?\\s*?}}([\\s\\S]*?))?\\{\\{\\s*?\\/\\?\\s*?}}/g.exec(content.slice(found.index + nested))\n\t\tcontent = content.replace(found[0], (evaluate(found[1], d, false) ? found[2] : found[3]) || '');\n\t}\n\n\t// Imports - We render bottom up: `{{ < file.html }}`\n\twhile(!!(found = /\\{\\{\\s*?<\\s*?(.+?)\\s*?}}/g.exec(content))) {\n\t\tcontent = content.replace(found[0], await renderTemplate(await fetch(found[1].trim()), data, fetch));\n\t}\n\n\t// For Loops: `{{ * (row, index) in invoice }} CONTENT {{ /* }}`\n\twhile(!!(found = /\\{\\{\\s*?\\*\\s*?(.+?)\\s+in\\s+(.+?)\\s*?}}([\\s\\S]*?)\\{\\{\\s*?\\/\\*\\s*?}}/g.exec(content))) {\n\t\tconst split = found[1].replaceAll(/[()\\s]/g, '').split(',');\n\t\tconst element = split[0];\n\t\tconst index = split[1] || 'index';\n\t\tconst array: any[] = <any>dotNotation(data, found[2]);\n\t\tif(!array || typeof array != 'object')\n\t\t\tthrow new TemplateError(`Cannot iterate: ${found[2]}`);\n\n\t\tlet compiled = [];\n\t\tfor(let i = 0; i < array.length; i++) {\n\t\t\tcompiled.push(renderTemplate(found[3], {\n\t\t\t\t...d,\n\t\t\t\t[element]: array[i],\n\t\t\t\t[index]: i\n\t\t\t}, fetch))\n\t\t}\n\t\tcontent = content.replace(found[0], compiled.join('\\n'));\n\t}\n\n\t// Evaluate whatever is left - Should come last: `{{ javascript }}`\n\twhile(!!(found = /\\{\\{\\s*([^<>\\*\\?!/}\\s][^}]*?)\\s*}}/g.exec(content))) {\n\t\tcontent = content.replace(found[0], evaluate(found[1].trim(), d) || '');\n\t}\n\n\t// Extends: `{{ > file.html:property }} CONTENT {{ /> }}`\n\twhile(!!(found = /\\{\\{\\s*?>\\s*?(.+?):(.+?)\\s*?}}([\\s\\S]*?)\\{\\{\\s*?\\/>\\s*?}}/g.exec(content))) {\n\t\tcontent = content.replace(found[0], await renderTemplate(await fetch(found[1].trim()), {\n\t\t\t...data,\n\t\t\t[found[2].trim()]: found[3],\n\t\t}, fetch));\n\t}\n\n\treturn content;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.persist = exports.Persist = void 0;\n/**\n * Sync variable's value with persistent storage (LocalStorage by default)\n *\n * @example\n * ```ts\n * const theme = new Persist('theme.current', {default: 'os'});\n * console.log(theme.value); // Output: os\n *\n * theme.value = 'light'; // Any changes to `.value` will automatically sync with localStorage\n *\n * location.reload(); // Simulate refresh\n * console.log(theme.value); // Output: light\n * ```\n */\nclass Persist {\n key;\n options;\n /** Backend service to store data, must implement `Storage` interface */\n storage;\n /** Listeners which should be notified on changes */\n watches = {};\n /** Private value field */\n _value;\n /** Current value or default if undefined */\n get value() { return this._value !== undefined ? this._value : this.options?.default; }\n /** Set value with proxy object wrapper to sync future changes */\n set value(v) {\n if (v == null || typeof v != 'object')\n this._value = v;\n // @ts-ignore\n else\n this._value = new Proxy(v, {\n get: (target, p) => {\n const f = typeof target[p] == 'function';\n if (!f)\n return target[p];\n return (...args) => {\n const value = target[p](...args);\n this.save();\n return value;\n };\n },\n set: (target, p, newValue) => {\n target[p] = newValue;\n this.save();\n return true;\n }\n });\n this.save();\n }\n /**\n * @param {string} key Primary key value will be stored under\n * @param {PersistOptions<T>} options Configure using {@link PersistOptions}\n */\n constructor(key, options = {}) {\n this.key = key;\n this.options = options;\n this.storage = options.storage || localStorage;\n this.load();\n }\n /** Notify listeners of change */\n notify(value) {\n Object.values(this.watches).forEach(watch => watch(value));\n }\n /** Delete value from storage */\n clear() {\n this.storage.removeItem(this.key);\n }\n /** Save current value to storage */\n save() {\n if (this._value === undefined)\n this.clear();\n else\n this.storage.setItem(this.key, JSON.stringify(this._value));\n this.notify(this.value);\n }\n /** Load value from storage */\n load() {\n if (this.storage[this.key] != undefined) {\n let value = JSON.parse(this.storage.getItem(this.key));\n if (value != null && typeof value == 'object' && this.options.type)\n value.__proto__ = this.options.type.prototype;\n this.value = value;\n }\n else\n this.value = this.options.default || undefined;\n }\n /**\n * Callback function which is run when there are changes\n *\n * @param {(value: T) => any} fn Callback will run on each change; it's passed the next value & it's return is ignored\n * @returns {() => void} Function which will unsubscribe the watch/callback when called\n */\n watch(fn) {\n const index = Object.keys(this.watches).length;\n this.watches[index] = fn;\n return () => { delete this.watches[index]; };\n }\n /**\n * Return value as JSON string\n *\n * @returns {string} Stringified object as JSON\n */\n toString() { return JSON.stringify(this.value); }\n /**\n * Return current value\n *\n * @returns {T} Current value\n */\n valueOf() { return this.value; }\n}\nexports.Persist = Persist;\n/**\n * Sync class property with persistent storage (LocalStorage by default)\n *\n * @example\n * ```ts\n * class ThemeEngine {\n * @persist({default: 'os'}) current!: string;\n * }\n *\n * const theme = new ThemeEngine();\n * console.log(theme.current) // Output: os\n *\n * theme.current = 'light'; //Any changes will be automatically saved to localStorage\n *\n * location.reload(); // Simulate refresh\n * console.log(theme.current) // Output: light\n * ```\n *\n * @group Decorators\n * @param {PersistOptions<T> & {key?: string}} options Configure using {@link PersistOptions}\n * @returns Decorator function\n */\nfunction persist(options) {\n return (target, prop) => {\n const key = options?.key || `${target.constructor.name}.${prop.toString()}`;\n const wrapper = new Persist(key, options);\n Object.defineProperty(target, prop, {\n get: function () { return wrapper.value; },\n set: function (v) { wrapper.value = v; }\n });\n };\n}\nexports.persist = persist;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MemoryStorage = void 0;\n/**\n * Example storage backend. By default, persist will use localStorage however,\n * by implementing the Storage interface you can provide a custom backend to\n * store data anywhere you desire such as an external database or redis.\n *\n * @ignore\n */\nclass MemoryStorage {\n get length() { return Object.keys(this).length; }\n clear() { Object.keys(this).forEach(k => this.removeItem(k)); }\n getItem(key) { return this[key]; }\n key(index) { return Object.keys(this)[index]; }\n removeItem(key) { delete this[key]; }\n setItem(key, value) { this[key] = value; }\n}\nexports.MemoryStorage = MemoryStorage;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./persist\"), exports);\n__exportStar(require(\"./memory-storage\"), exports);\n"],"names":["base","prop","obj","fn","search","key","inQuotes","h","numSuffix","formData","q","res","LOG_LEVEL","p","event","fetch","data","persist_1","persist","this","exports","require$$0","require$$1"],"mappings":"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","x_google_ignoreList":[23,24,25]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/arg-parser.ts","../src/json.ts","../src/objects.ts","../src/aset.ts","../src/array.ts","../src/cache.ts","../src/color.ts","../src/string.ts","../src/csv.ts","../src/time.ts","../src/database.ts","../src/promise-progress.ts","../src/files.ts","../src/emitter.ts","../src/errors.ts","../src/http.ts","../src/jwt.ts","../src/logger.ts","../src/math.ts","../src/misc.ts","../src/path-events.ts","../src/search.ts","../src/template.ts","../node_modules/var-persist/dist/persist.js","../node_modules/var-persist/dist/memory-storage.js","../node_modules/var-persist/dist/index.js"],"sourcesContent":["export type Arg<T = any> = {\n\t/** Argument/property name */\n\tname: string;\n\t/** Argument description for help page */\n\tdesc: string;\n\t/** Available shorthands */\n\tflags?: string[];\n\t/** Argument is not required */\n\toptional?: boolean;\n\t/** Default value if argument is not used */\n\tdefault?: T;\n\t/** Collects any unmatched arguments */\n\textras?: boolean;\n}\n\nexport class ArgParser {\n\tcommands: ArgParser[] = [];\n\targs: Arg[] = [];\n\tflags: Arg[] = [];\n\tdefaults!: {[key: string]: any};\n\n\t/**\n\t * Create a unix-like argument parser to extract flags from the argument list. Can also create help messages.\n\t *\n\t * @param {string} name Script name\n\t * @param {string} desc Help description\n\t * @param {(ArgParser | Arg[]} argList Array of CLI arguments\n\t * @param {string[]} examples Additional examples to display\n\t */\n\tconstructor(public readonly name: string,\n\t\t\t\tpublic readonly desc: string,\n\t\t\t\tpublic readonly argList: (ArgParser | Arg)[] = [],\n\t\t\t\tpublic readonly examples: string[] = []\n\t) {\n\t\t// Arguments\n\t\tthis.commands = argList.filter(arg => arg instanceof ArgParser);\n\t\tthis.args = <Arg[]>argList.filter(arg => !(arg instanceof ArgParser) && !arg.flags?.length);\n\t\tthis.flags = <Arg[]>[...argList.filter(arg => !(arg instanceof ArgParser) && arg.flags && arg.flags.length),\n\t\t\t{name: 'help', desc: 'Display command\\'s help message', flags: ['-h', '--help'], default: false}];\n\t\tthis.defaults = argList.reduce((acc, arg: any) => ({...acc, [arg.name]: arg['extras'] ? [] : (arg.default ?? null)}), {});\n\n\t\t// Examples\n\t\tthis.examples = <string[]>[\n\t\t\t...examples,\n\t\t\t`[OPTIONS] ${this.args.map(arg => (arg.optional ? `[${arg.name.toUpperCase()}]` : arg.name.toUpperCase()) + (arg.extras ? '...' : '')).join(' ')}`,\n\t\t\tthis.commands.length ? `[OPTIONS] COMMAND` : null,\n\t\t\t`--help ${this.commands.length ? '[COMMAND]' : ''}`\n\t\t].filter(e => !!e);\n\t}\n\n\t/**\n\t * Parse an array into an arguments dictionary using the configuration.\n\t *\n\t * @param {string[]} args Array of arguments to be parsed\n\t * @returns {object} Dictionary of arguments with defaults applied\n\t */\n\tparse(args: string[]) {\n\t\t// Parse arguments\n\t\tlet extras = [], parsed: any = {...this.defaults, '_error': []}, queue = [...args];\n\t\twhile(queue.length) {\n\t\t\tlet arg = queue.splice(0, 1)[0];\n\t\t\tif(arg[0] == '-') { // Flags\n\t\t\t\t// Check for combined shorthand\n\t\t\t\tif(arg[1] != '-' && arg.length > 2) {\n\t\t\t\t\tqueue = [...arg.substring(2).split('').map(a => `-${a}`), ...queue];\n\t\t\t\t\targ = `-${arg[1]}`;\n\t\t\t\t}\n\t\t\t\t// Find & add flag\n\t\t\t\tconst combined = arg.split('=');\n\t\t\t\tconst argDef = this.flags.find(flag => flag.flags?.includes(combined[0] || arg));\n\t\t\t\tif(argDef == null) { // Not found, add to extras\n\t\t\t\t\textras.push(arg);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst value = combined[1] != null ? combined [1] :\n\t\t\t\t\targDef.default === false ? true :\n\t\t\t\t\targDef.default === true ? false :\n\t\t\t\t\tqueue.splice(queue.findIndex(q => q[0] != '-'), 1)[0] ||\n\t\t\t\t\targDef.default;\n\t\t\t\tif(value == null) parsed['_error'].push(`Option missing value: ${argDef.name || combined[0]}`);\n\t\t\t\tparsed[argDef.name] = value;\n\t\t\t} else { // Command\n\t\t\t\tconst c = this.commands.find(command => command.name == arg);\n\t\t\t\tif(!!c) {\n\t\t\t\t\tconst parsedCommand = c.parse(queue.splice(0, queue.length));\n\t\t\t\t\tObject.keys(parsedCommand).forEach(key => {\n\t\t\t\t\t\tif(parsed[key] != parsedCommand[key] && parsedCommand[key] == c.defaults[key])\n\t\t\t\t\t\t\tdelete parsedCommand[key];\n\t\t\t\t\t});\n\t\t\t\t\tparsed = {\n\t\t\t\t\t\t...parsed,\n\t\t\t\t\t\t...parsedCommand,\n\t\t\t\t\t\t_command: c.name\n\t\t\t\t\t};\n\t\t\t\t} else extras.push(arg); // Not found, add to extras\n\t\t\t}\n\t\t}\n\t\t// Arguments\n\t\tthis.args.filter(arg => !arg.extras).forEach(arg => {\n\t\t\tif(!arg.optional && !extras.length) parsed['_error'].push(`Argument missing: ${arg.name.toUpperCase()}`);\n\t\t\tif(extras.length) parsed[arg.name] = extras.splice(0, 1)[0];\n\t\t});\n\t\t// Extras\n\t\tconst extraKey = this.args.find(arg => arg.extras)?.name || '_extra';\n\t\tparsed[extraKey] = extras;\n\t\treturn parsed;\n\t}\n\n\t/**\n\t * Create help message from the provided description & argument list.\n\t *\n\t * @returns {string} Help message\n\t * @param opts Help options: command - display a commands help, message - override help description\n\t */\n\thelp(opts: {command?: string, message?: string} = {}): string {\n\t\tconst spacer = (text: string) => Array(24 - text.length || 1).fill(' ').join('');\n\n\t\t// Help with specific command\n\t\tif(opts.command) {\n\t\t\tconst argParser = this.commands.find(parser => parser.name == opts.command);\n\t\t\tif(!argParser) throw new Error(`${opts.command.toUpperCase()} is not a command`)\n\t\t\treturn argParser.help({...opts, command: undefined});\n\t\t}\n\n\t\t// Description\n\t\tlet msg = `\\n\\n${opts.message || this.desc}`;\n\t\t// Examples\n\t\tmsg += '\\n\\nUsage:\\t' + this.examples.map(ex => `${this.name} ${ex}`).join('\\n\\t');\n\t\t// Arguments\n\t\tif(this.args.length) msg += '\\n\\n\\t' + this.args.map(arg =>\n\t\t\t`${arg.name.toUpperCase()}${spacer(arg.name)}${arg.desc}`).join('\\n\\t');\n\t\t// Flags\n\t\tmsg += '\\n\\nOptions:\\n\\t' + this.flags.map(flag => {\n\t\t\tconst flags = flag.flags?.join(', ') || '';\n\t\t\treturn `${flags}${spacer(flags)}${flag.desc}`;\n\t\t}).join('\\n\\t');\n\t\t// Commands\n\t\tif(this.commands.length) msg += '\\n\\nCommands:\\n\\t' + this.commands.map(command =>\n\t\t\t`${command.name}${spacer(command.name)}${command.desc}`).join('\\n\\t');\n\t\treturn `${msg}\\n\\n`;\n\t}\n}\n","/**\n * Parse JSON but return the original string if it fails\n *\n * @param {any} json JSON string to parse\n * @param fallback Fallback value if unable to parse, defaults to original string\n * @return {string | T} Object if successful, original string otherwise\n */\nexport function JSONAttemptParse<T1, T2>(json: T2, fallback?: T1): T1 | T2 {\n\ttry { return JSON.parse(<any>json); }\n\tcatch { return fallback ?? json; }\n}\n\n/**\n * Stringifies objects & skips primitives\n *\n * @param {any} obj Object to convert to serializable value\n * @return {string | T} Serialized value\n */\nexport function JSONSerialize<T1>(obj: T1): T1 | string {\n\tif(typeof obj == 'object' && obj != null) return JSONSanitize(obj);\n\treturn obj;\n}\n\n/**\n * Convert an object to a JSON string avoiding any circular references.\n *\n * @param obj Object to convert to JSON\n * @param {number} space Format the JSON with spaces\n * @return {string} JSON string\n */\nexport function JSONSanitize(obj: any, space?: number): string {\n\tconst cache: any[] = [];\n\treturn JSON.stringify(obj, (key, value) => {\n\t\tif(typeof value === 'object' && value !== null) {\n\t\t\tif(cache.includes(value)) return '[Circular]';\n\t\t\tcache.push(value);\n\t\t}\n\t\treturn value;\n\t}, space);\n}\n","import {JSONSanitize} from './json.ts';\r\n\r\nexport type Delta = { [key: string]: any | Delta | null };\r\n\r\n/**\r\n * Applies deltas to `target`.\r\n * @param base starting point\r\n * @param deltas List of deltas to apply\r\n * @returns Mutated target\r\n */\r\nexport function applyDeltas(base: any, ...deltas: any[]): any {\r\n\tfunction applyDelta(base: any, delta: any): any {\r\n\t\tif(delta === null) return null;\r\n\t\tif(typeof base !== 'object' || base === null) return delta === undefined ? base : delta;\r\n\t\tconst result = Array.isArray(base) ? [...base] : { ...base };\r\n\t\tfor(const key in delta) {\r\n\t\t\tconst val = delta[key];\r\n\t\t\tif(val === undefined) delete result[key];\r\n\t\t\telse if(typeof val === 'object' && val !== null && !Array.isArray(val)) result[key] = applyDelta(result[key], val);\r\n\t\t\telse result[key] = val;\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfor(const d of deltas.flat()) base = applyDelta(base, d?.delta ?? d);\r\n\treturn base;\r\n}\r\n\r\n/**\r\n * Creates a nested delta that reverts `target` back to `old`.\r\n * @param old - Original object\r\n * @param updated - Modified object\r\n * @returns New changes\r\n */\r\nexport function calcDelta(old: any, updated: any): any {\r\n\tif(updated == null) return null; // full delete\r\n\tconst delta: any = {};\r\n\tconst isObj = (v: any) => v && typeof v === 'object' && !Array.isArray(v);\r\n\tfor (const key of new Set([...(old ? Object.keys(old) : []), ...(updated ? Object.keys(updated) : [])])) {\r\n\t\tconst oldVal = old?.[key];\r\n\t\tconst newVal = updated?.[key];\r\n\t\tif(isObj(oldVal) && isObj(newVal)) {\r\n\t\t\tconst nested = calcDelta(oldVal, newVal);\r\n\t\t\tif(nested !== null && Object.keys(nested).length > 0) delta[key] = nested;\r\n\t\t} else if(JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\r\n\t\t\tdelta[key] = newVal;\r\n\t\t}\r\n\t}\r\n\treturn Object.keys(delta).length === 0 ? {} : delta;\r\n}\r\n\r\n/**\r\n * Removes any null values from an object in-place\r\n *\r\n * @example\r\n * ```ts\r\n * let test = {a: 0, b: false, c: null, d: 'abc'}\r\n * console.log(clean(test)); // Output: {a: 0, b: false, d: 'abc'}\r\n * ```\r\n *\r\n * @param {T} obj Object reference that will be cleaned\r\n * @param undefinedOnly Ignore null values\r\n * @returns {Partial<T>} Cleaned object\r\n */\r\nexport function clean<T>(obj: T, undefinedOnly = false): Partial<T> {\r\n\tif(obj == null) throw new Error(\"Cannot clean a NULL value\");\r\n\tif(Array.isArray(obj)) {\r\n\t\tobj = <any>obj.filter(o => undefinedOnly ? o !== undefined : o != null);\r\n\t} else {\r\n\t\tObject.entries(obj).forEach(([key, value]) => {\r\n\t\t\tif((undefinedOnly && value === undefined) || (!undefinedOnly && value == null)) delete (<any>obj)[key];\r\n\t\t});\r\n\t}\r\n\treturn <any>obj;\r\n}\r\n\r\n/**\r\n * Create a deep copy of an object (vs. a shallow copy of references)\r\n *\r\n * Should be replaced by `structuredClone` once released.\r\n * @param {T} value Object to copy\r\n * @returns {T} Type\r\n */\r\nexport function deepCopy<T>(value: T): T {\r\n\tif(value == null) return value;\r\n\tconst t = typeof value;\r\n\tif(t === 'string' || t === 'number' || t === 'boolean' || t === 'function') return value;\r\n\ttry {return structuredClone(value); }\r\n\tcatch { return JSON.parse(JSONSanitize(value)); }\r\n}\r\n\r\n/**\r\n * Merge any number of objects into the target\r\n *\r\n * @param target Destination of all properties\r\n * @param sources Objects that will copied into target\r\n * @return {any} The des\r\n */\r\nexport function deepMerge<T>(target: any, ...sources: any[]): T {\r\n\tsources.forEach(s => {\r\n\t\tfor(const key in s) {\r\n\t\t\tif(s[key] && typeof s[key] == 'object' && !Array.isArray(s[key])) {\r\n\t\t\t\tif(!target[key]) target[key] = {};\r\n\t\t\t\tdeepMerge(target[key], s[key]);\r\n\t\t\t} else {\r\n\t\t\t\ttarget[key] = s[key];\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\treturn target;\r\n}\r\n\r\n/**\r\n * Get/set a property of an object using dot notation\r\n *\r\n * @example\r\n * ```ts\r\n * // Get a value\r\n * const name = dotNotation<string>(person, 'firstName');\r\n * const familyCarMake = dotNotation(family, 'cars[0].make');\r\n * // Set a value\r\n * dotNotation(family, 'cars[0].make', 'toyota');\r\n * ```\r\n *\r\n * @type T Return type\r\n * @param {Object} obj source object to search\r\n * @param {string} prop property name (Dot notation & indexing allowed)\r\n * @param {any} set Set object property to value, omit to fetch value instead\r\n * @return {T} property value\r\n */\r\nexport function dotNotation<T>(obj: any, prop: string, set: T): T;\r\nexport function dotNotation<T>(obj: any, prop: string): T | undefined;\r\nexport function dotNotation<T>(obj: any, prop: string, set?: T): T | undefined {\r\n\tif(obj == null || !prop) return undefined;\r\n\t// Split property string by '.' or [index]\r\n\treturn <T>prop.split(/[.[\\]]/g).filter(prop => prop.length).reduce((obj, prop, i, arr) => {\r\n\t\tif(prop[0] == '\"' || prop[0] == \"'\") prop = prop.slice(1, -1); // Take quotes out\r\n\t\tif(!obj?.hasOwnProperty(prop)) {\r\n\t\t\tif(set == undefined) return undefined;\r\n\t\t\tobj[prop] = {};\r\n\t\t}\r\n\t\tif(set !== undefined && i == arr.length - 1)\r\n\t\t\treturn obj[prop] = set;\r\n\t\treturn obj[prop];\r\n\t}, obj);\r\n}\r\n\r\n/**\r\n * Convert object into URL encoded query string\r\n *\r\n * @example\r\n * ```js\r\n * const query = encodeQuery({page: 1, size: 20});\r\n * console.log(query); // Output: \"page=1&size=20\"\r\n * ```\r\n *\r\n * @param {any} data - data to convert\r\n * @returns {string} - Encoded form data\r\n */\r\nexport function encodeQuery(data: any): string {\r\n\treturn Object.entries(data).map(([key, value]) =>\r\n\t\tencodeURIComponent(key) + '=' + encodeURIComponent(<any>value)\r\n\t).join('&');\r\n}\r\n\r\n/**\r\n * Recursively flatten a nested object, while maintaining key structure\r\n *\r\n * @example\r\n * ```ts\r\n * const car = {honda: {model: \"Civic\"}};\r\n * console.log(flattenObj(car)); //Output {honda.model: \"Civic\"}\r\n * ```\r\n *\r\n * @param obj - Object to flatten\r\n * @param parent - Recursively check if key is a parent key or not\r\n * @param result - Result\r\n * @returns {object} - Flattened object\r\n */\r\nexport function flattenObj(obj: any, parent?: any, result: any = {}) {\r\n\tif(typeof obj === \"object\" && !Array.isArray(obj)) {\r\n\t\tfor(const key of Object.keys(obj)) {\r\n\t\t\tconst propName = parent ? `${parent}.${key}` : key;\r\n\t\t\tif(typeof obj[key] === 'object' && obj[key] != null && !Array.isArray(obj[key])) {\r\n\t\t\t\tflattenObj(obj[key], propName, result);\r\n\t\t\t} else {\r\n\t\t\t\tresult[propName] = obj[key];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n}\r\n\r\n/**\r\n * Convert object to FormData\r\n *\r\n * @param target - Object to convert\r\n * @return {FormData} - Form object\r\n */\r\nexport function formData(target: any): FormData {\r\n\tconst data = new FormData();\r\n\tObject.entries(target).forEach(([key, value]) => data.append(key, <any>value));\r\n\treturn data;\r\n}\r\n\r\n/**\r\n * Check that an object has the following values\r\n *\r\n * @example\r\n * ```ts\r\n * const test = {a: 2, b: 2};\r\n * includes(test, {a: 1}); // true\r\n * includes(test, {b: 1, c: 3}); // false\r\n * ```\r\n *\r\n * @param target Object to search\r\n * @param values Criteria to check against\r\n * @param allowMissing Only check the keys that are available on the target\r\n * @returns {boolean} Does target include all the values\r\n */\r\nexport function includes(target: any, values: any, allowMissing = false): boolean {\r\n\tif(target == undefined) return allowMissing;\r\n\tif(Array.isArray(values)) return values.findIndex((e: any, i: number) => !includes(target[i], values[i], allowMissing)) == -1;\r\n\tconst type = typeof values;\r\n\tif(type != typeof target) return false;\r\n\tif(type == 'object') {\r\n\t\treturn Object.keys(values).find(key => !includes(target[key], values[key], allowMissing)) == null;\r\n\t}\r\n\tif(type == 'function') return target.toString() == values.toString();\r\n\treturn target == values;\r\n}\r\n\r\n/**\r\n * Deep check if two items are equal.\r\n * Handles primitives, objects, arrays, functions, Date, RegExp, and circular references.\r\n *\r\n * @param {any} a - first item to compare\r\n * @param {any} b - second item to compare\r\n * @param {WeakMap<object, object>} [seen] - Internal parameter to track circular references\r\n * @returns {boolean} True if they match\r\n */\r\nexport function isEqual(a: any, b: any, seen = new WeakMap<object, object>()): boolean {\r\n\t// Simple cases\r\n\tif(a === b) return true;\r\n\tif(a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\r\n\tif(a instanceof RegExp && b instanceof RegExp) return a.source === b.source && a.flags === b.flags;\r\n\r\n\t// Null checks\r\n\tif(typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n\t\tif(Number.isNaN(a) && Number.isNaN(b)) return true;\r\n\t\tif(typeof a === 'function' && typeof b === 'function') return a.toString() === b.toString()\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Circular references\r\n\tif(seen.has(a)) return seen.get(a) === b;\r\n\tseen.set(a, b);\r\n\tconst isArrayA = Array.isArray(a);\r\n\tconst isArrayB = Array.isArray(b);\r\n\r\n\t// Array checks\r\n\tif(isArrayA && isArrayB) {\r\n\t\tif(a.length !== b.length) return false;\r\n\t\tfor(let i = 0; i < a.length; i++) {\r\n\t\t\tif(!isEqual(a[i], b[i], seen)) return false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\tif(isArrayA !== isArrayB) return false;\r\n\r\n\t// Key & value deep comparison\r\n\tconst keysA = Object.keys(a);\r\n\tconst keysB = Object.keys(b);\r\n\tif(keysA.length !== keysB.length) return false;\r\n\tfor(const key of keysA) {\r\n\t\tif(!Object.prototype.hasOwnProperty.call(b, key) || !isEqual(a[key], b[key], seen)) return false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\n/**\r\n * Experimental: Combine multiple object prototypes into one\r\n *\r\n * @param target Object that will have prototypes added\r\n * @param {any[]} constructors Additionally prototypes that should be merged into target\r\n */\r\nexport function mixin(target: any, constructors: any[]) {\r\n\tconstructors.forEach(c => {\r\n\t\tObject.getOwnPropertyNames(c.prototype).forEach((name) => {\r\n\t\t\tObject.defineProperty(\r\n\t\t\t\ttarget.prototype,\r\n\t\t\t\tname,\r\n\t\t\t\tObject.getOwnPropertyDescriptor(c.prototype, name) ||\r\n\t\t\t\tObject.create(null)\r\n\t\t\t);\r\n\t\t});\r\n\t});\r\n}\r\n\r\n/**\r\n * Run a map function on each property\r\n * @param obj Object that will be iterated\r\n * @param {(key: string, value: any) => any} fn Transformer function - receives key & value\r\n * @returns {{}}\r\n */\r\nexport function objectMap<T>(obj: any, fn: (key: string, value: any) => any): T {\r\n\treturn <any>Object.entries(obj).map(([key, value]: [string, any]) => [key, fn(key, value)])\r\n\t\t.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\r\n}\r\n","import {isEqual} from './objects.ts';\n\n/**\n * An array which functions as a set. It guarantees unique elements\n * and provides set functions for comparisons\n */\nexport class ASet<T> extends Array {\n\t/** Number of elements in set */\n\tget size() {\n\t\treturn this.length;\n\t}\n\n\t/**\n\t * Array to create set from, duplicate values will be removed\n\t * @param {T[]} elements Elements which will be added to set\n\t */\n\tconstructor(elements: T[] = []) {\n\t\tsuper();\n\t\tif(!!elements?.['forEach'])\n\t\t\telements.forEach(el => this.add(el));\n\t}\n\n\t/**\n\t * Add elements to set if unique\n\t * @param items\n\t */\n\tadd(...items: T[]) {\n\t\titems.filter(el => !this.has(el)).forEach(el => this.push(el));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove all elements\n\t */\n\tclear() {\n\t\tthis.splice(0, this.length);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Delete elements from set\n\t * @param items Elements that will be deleted\n\t */\n\tdelete(...items: T[]) {\n\t\titems.forEach(el => {\n\t\t\tconst index = this.indexOf(el);\n\t\t\tif(index != -1) this.splice(index, 1);\n\t\t})\n\t\treturn this;\n\t}\n\n\t/**\n\t * Create list of elements this set has which the comparison set does not\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {ASet<T>} Different elements\n\t */\n\tdifference(set: ASet<T>) {\n\t\treturn new ASet<T>(this.filter(el => !set.has(el)));\n\t}\n\n\t/**\n\t * Check if set includes element\n\t * @param {T} el Element to look for\n\t * @return {boolean} True if element was found, false otherwise\n\t */\n\thas(el: T) {\n\t\treturn this.indexOf(el) != -1;\n\t}\n\n\t/**\n\t * Find index number of element, or -1 if it doesn't exist. Matches by equality not reference\n\t *\n\t * @param {T} search Element to find\n\t * @param {number} fromIndex Starting index position\n\t * @return {number} Element index number or -1 if missing\n\t */\n\tindexOf(search: T, fromIndex?: number): number {\n\t\treturn super.findIndex((el: T) => isEqual(el, search), fromIndex);\n\t}\n\n\t/**\n\t * Create list of elements this set has in common with the comparison set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} Set of common elements\n\t */\n\tintersection(set: ASet<T>) {\n\t\treturn new ASet<T>(this.filter(el => set.has(el)));\n\t}\n\n\t/**\n\t * Check if this set has no elements in common with the comparison set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} True if nothing in common, false otherwise\n\t */\n\tisDisjointFrom(set: ASet<T>) {\n\t\treturn this.intersection(set).size == 0;\n\t}\n\n\t/**\n\t * Check if all elements in this set are included in the comparison set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} True if all elements are included, false otherwise\n\t */\n\tisSubsetOf(set: ASet<T>) {\n\t\treturn this.findIndex(el => !set.has(el)) == -1;\n\t}\n\n\t/**\n\t * Check if all elements from comparison set are included in this set\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {boolean} True if all elements are included, false otherwise\n\t */\n\tisSuperset(set: ASet<T>) {\n\t\treturn set.findIndex(el => !this.has(el)) == -1;\n\t}\n\n\t/**\n\t * Create list of elements that are only in one set but not both (XOR)\n\t * @param {ASet<T>} set Set to compare against\n\t * @return {ASet<T>} New set of unique elements\n\t */\n\tsymmetricDifference(set: ASet<T>) {\n\t\treturn new ASet([...this.difference(set), ...set.difference(this)]);\n\t}\n\n\t/**\n\t * Create joined list of elements included in this & the comparison set\n\t * @param {ASet<T>} set Set join\n\t * @return {ASet<T>} New set of both previous sets combined\n\t */\n\tunion(set: ASet<T> | Array<T>) {\n\t\treturn new ASet([...this, ...set]);\n\t}\n}\n","import {ASet} from './aset.ts';\nimport {dotNotation, isEqual} from './objects';\n\n/**\n * Only add element to array if it isn't already included\n *\n * @example\n * ```js\n * const arr = addUnique([1, 2, 3], 3);\n * console.log(arr); // Output: [1, 2, 3]\n * ```\n *\n * @param {T[]} array Target array element will be added to\n * @param {T} el Unique element to add\n * @return {T[]} Array with element if it was unique\n * @deprecated Use ASet to create unique arrays\n */\nexport function addUnique<T>(array: T[], el: T): T[] {\n\tif(array.indexOf(el) === -1) array.push(el);\n\treturn array;\n}\n\n/**\n * Find all unique elements in arrays\n *\n * @param {any[]} a First array to compare\n * @param {any[]} b Second array to compare\n * @return {any[]} Unique elements\n * @deprecated Use ASet to perform Set operations on arrays\n */\nexport function arrayDiff(a: any[], b: any[]): any[] {\n\treturn new ASet(a).symmetricDifference(new ASet(b));\n}\n\n/**\n * Provides a shorthand for sorting arrays of complex objects by a string property\n *\n * @example\n * ```ts\n * let arr = [{a: 'Apple', b: 123}, {a: 'Carrot', b: 789}, {a: 'banana', b: 456}];\n * arr.sort(caseInsensitiveSort('a'));\n * ```\n *\n * @param {string} prop - Name of property to use, supports dot notation\n * @returns {(a, b) => (number)} - Function to handle sort (Meant to be passed to Array.prototype.sort or used in sortFn)\n */\nexport function caseInsensitiveSort(prop: string) {\n\treturn function (a: any, b: any) {\n\t\tconst aVal = dotNotation<string>(a, prop);\n\t\tconst bVal = dotNotation<string>(b, prop);\n\t\tif(typeof aVal !== 'string' || typeof bVal !== 'string') return 1;\n\t\treturn aVal.toLowerCase().localeCompare(bVal.toLowerCase());\n\t};\n}\n\n/**\n * Shorthand to find objects with a property value\n *\n * @example\n * ```js\n * const found = [\n * {name: 'Batman'},\n * {name: 'Superman'},\n * ].filter(findByProp('name', 'Batman'));\n * ```\n *\n * @param {string} prop Property to compare (Dot nation supported)\n * @param value Value property must have\n * @return {(v: any) => boolean} Function used by `filter` or `find`\n */\nexport function findByProp(prop: string, value: any) {\n\treturn (v: any) => isEqual(dotNotation(v, prop), value);\n}\n\n/**\n * Recursively flatten nested arrays\n *\n * @example\n * ```ts\n * const arr = [\n * {label: null, url: '/'},\n * {label: 'Model Admin', url: '/model-admin'},\n * [\n * {label: 'Elements', url: '/model-admin/elements'},\n * {label: 'Example', url: null}\n * ]\n * ];\n *\n * console.log(flattenArr(arr));\n * // Output:\n * [\n * {label: null, url: '/'},\n * {label: 'Model Admin', url: '/model-admin'},\n * {label: 'Elements', url: '/model-admin/elements'},\n * {label: 'Example', url: null}\n * ]\n * ```\n *\n * @param {any[]} arr - n-dimensional array\n * @param {any[]} result - Internal use only -- Keeps track of recursion\n * @returns {any[]} - Flattened array\n */\nexport function flattenArr(arr: any[], result: any[] = []): any[] {\n\tarr.forEach(el => Array.isArray(el) ? flattenArr(el, result) : result.push(el));\n\treturn result;\n}\n\n/**\n * Provides a shorthand for sorting arrays of complex objects\n *\n * @example\n * ```ts\n * let arr = [{a: {b: 2}}, {a: {b: 3}}, {a: {b: 1}}];\n * arr.sort(sortByProp('a.b'));\n * ```\n *\n * @param {string} prop - Name of property to use, supports dot notation\n * @param {boolean} reverse - Reverse the order of the sort\n * @returns {(a, b) => (number)} - Function to handle sort (Meant to be passed to Array.prototype.sort)\n */\nexport function sortByProp(prop: string, reverse = false) {\n\treturn function (a: any, b: any) {\n\t\tconst aVal = dotNotation<any>(a, prop);\n\t\tconst bVal = dotNotation<any>(b, prop);\n\t\tif(typeof aVal == 'number' && typeof bVal == 'number')\n\t\t\treturn (reverse ? -1 : 1) * (aVal - bVal);\n\t\tif(aVal > bVal) return reverse ? -1 : 1;\n\t\tif(aVal < bVal) return reverse ? 1 : -1;\n\t\treturn 0;\n\t};\n}\n\n/**\n * Make sure every element in array is unique\n *\n * @param {any[]} arr Array that will be filtered in place\n * @return {any[]} Original array\n * @deprecated Please use ASet to create a guaranteed unique array\n */\nexport function makeUnique(arr: any[]) {\n\tfor(let i = arr.length - 1; i >= 0; i--) {\n\t\tif(arr.slice(0, i).find(n => isEqual(n, arr[i]))) arr.splice(i, 1);\n\t}\n\treturn arr;\n}\n\n/**\n * Make sure value is an array, if it isn't wrap it in one\n *\n * @param {T[] | T} value Value that should be an array\n * @returns {T[]} Value in an array\n */\nexport function makeArray<T>(value: T | T[]): T[] {\n\treturn Array.isArray(value) ? value : [value];\n}\n","import {Database, Table} from './database.ts';\nimport {JSONSanitize} from './json.ts';\nimport {deepCopy, includes} from './objects.ts';\n\nexport type CacheOptions = {\n\t/** Delete keys automatically after x amount of seconds */\n\tttl?: number;\n\t/** Storage to persist cache */\n\tpersistentStorage?: {storage: Storage | Database, key: string} | string;\n\t/** Keep or delete cached items once expired, defaults to delete */\n\texpiryPolicy?: 'delete' | 'keep';\n\t/** Least Recently Used size limit */\n\tsizeLimit?: number;\n}\n\nexport type CachedValue<T> = T & {_expired?: boolean};\n\n/**\n * Map of data which tracks whether it is a complete collection & offers optional expiry of cached values\n */\nexport class Cache<K extends string | number | symbol, T> {\n\tprivate _loading!: Function;\n\tprivate store: Map<K, T> = new Map();\n\tprivate timers: Map<K, NodeJS.Timeout> = new Map();\n\tprivate lruOrder: K[] = [];\n\n\t/** Support index lookups */\n\t[key: string | number | symbol]: CachedValue<T> | any;\n\t/** Whether cache is complete */\n\tcomplete = false;\n\t/** Await initial loading */\n\tloading = new Promise<void>(r => this._loading = r);\n\n\t/**\n\t * Create new cache\n\t * @param {keyof T} key Default property to use as primary key\n\t * @param options\n\t */\n\tconstructor(public readonly key?: keyof T, public readonly options: CacheOptions = {}) {\n\t\t// Persistent storage\n\t\tif(this.options.persistentStorage != null) {\n\t\t\tif(typeof this.options.persistentStorage == 'string')\n\t\t\t\tthis.options.persistentStorage = {storage: localStorage, key: this.options.persistentStorage};\n\n\t\t\tif(this.options.persistentStorage?.storage?.database != undefined) {\n\t\t\t\t(async () => {\n\t\t\t\t\tconst persists: any = this.options.persistentStorage;\n\t\t\t\t\tconst table: Table<any, any> = await persists.storage.createTable({name: persists.key, key: this.key});\n\t\t\t\t\tconst rows = await table.getAll();\n\t\t\t\t\tfor(const row of rows) this.store.set(this.getKey(row), row);\n\t\t\t\t\tthis._loading();\n\t\t\t\t})();\n\t\t\t} else if((<any>this.options.persistentStorage?.storage)?.getItem != undefined) {\n\t\t\t\tconst {storage, key} = <{storage: Storage, key: string}>this.options.persistentStorage;\n\t\t\t\tconst stored = storage.getItem(key);\n\t\t\t\tif(stored != null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst obj = JSON.parse(stored);\n\t\t\t\t\t\tfor(const k of Object.keys(obj)) this.store.set(<any>k, obj[k]);\n\t\t\t\t\t} catch { /* ignore */ }\n\t\t\t\t}\n\t\t\t\tthis._loading();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._loading();\n\t\t}\n\n\t\t// Handle index lookups\n\t\treturn new Proxy(this, {\n\t\t\tget: (target: this, prop: string | symbol) => {\n\t\t\t\tif(prop in target) return (target as any)[prop];\n\t\t\t\treturn this.get(prop as K, true);\n\t\t\t},\n\t\t\tset: (target: this, prop: string | symbol, value: any) => {\n\t\t\t\tif(prop in target) (target as any)[prop] = value;\n\t\t\t\telse this.set(prop as K, value);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getKey(value: T): K {\n\t\tif(!this.key) throw new Error('No key defined');\n\t\tif((value as any)[this.key] === undefined) throw new Error(`${this.key.toString()} Doesn't exist on ${JSON.stringify(value, null, 2)}`);\n\t\treturn <K>(value as any)[this.key];\n\t}\n\n\t/** Save item to storage */\n\tprivate save(key?: K) {\n\t\tconst persists: {storage: any, key: string} = <any>this.options.persistentStorage;\n\t\tif(!!persists?.storage) {\n\t\t\tif(persists.storage?.database != undefined) {\n\t\t\t\t(<Database>persists.storage).createTable({name: persists.key, key: <string>this.key}).then(table => {\n\t\t\t\t\tif(key !== undefined) {\n\t\t\t\t\t\tconst value = this.get(key, true);\n\t\t\t\t\t\tif(value != null) table.set(value, key);\n\t\t\t\t\t\telse table.delete(key);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttable.clear();\n\t\t\t\t\t\tthis.all(true).forEach(row => table.add(row));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if(persists.storage?.setItem != undefined) {\n\t\t\t\tconst obj: Record<any, any> = {};\n\t\t\t\tfor(const [k, v] of this.store.entries()) obj[k as any] = v;\n\t\t\t\tpersists.storage.setItem(persists.key, JSONSanitize(obj));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate clearTimer(key: K) {\n\t\tconst t = this.timers.get(key);\n\t\tif(t) { clearTimeout(t); this.timers.delete(key); }\n\t}\n\n\tprivate touchLRU(key: K) {\n\t\tif(!this.options.sizeLimit || this.options.sizeLimit <= 0) return;\n\t\tconst idx = this.lruOrder.indexOf(key);\n\t\tif(idx >= 0) this.lruOrder.splice(idx, 1);\n\t\tthis.lruOrder.push(key);\n\t\twhile(this.lruOrder.length > (this.options.sizeLimit || 0)) {\n\t\t\tconst lru = this.lruOrder.shift();\n\t\t\tif(lru !== undefined) this.delete(lru);\n\t\t}\n\t}\n\n\t/**\n\t * Get all cached items\n\t * @return {T[]} Array of items\n\t */\n\tall(expired?: boolean): CachedValue<T>[] {\n\t\tconst out: CachedValue<T>[] = [];\n\t\tfor(const v of this.store.values()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) out.push(deepCopy(val));\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * Add a new item to the cache. Like set, but finds key automatically\n\t */\n\tadd(value: T, ttl = this.ttl): this {\n\t\tconst key = this.getKey(value);\n\t\tthis.set(key, value, ttl);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add several rows to the cache\n\t */\n\taddAll(rows: T[], complete = true): this {\n\t\tthis.clear();\n\t\trows.forEach(r => this.add(r));\n\t\tthis.complete = complete;\n\t\treturn this;\n\t}\n\n\t/** Remove all keys */\n\tclear(): this {\n\t\tthis.complete = false;\n\t\tfor (const [k, t] of this.timers) clearTimeout(t);\n\t\tthis.timers.clear();\n\t\tthis.lruOrder = [];\n\t\tthis.store.clear();\n\t\tthis.save();\n\t\treturn this;\n\t}\n\n\t/** Delete a cached item */\n\tdelete(key: K): this {\n\t\tthis.clearTimer(key);\n\t\tconst idx = this.lruOrder.indexOf(key);\n\t\tif(idx >= 0) this.lruOrder.splice(idx, 1);\n\t\tthis.store.delete(key);\n\t\tthis.save(key);\n\t\treturn this;\n\t}\n\n\t/** Return entries as array */\n\tentries(expired?: boolean): [K, CachedValue<T>][] {\n\t\tconst out: [K, CachedValue<T>][] = [];\n\t\tfor(const [k, v] of this.store.entries()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) out.push([k, deepCopy(val)]);\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Manually expire a cached item */\n\texpire(key: K): this {\n\t\tthis.complete = false;\n\t\tif(this.options.expiryPolicy == 'keep') {\n\t\t\tconst v: any = this.store.get(key);\n\t\t\tif(v) {\n\t\t\t\tv._expired = true;\n\t\t\t\tthis.store.set(key, v);\n\t\t\t\tthis.save(key);\n\t\t\t}\n\t\t} else this.delete(key);\n\t\treturn this;\n\t}\n\n\t/** Find first matching item */\n\tfind(filter: Partial<T>, expired?: boolean): T | undefined {\n\t\tfor(const v of this.store.values()) {\n\t\t\tconst row: any = v;\n\t\t\tif((expired || !row._expired) && includes(row, filter)) return deepCopy(row);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Get cached item by key */\n\tget(key: K, expired?: boolean): CachedValue<T> | null {\n\t\tconst raw = this.store.get(key);\n\t\tif(raw == null) return null;\n\t\tthis.touchLRU(key);\n\t\tconst isExpired = (raw as any)?._expired;\n\t\tif(expired || !isExpired) return deepCopy(raw);\n\t\treturn null;\n\t}\n\n\t/** Return list of keys */\n\tkeys(expired?: boolean): K[] {\n\t\tconst out: K[] = [];\n\t\tfor(const [k, v] of this.store.entries()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) out.push(k);\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Return map of key → item */\n\tmap(expired?: boolean): Record<K, CachedValue<T>> {\n\t\tconst copy: any = {};\n\t\tfor(const [k, v] of this.store.entries()) {\n\t\t\tconst val: any = v;\n\t\t\tif(expired || !val?._expired) copy[k as any] = deepCopy(val);\n\t\t}\n\t\treturn copy;\n\t}\n\n\t/** Add item manually specifying the key */\n\tset(key: K, value: T, ttl = this.options.ttl): this {\n\t\tif(this.options.expiryPolicy == 'keep') delete (<any>value)._expired;\n\t\tthis.clearTimer(key);\n\t\tthis.store.set(key, value);\n\t\tthis.touchLRU(key);\n\t\tthis.save(key);\n\t\tif(ttl) {\n\t\t\tconst t = setTimeout(() => {\n\t\t\t\tthis.expire(key);\n\t\t\t\tthis.save(key);\n\t\t\t}, ttl * 1000);\n\t\t\tthis.timers.set(key, t);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/** Get all cached items */\n\tvalues = this.all;\n}\n","/**\n * Determine if either black or white provides more contrast to the provided color\n * @param {string} background Color to compare against\n * @return {\"white\" | \"black\"} Color with the most contrast\n */\nexport function contrast(background: string): 'white' | 'black' {\n\tconst exploded = background?.match(background.length >= 6 ? /[0-9a-fA-F]{2}/g : /[0-9a-fA-F]/g);\n\tif(!exploded || exploded?.length < 3) return 'black';\n\tconst [r, g, b] = exploded.map(hex => parseInt(hex.length == 1 ? `${hex}${hex}` : hex, 16));\n\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\treturn luminance > 0.5 ? 'black' : 'white';\n}\n","/**\r\n * String of all letters\r\n */\r\nexport const LETTER_LIST = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n\r\n/**\r\n * String of all numbers\r\n */\r\nexport const NUMBER_LIST = '0123456789';\r\n\r\n/**\r\n * String of all symbols\r\n */\r\nexport const SYMBOL_LIST = '~`!@#$%^&*()_-+={[}]|\\\\:;\"\\'<,>.?/';\r\n\r\n/**\r\n * String of all letters, numbers & symbols\r\n */\r\nexport const CHAR_LIST = LETTER_LIST + LETTER_LIST.toLowerCase() + NUMBER_LIST + SYMBOL_LIST;\r\n\r\n/**\r\n * Converts text to camelCase\r\n */\r\nexport function camelCase(str?: string): string {\r\n\tif(!str) return '';\r\n\tconst pascal = pascalCase(str);\r\n\treturn pascal.charAt(0).toLowerCase() + pascal.slice(1);\r\n}\r\n\r\n\r\n/**\r\n * Convert number of bytes into a human-readable size\r\n *\r\n * @param {number} bytes Number of bytes\r\n * @param {number} decimals Decimal places to preserve\r\n * @return {string} Formated size\r\n */\r\nexport function formatBytes(bytes: number, decimals = 2) {\r\n\tif (bytes === 0) return '0 Bytes';\r\n\tconst k = 1024;\r\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * Convert milliseconds to human-readable duration\r\n * @param {string} ms milliseconds\r\n * @param {boolean} short Use unit initial instead of word\r\n * @return {string} formated duration\r\n */\r\nexport function formatMs(ms: number, short = false): string {\r\n\tif (isNaN(ms) || ms < 0) return \"Invalid input\";\r\n\tconst seconds = ms / 1000;\r\n\tconst minutes = seconds / 60;\r\n\tconst hours = minutes / 60;\r\n\tconst days = hours / 24;\r\n\tif (days >= 1) return `${days.toFixed(1)} ${short ? 'd' : 'days'}`;\r\n\telse if (hours >= 1) return `${hours.toFixed(1)} ${short ? 'h' : 'hours'}`;\r\n\telse if (minutes >= 1) return `${minutes.toFixed(1)} ${short ? 'm' : 'minutes'}`;\r\n\telse return `${seconds.toFixed(1)} ${short ? 's' : 'seconds'}`;\r\n}\r\n\r\n/**\r\n * Extract numbers from a string & create a formated phone number: +1 (123) 456-7890\r\n *\r\n * @param {string} number String that will be parsed for numbers\r\n * @return {string} Formated phone number\r\n */\r\nexport function formatPhoneNumber(number: string) {\r\n\tconst parts = /(\\+?1)?.*?(\\d{3}).*?(\\d{3}).*?(\\d{4})/g.exec(number);\r\n\tif(!parts) throw new Error(`Number cannot be parsed: ${number}`);\r\n\treturn `${parts[1] ? '+1' : ''} (${parts[2]}) ${parts[3]}-${parts[4]}`.trim();\r\n}\r\n\r\n/**\r\n * Insert a string into another string at a given position\r\n *\r\n * @example\r\n * ```js\r\n * console.log(insertAt('Hello world!', ' glorious', 5);\r\n * // Output: Hello glorious world!\r\n * ```\r\n *\r\n * @param {string} target - Parent string you want to modify\r\n * @param {string} str - Value that will be injected to parent\r\n * @param {number} index - Position to inject string at\r\n * @returns {string} - New string\r\n * @deprecated use `strSplice()`\r\n */\r\nexport function insertAt(target: string, str: string, index: number): String {\r\n\treturn `${target.slice(0, index)}${str}${target.slice(index + 1)}`;\r\n}\r\n\r\n/**\r\n * Converts text to kebab-case\r\n */\r\nexport function kebabCase(str?: string): string {\r\n\tif(!str) return '';\r\n\treturn wordSegments(str).map(w => w.toLowerCase()).join(\"-\");\r\n}\r\n\r\n\r\n/**\r\n * Add padding to string\r\n *\r\n * @example\r\n * ```js\r\n * const now = new Date();\r\n * const padded = now.getHours() + ':' + pad(now.getMinutes(), 2, '0');\r\n * console.log(padded); // Output: \"2:05\"\r\n * ```\r\n *\r\n * @param text Text that will be padded\r\n * @param {number} length Target length\r\n * @param {string} char Character to use as padding, defaults to space\r\n * @param {boolean} start Will pad start of text if true, or the end if false\r\n * @return {string} Padded string\r\n * @deprecated Please use `String.padStart` & `String.padEnd`\r\n */\r\nexport function pad(text: any, length: number, char: string = ' ', start = true) {\r\n\tif(start) return text.toString().padStart(length, char);\r\n\treturn text.toString().padEnd(length, char);\r\n}\r\n\r\n/**\r\n * Convert text to PascalCase\r\n * @param {string} str\r\n * @return {string}\r\n */\r\nexport function pascalCase(str?: string): string {\r\n\tif(!str) return '';\r\n\treturn wordSegments(str)\r\n\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\r\n\t\t.join('');\r\n}\r\n\r\n\r\n\r\n/**\r\n * Generate a random hexadecimal value\r\n *\r\n * @param {number} length Number of hexadecimal place values\r\n * @return {string} Hexadecimal number as a string\r\n */\r\nexport function randomHex(length: number) {\r\n\treturn Array(length).fill(null).map(() => Math.round(Math.random() * 0xF).toString(16)).join('');\r\n}\r\n\r\n/**\r\n * Generate a string of random characters.\r\n *\r\n * @example\r\n * ```ts\r\n * const random = randomString();\r\n * const randomByte = randomString(8, \"01\")\r\n * ```\r\n *\r\n * @param {number} length - length of generated string\r\n * @param {string} pool - character pool to generate string from\r\n * @return {string} generated string\r\n */\r\nexport function randomString(length: number, pool: string = CHAR_LIST): string {\r\n\treturn Array(length).fill(null).map(() => {\r\n\t\tconst n = ~~(Math.random() * pool.length);\r\n\t\treturn pool[n];\r\n\t}).join('');\r\n}\r\n\r\n/**\r\n * Generate a random string with fine control over letters, numbers & symbols\r\n *\r\n * @example\r\n * ```ts\r\n * const randomLetter = randomString(1, true);\r\n * const randomChar = randomString(1, true, true, true);\r\n * ```\r\n *\r\n * @param {number} length - length of generated string\r\n * @param {boolean} letters - Add letters to pool\r\n * @param {boolean} numbers - Add numbers to pool\r\n * @param {boolean} symbols - Add symbols to pool\r\n * @return {string} generated string\r\n */\r\nexport function randomStringBuilder(length: number, letters = false, numbers = false, symbols = false): string {\r\n\tif(!letters && !numbers && !symbols) throw new Error('Must enable at least one: letters, numbers, symbols');\r\n\treturn Array(length).fill(null).map(() => {\r\n\t\tlet c;\r\n\t\tdo {\r\n\t\t\tconst type = ~~(Math.random() * 3);\r\n\t\t\tif(letters && type == 0) {\r\n\t\t\t\tc = LETTER_LIST[~~(Math.random() * LETTER_LIST.length)];\r\n\t\t\t} else if(numbers && type == 1) {\r\n\t\t\t\tc = NUMBER_LIST[~~(Math.random() * NUMBER_LIST.length)];\r\n\t\t\t} else if(symbols && type == 2) {\r\n\t\t\t\tc = SYMBOL_LIST[~~(Math.random() * SYMBOL_LIST.length)];\r\n\t\t\t}\r\n\t\t} while(!c);\r\n\t\treturn c;\r\n\t}).join('');\r\n}\r\n\r\n/**\r\n * Converts text to snake_case\r\n */\r\nexport function snakeCase(str?: string): string {\r\n\tif(!str) return '';\r\n\treturn wordSegments(str).map(w => w.toLowerCase()).join(\"_\");\r\n}\r\n\r\n\r\n/**\r\n * Splice a string together (Similar to Array.splice)\r\n *\r\n * @param {string} str String that will be modified\r\n * @param {number} start Start index of splice\r\n * @param {number} deleteCount Number of characters to remove in splice\r\n * @param {string} insert Insert new string into splice\r\n * @return {string} Returned spliced string\r\n */\r\nexport function strSplice(str: string, start: number, deleteCount: number, insert = '') {\r\n\tconst before = str.slice(0, start);\r\n\tconst after = str.slice(start + deleteCount);\r\n\treturn before + insert + after;\r\n}\r\n\r\n/**\r\n * Find all substrings that match a given pattern.\r\n *\r\n * Roughly based on `String.prototype.matchAll`.\r\n *\r\n * @param {string} value - String to search.\r\n * @param {RegExp | string} regex - Regular expression to match.\r\n * @return {RegExpExecArray[]} Found matches.\r\n */\r\nexport function matchAll(value: string, regex: RegExp | string): RegExpExecArray[] {\r\n\tif(typeof regex === 'string') {\r\n\t\tregex = new RegExp(regex, 'g');\r\n\t}\r\n\r\n\t// https://stackoverflow.com/a/60290199\r\n\tif(!regex.global) {\r\n\t\tthrow new TypeError('Regular expression must be global.');\r\n\t}\r\n\r\n\tlet ret: RegExpExecArray[] = [];\r\n\tlet match: RegExpExecArray | null;\r\n\twhile((match = regex.exec(value)) !== null) {\r\n\t\tret.push(match);\r\n\t}\r\n\r\n\treturn ret;\r\n}\r\n\r\n/** Parts of a URL */\r\nexport type ParsedUrl = {\r\n\tprotocol?: string,\r\n\tsubdomain?: string,\r\n\tdomain: string,\r\n\thost: string,\r\n\tport?: number,\r\n\tpath?: string,\r\n\tquery?: {[name: string]: string}\r\n\tfragment?: string\r\n}\r\n\r\n/**\r\n * Break a URL string into its parts for easy parsing\r\n *\r\n * @param {string} url URL string that will be parsed\r\n * @returns {RegExpExecArray} Parts of URL\r\n * @deprecated Use built-in URL object: `new URL('...')`;\r\n */\r\nexport function parseUrl(url: string): ParsedUrl {\r\n\tconst processed = new RegExp(\r\n\t\t'(?:(?<protocol>[\\\\w\\\\d]+)\\\\:\\\\/\\\\/)?(?:(?<user>.+)\\\\@)?(?<host>(?<domain>[^:\\\\/\\\\?#@\\\\n]+)(?:\\\\:(?<port>\\\\d*))?)(?<path>\\\\/.*?)?(?:\\\\?(?<query>.*?))?(?:#(?<fragment>.*?))?$',\r\n\t\t'gm').exec(url);\r\n\tconst groups: ParsedUrl = <any>processed?.groups ?? {};\r\n\tconst domains = groups.domain.split('.');\r\n\tif(groups['port'] != null) groups.port = Number(groups.port);\r\n\tif(domains.length > 2) {\r\n\t\tgroups.domain = domains.splice(-2, 2).join('.');\r\n\t\tgroups.subdomain = domains.join('.');\r\n\t}\r\n\tif(groups.query) {\r\n\t\tconst split = (<any>groups.query).split('&'), query: any = {};\r\n\t\tsplit.forEach((q: any) => {\r\n\t\t\tconst [key, val] = q.split('=');\r\n\t\t\tquery[key] = val;\r\n\t\t});\r\n\t\tgroups.query = query;\r\n\t}\r\n\treturn groups;\r\n}\r\n\r\n\r\n/**\r\n * Create MD5 hash using native javascript\r\n *\r\n * @param d String to hash\r\n * @returns {string} Hashed string\r\n */\r\nexport function md5(d: string) {\r\n\tvar r = M(V(Y(X(d),8*d.length)));return r.toLowerCase()};\r\n\tfunction M(d:any){for(var _,m=\"0123456789ABCDEF\",f=\"\",r=0;r<d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_>>>4&15)+m.charAt(15&_);return f}\r\n\tfunction X(d:any){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<<m%32;return _}\r\n\tfunction V(d:any){for(var _=\"\",m=0;m<32*d.length;m+=8)_+=String.fromCharCode(d[m>>5]>>>m%32&255);return _}\r\n\tfunction Y(d:any,_:any){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n<d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}\r\n\tfunction md5_cmn(d:any,_:any,m:any,f:any,r:any,i:any){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}\r\n\tfunction md5_ff(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(_&m|~_&f,d,_,r,i,n)}\r\n\tfunction md5_gg(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(_&f|m&~f,d,_,r,i,n)}\r\n\tfunction md5_hh(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(_^m^f,d,_,r,i,n)}\r\n\tfunction md5_ii(d:any,_:any,m:any,f:any,r:any,i:any,n:any){return md5_cmn(m^(_|~f),d,_,r,i,n)}\r\n\tfunction safe_add(d:any,_:any){var m=(65535&d)+(65535&_);return(d>>16)+(_>>16)+(m>>16)<<16|65535&m}\r\n\tfunction bit_rol(d:any,_:any){return d<<_|d>>>32-_\r\n}\r\n\r\n/**\r\n * Splits a string into logical word segments\r\n */\r\nexport function wordSegments(str?: string): string[] {\r\n\tif (!str) return [];\r\n\treturn str\r\n\t\t.replace(/([a-z])([A-Z])/g, \"$1 $2\")\r\n\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\r\n\t\t.replace(/([0-9]+)([a-zA-Z])/g, \"$1 $2\")\r\n\t\t.replace(/([a-zA-Z])([0-9]+)/g, \"$1 $2\")\r\n\t\t.replace(/[_\\-\\s]+/g, \" \")\r\n\t\t.trim()\r\n\t\t.split(/\\s+/)\r\n\t\t.filter(Boolean);\r\n}\r\n\r\n\r\n/**\r\n * Check if email is valid\r\n *\r\n * @param {string} email - Target\r\n * @returns {boolean} - Follows format\r\n */\r\nexport function validateEmail(email: string) {\r\n\treturn /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(email);\r\n}\r\n","import {makeArray} from './array.ts';\nimport {ASet} from './aset.ts';\nimport {JSONSanitize} from './json.ts';\nimport {dotNotation, flattenObj} from './objects.ts';\nimport {LETTER_LIST} from './string.ts';\n\n/**\n * Parse a CSV string into an array of objects\n *\n * @param csv String with CSV\n * @param hasHeaders First line of CSV contains headers\n * @return {T[]} Array of parsed objects\n */\nexport function fromCsv<T = any>(csv: string, hasHeaders = true): T[] {\n\tfunction parseLine(line: string): (string | null)[] {\n\t\tconst columns: string[] = [];\n\t\tlet current = '', inQuotes = false;\n\t\tfor (let i = 0; i < line.length; i++) {\n\t\t\tconst char = line[i];\n\t\t\tconst nextChar = line[i + 1];\n\t\t\tif (char === '\"') {\n\t\t\t\tif (inQuotes && nextChar === '\"') {\n\t\t\t\t\tcurrent += '\"'; // Handle escaped quotes\n\t\t\t\t\ti++;\n\t\t\t\t} else inQuotes = !inQuotes;\n\t\t\t} else if (char === ',' && !inQuotes) {\n\t\t\t\tcolumns.push(current.trim()); // Trim column values\n\t\t\t\tcurrent = '';\n\t\t\t} else current += char;\n\t\t}\n\t\tcolumns.push(current.trim()); // Trim last column value\n\t\treturn columns.map(col => col.replace(/^\"|\"$/g, '').replace(/\"\"/g, '\"'));\n\t}\n\n\t// Normalize line endings and split rows\n\tconst rows = [];\n\tlet currentRow = '', inQuotes = false;\n\tfor (const char of csv.replace(/\\r\\n/g, '\\n')) { // Normalize \\r\\n to \\n\n\t\tif (char === '\"') inQuotes = !inQuotes;\n\t\tif (char === '\\n' && !inQuotes) {\n\t\t\trows.push(currentRow.trim()); // Trim row\n\t\t\tcurrentRow = '';\n\t\t} else currentRow += char;\n\t}\n\tif (currentRow) rows.push(currentRow.trim()); // Trim last row\n\n\t// Extract headers\n\tlet headers: any = hasHeaders ? rows.splice(0, 1)[0] : null;\n\tif (headers) headers = headers.match(/(?:[^,\"']+|\"(?:[^\"]|\"\")*\"|'(?:[^']|'')*')+/g)?.map((h: any) => h.trim());\n\n\t// Parse rows\n\treturn <T[]>rows.map(r => {\n\t\tconst props = parseLine(r);\n\t\tconst h = headers || (Array(props.length).fill(null).map((_, i) => {\n\t\t\tlet letter = '';\n\t\t\tconst first = i / 26;\n\t\t\tif (first > 1) letter += LETTER_LIST[Math.floor(first - 1)];\n\t\t\tletter += LETTER_LIST[i % 26];\n\t\t\treturn letter;\n\t\t}));\n\t\treturn h.reduce((acc: any, h: any, i: number) => {\n\t\t\tdotNotation(acc, h, props[i]);\n\t\t\treturn acc;\n\t\t}, {});\n\t});\n}\n\n\n/**\n * Convert an array of objects to a CSV string\n *\n * @param {any[]} target Array of objects to create CSV from\n * @param {boolean} flatten Should nested object be flattened or treated as values\n * @return {string} CSV string\n */\nexport function toCsv(target: any, flatten=true) {\n\tconst t = makeArray(target);\n\tconst headers = new ASet(t.reduce((acc, row) => [...acc, ...Object.keys(flatten ? flattenObj(row) : row)], []));\n\treturn [\n\t\theaders.join(','),\n\t\t...t.map(row => headers.map((h: string) => {\n\t\t\tconst value = dotNotation<any>(row, h);\n\t\t\tif(value == null) return '';\n\t\t\tif(typeof value == 'object') return `\"${JSONSanitize(value).replaceAll('\"', '\"\"')}\"`;\n\t\t\tif(typeof value == 'string' && /[\\n\",]/g.test(value)) return `\"${value.replaceAll('\"', '\"\"')}\"`;\n\t\t\treturn value;\n\t\t}).join(','))\n\t].join('\\n');\n}\n","/**\r\n * Like setInterval but will adjust the timeout value to account for runtime\r\n * @param {Function} cb Callback function that will be ran\r\n * @param {number} ms Run function ever x seconds\r\n * @return {() => void}\r\n */\r\nexport function adjustedInterval(cb: Function, ms: number) {\r\n\tlet cancel = false, timeout: any = null;\r\n\tconst p = async () => {\r\n\t\tif (cancel) return;\r\n\t\tconst start = new Date().getTime();\r\n\t\tawait cb();\r\n\t\tconst end = new Date().getTime();\r\n\t\ttimeout = setTimeout(() => p(), ms - (end - start) || 1);\r\n\t};\r\n\tp();\r\n\treturn () => {\r\n\t\tcancel = true;\r\n\t\tif(timeout) clearTimeout(timeout);\r\n\t}\r\n}\r\n\r\nexport function dayOfWeek(d: number): string {\r\n\treturn ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d];\r\n}\r\n\r\nexport function dayOfYear(date: Date): number {\r\n\tconst start = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\r\n\treturn Math.ceil((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\r\n}\r\n\r\n/**\r\n * Format date\r\n *\r\n * Year:\r\n * - YYYY = 2025 (4-digit year)\r\n * - YY = 25 (2-digit year)\r\n *\r\n * Month:\r\n * - MMMM = January (full month name)\r\n * - MMM = Jan (abbreviated month name)\r\n * - MM = 01 (zero-padded month number)\r\n * - M = 1 (month number)\r\n *\r\n * Day:\r\n * - DDD = 123 (day of year)\r\n * - DD = 01 (zero-padded day)\r\n * - Do = 1st (day with ordinal suffix)\r\n * - D = 1 (day number)\r\n * - dddd = Monday (full day name)\r\n * - ddd = Mon (abbreviated day name)\r\n *\r\n * Hour:\r\n * - HH = 13 (24-hour format, zero-padded)\r\n * - H = 13 (24-hour format)\r\n * - hh = 01 (12-hour format, zero-padded)\r\n * - h = 1 (12-hour format)\r\n *\r\n * Minute:\r\n * - mm = 05 (zero-padded minutes)\r\n * - m = 5 (minutes)\r\n *\r\n * Second:\r\n * - ss = 09 (zero-padded seconds)\r\n * - s = 9 (seconds)\r\n *\r\n * Millisecond:\r\n * - SSS = 123 (3-digit milliseconds)\r\n *\r\n * AM/PM:\r\n * - A = AM/PM (uppercase)\r\n * - a = am/pm (lowercase)\r\n *\r\n * Timezone:\r\n * - ZZ = +0500 (timezone offset without colon)\r\n * - Z = +05:00 (timezone offset with colon)\r\n * - z = EST (timezone abbreviation)\r\n *\r\n * @param {string} format How date string will be formatted, default: `YYYY-MM-DD H:mm A`\r\n * @param {Date | number | string} date Date or timestamp, defaults to now\r\n * @param tz Set timezone offset\r\n * @return {string} Formated date\r\n */\r\nexport function formatDate(format: string = 'YYYY-MM-DD H:mm', date: Date | number | string = new Date(), tz: string | number = 'local'): string {\r\n\tif (typeof date === 'number' || typeof date === 'string') date = new Date(date);\r\n\tif (isNaN(date.getTime())) throw new Error('Invalid date input');\r\n\tconst numericTz = typeof tz === 'number';\r\n\tconst localTz = tz === 'local' || (!numericTz && tz.toLowerCase?.() === 'local');\r\n\tconst tzName = localTz ? Intl.DateTimeFormat().resolvedOptions().timeZone : numericTz ? 'UTC' : tz;\r\n\r\n\tif (!numericTz && tzName !== 'UTC') {\r\n\t\ttry {\r\n\t\t\tnew Intl.DateTimeFormat('en-US', { timeZone: tzName }).format();\r\n\t\t} catch {\r\n\t\t\tthrow new Error(`Invalid timezone: ${tzName}`);\r\n\t\t}\r\n\t}\r\n\r\n\tlet zonedDate = new Date(date);\r\n\tlet get: (fn: 'FullYear' | 'Month' | 'Date' | 'Day' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds') => number;\r\n\tconst partsMap: Record<string, string> = {};\r\n\tif (!numericTz && tzName !== 'UTC') {\r\n\t\tconst parts = new Intl.DateTimeFormat('en-US', {\r\n\t\t\ttimeZone: tzName,\r\n\t\t\tyear: 'numeric', month: '2-digit', day: '2-digit', weekday: 'long',\r\n\t\t\thour: '2-digit', minute: '2-digit', second: '2-digit',\r\n\t\t\thour12: false\r\n\t\t}).formatToParts(date);\r\n\t\tparts.forEach(p => {\r\n\t\t\tpartsMap[p.type] = p.value;\r\n\t\t});\r\n\r\n\t\tconst monthValue = parseInt(partsMap.month) - 1;\r\n\t\tconst dayOfWeekValue = new Date(`${partsMap.year}-${partsMap.month}-${partsMap.day}`).getDay();\r\n\t\tconst hourValue = parseInt(partsMap.hour);\r\n\r\n\t\tget = (fn: 'FullYear' | 'Month' | 'Date' | 'Day' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds'): number => {\r\n\t\t\tswitch (fn) {\r\n\t\t\t\tcase 'FullYear': return parseInt(partsMap.year);\r\n\t\t\t\tcase 'Month': return monthValue;\r\n\t\t\t\tcase 'Date': return parseInt(partsMap.day);\r\n\t\t\t\tcase 'Day': return dayOfWeekValue;\r\n\t\t\t\tcase 'Hours': return hourValue;\r\n\t\t\t\tcase 'Minutes': return parseInt(partsMap.minute);\r\n\t\t\t\tcase 'Seconds': return parseInt(partsMap.second);\r\n\t\t\t\tdefault: return 0;\r\n\t\t\t}\r\n\t\t};\r\n\t} else {\r\n\t\tconst offset = numericTz ? tz as number : 0;\r\n\t\tzonedDate = new Date(date.getTime() + offset * 60 * 60 * 1000);\r\n\t\tget = (fn: 'FullYear' | 'Month' | 'Date' | 'Day' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds'): number => zonedDate[`getUTC${fn}`]();\r\n\t}\r\n\r\n\tfunction numSuffix(n: number): string {\r\n\t\tconst s = [\"th\", \"st\", \"nd\", \"rd\"];\r\n\t\tconst v = n % 100;\r\n\t\treturn n + (s[(v - 20) % 10] || s[v] || s[0]);\r\n\t}\r\n\r\n\tfunction getTZOffset(): string {\r\n\t\tif (numericTz) {\r\n\t\t\tconst total = (tz as number) * 60;\r\n\t\t\tconst hours = Math.floor(Math.abs(total) / 60);\r\n\t\t\tconst mins = Math.abs(total) % 60;\r\n\t\t\treturn `${tz >= 0 ? '+' : '-'}${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst offset = new Intl.DateTimeFormat('en-US', {timeZone: tzName, timeZoneName: 'longOffset', hour: '2-digit', minute: '2-digit',})\r\n\t\t\t\t.formatToParts(<Date>date).find(p => p.type === 'timeZoneName')?.value.match(/([+-]\\d{2}:\\d{2})/)?.[1];\r\n\t\t\tif (offset) return offset;\r\n\t\t} catch {}\r\n\t\treturn '+00:00';\r\n\t}\r\n\r\n\tfunction getTZAbbr(): string {\r\n\t\tif (numericTz && tz === 0) return 'UTC';\r\n\t\ttry {\r\n\t\t\treturn new Intl.DateTimeFormat('en-US', { timeZone: tzName, timeZoneName: 'short' })\r\n\t\t\t\t.formatToParts(<Date>date).find(p => p.type === 'timeZoneName')?.value || '';\r\n\t\t} catch {\r\n\t\t\treturn tzName;\r\n\t\t}\r\n\t}\r\n\r\n\tconst tokens: Record<string, string> = {\r\n\t\tYYYY: get('FullYear').toString(),\r\n\t\tYY: get('FullYear').toString().slice(2),\r\n\t\tMMMM: month(get('Month')),\r\n\t\tMMM: month(get('Month')).slice(0, 3),\r\n\t\tMM: (get('Month') + 1).toString().padStart(2, '0'),\r\n\t\tM: (get('Month') + 1).toString(),\r\n\t\tDDD: dayOfYear(zonedDate).toString(),\r\n\t\tDD: get('Date').toString().padStart(2, '0'),\r\n\t\tDo: numSuffix(get('Date')),\r\n\t\tD: get('Date').toString(),\r\n\t\tdddd: dayOfWeek(get('Day')),\r\n\t\tddd: dayOfWeek(get('Day')).slice(0, 3),\r\n\t\tHH: get('Hours').toString().padStart(2, '0'),\r\n\t\tH: get('Hours').toString(),\r\n\t\thh: (get('Hours') % 12 || 12).toString().padStart(2, '0'),\r\n\t\th: (get('Hours') % 12 || 12).toString(),\r\n\t\tmm: get('Minutes').toString().padStart(2, '0'),\r\n\t\tm: get('Minutes').toString(),\r\n\t\tss: get('Seconds').toString().padStart(2, '0'),\r\n\t\ts: get('Seconds').toString(),\r\n\t\tSSS: (zonedDate[`getUTC${'Milliseconds'}`]()).toString().padStart(3, '0'),\r\n\t\tA: get('Hours') >= 12 ? 'PM' : 'AM',\r\n\t\ta: get('Hours') >= 12 ? 'pm' : 'am',\r\n\t\tZZ: getTZOffset().replace(':', ''),\r\n\t\tZ: getTZOffset(),\r\n\t\tz: getTZAbbr(),\r\n\t};\r\n\r\n\treturn format.replace(/YYYY|YY|MMMM|MMM|MM|M|DDD|DD|Do|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|SSS|A|a|ZZ|Z|z/g, token => tokens[token]);\r\n}\r\n\r\n/**\r\n * Run a function immediately & repeat every x ms\r\n *\r\n * @param {() => any} fn Callback function\r\n * @param {number} interval Repeat in ms\r\n * @return {number} Clear Interval ID\r\n */\r\nexport function instantInterval(fn: () => any, interval: number) {\r\n\tfn();\r\n\treturn setInterval(fn, interval);\r\n}\r\n\r\nexport function month(m: number): string {\r\n\treturn ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][m];\r\n}\r\n\r\n/**\r\n * Use in conjunction with `await` to pause an async script\r\n *\r\n * @example\r\n * ```js\r\n * await sleep(1000) // Pause for 1 second\r\n * ```\r\n *\r\n * @param {number} ms - Time to pause for in milliseconds\r\n * @returns {Promise<unknown>} - Resolves promise when it's time to resume\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n\treturn new Promise(res => setTimeout(res, ms));\r\n}\r\n\r\n/**\r\n * Sleep while function returns true\r\n *\r\n * @example\r\n * ```js\r\n * let loading = true;\r\n * setTimeout(() => wait = false, 1000);\r\n * await sleepWhile(() => loading); // Won't continue until loading flag is false\r\n * ```\r\n *\r\n * @param {() => boolean | Promise<boolean>} fn Return true to continue\r\n * @param {number} checkInterval Run function ever x milliseconds\r\n * @return {Promise<void>} Callback when sleep is over\r\n */\r\nexport async function sleepWhile(fn : () => boolean | Promise<boolean>, checkInterval = 100): Promise<void> {\r\n\twhile(await fn()) await sleep(checkInterval);\r\n}\r\n\r\n/**\r\n * Calculate the number of milliseconds until date/time\r\n *\r\n * @param {Date | number} date - Target\r\n * @returns {number} - Number of milliseconds until target\r\n */\r\nexport function timeUntil(date: Date | number): number {\r\n\treturn (date instanceof Date ? date.getTime() : date) - (new Date()).getTime();\r\n}\r\n\r\n\r\n/**\r\n * Convert a timezone string (e.g., \"America/Toronto\") to its current UTC offset in minutes.\r\n * @param {string} tz - Timezone string, e.g. \"America/Toronto\"\r\n * @param {Date} [date=new Date()] - The date for which you want the offset (default is now)\r\n * @returns {number} - Offset in minutes (e.g., -240)\r\n */\r\nexport function timezoneOffset(tz: string, date: Date = new Date()): number {\r\n\tconst dtf = new Intl.DateTimeFormat('en-US', {\r\n\t\ttimeZone: tz,\r\n\t\thour12: false,\r\n\t\tyear: 'numeric',\r\n\t\tmonth: '2-digit',\r\n\t\tday: '2-digit',\r\n\t\thour: '2-digit',\r\n\t\tminute: '2-digit',\r\n\t\tsecond: '2-digit',\r\n\t});\r\n\tconst parts = dtf.formatToParts(date);\r\n\tconst get = (type: string) => Number(parts.find(v => v.type === type)?.value);\r\n\tconst y = get('year');\r\n\tconst mo = get('month');\r\n\tconst d = get('day');\r\n\tconst h = get('hour');\r\n\tconst m = get('minute');\r\n\tconst s = get('second');\r\n\r\n\tconst asUTC = Date.UTC(y, mo - 1, d, h, m, s);\r\n\tconst asLocal = date.getTime();\r\n\treturn Math.round((asLocal - asUTC) / 60000);\r\n}\r\n","import {findByProp} from './array.ts';\nimport {ASet} from './aset.ts';\nimport {sleepWhile} from './time.ts';\n\nexport type TableOptions = {\n\tname: string;\n\tkey?: string;\n\tautoIncrement?: boolean;\n};\n\nclass AsyncLock {\n\tprivate p = Promise.resolve();\n\trun<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst res = this.p.then(fn, fn);\n\t\tthis.p = res.then(() => {}, () => {});\n\t\treturn res;\n\t}\n}\n\nexport class Database {\n\tprivate schemaLock = new AsyncLock();\n\tprivate upgrading = false;\n\n\tconnection!: Promise<IDBDatabase>;\n\ttables!: TableOptions[];\n\n\tget ready() { return !this.upgrading; }\n\n\tconstructor(public readonly database: string, tables?: (string | TableOptions)[], public version?: number) {\n\t\tthis.connection = new Promise((resolve, reject) => {\n\t\t\tlet req: IDBOpenDBRequest;\n\t\t\ttry { req = indexedDB.open(this.database, this.version); }\n\t\t\tcatch (err) { return reject(err); }\n\n\t\t\tthis.tables = !tables ? [] : tables.map(t => {\n\t\t\t\tt = typeof t == 'object' ? t : {name: t};\n\t\t\t\treturn {...t, name: t.name.toString()};\n\t\t\t});\n\n\t\t\treq.onerror = () => reject(req.error);\n\n\t\t\treq.onsuccess = () => {\n\t\t\t\tlet db: IDBDatabase;\n\t\t\t\ttry { db = req.result; }\n\t\t\t\tcatch (err) { return reject(err); }\n\n\t\t\t\tconst existing = Array.from(db.objectStoreNames);\n\t\t\t\tif(!tables) {\n\t\t\t\t\tthis.tables = existing.map(t => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = db.transaction(t, 'readonly');\n\t\t\t\t\t\t\tconst store = tx.objectStore(t);\n\t\t\t\t\t\t\treturn {name: t, key: <string>store.keyPath};\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn {name: t}; // 🛡️ fallback\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst desired = new ASet((tables || []).map(t => typeof t == 'string' ? t : t.name));\n\t\t\t\tif(tables && desired.symmetricDifference(new ASet(existing)).length) {\n\t\t\t\t\tdb.close();\n\t\t\t\t\tObject.assign(this, new Database(this.database, this.tables, db.version + 1));\n\t\t\t\t\tthis.connection.then(resolve);\n\t\t\t\t} else {\n\t\t\t\t\tthis.version = db.version;\n\t\t\t\t\tresolve(db);\n\t\t\t\t}\n\t\t\t\tthis.upgrading = false;\n\t\t\t};\n\n\t\t\treq.onupgradeneeded = () => {\n\t\t\t\tthis.upgrading = true;\n\t\t\t\tlet db: IDBDatabase;\n\t\t\t\ttry { db = req.result; }\n\t\t\t\tcatch { return; }\n\t\t\t\ttry {\n\t\t\t\t\tconst existingTables = new ASet(Array.from(db.objectStoreNames));\n\t\t\t\t\tif(tables) {\n\t\t\t\t\t\tconst desired = new ASet((tables || []).map(t => typeof t == 'string' ? t : t.name));\n\t\t\t\t\t\texistingTables.difference(desired).forEach(name => db.deleteObjectStore(name));\n\t\t\t\t\t\tdesired.difference(existingTables).forEach(name => {\n\t\t\t\t\t\t\tconst t = this.tables.find(findByProp('name', name));\n\t\t\t\t\t\t\tdb.createObjectStore(name, {\n\t\t\t\t\t\t\t\tkeyPath: t?.key,\n\t\t\t\t\t\t\t\tautoIncrement: t?.autoIncrement || !t?.key,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch { }\n\t\t\t};\n\t\t});\n\t}\n\n\twaitForUpgrade = () => sleepWhile(() => this.upgrading);\n\n\tasync createTable<K extends IDBValidKey = any, T = any>(table: string | TableOptions): Promise<Table<K, T>> {\n\t\treturn this.schemaLock.run(async () => {\n\t\t\tif(typeof table == 'string') table = { name: table };\n\t\t\tconst conn = await this.connection;\n\t\t\tif(!this.includes(table.name)) {\n\t\t\t\tconst newDb = new Database(this.database, [...this.tables, table], (this.version ?? 0) + 1);\n\t\t\t\tconn.close();\n\t\t\t\tthis.connection = newDb.connection;\n\t\t\t\tawait this.connection;\n\t\t\t\tObject.assign(this, newDb);\n\t\t\t}\n\t\t\treturn this.table<K, T>(table.name);\n\t\t});\n\t}\n\n\tasync deleteTable(table: string | TableOptions): Promise<void> {\n\t\treturn this.schemaLock.run(async () => {\n\t\t\tif(typeof table == 'string') table = { name: table };\n\t\t\tif(!this.includes(table.name)) return;\n\t\t\tconst conn = await this.connection;\n\t\t\tconst newDb = new Database(this.database, this.tables.filter(t => t.name != (<TableOptions>table).name), (this.version ?? 0) + 1);\n\t\t\tconn.close();\n\t\t\tthis.connection = newDb.connection;\n\t\t\tawait this.connection;\n\t\t\tObject.assign(this, newDb);\n\t\t});\n\t}\n\n\tincludes(name: any): boolean {\n\t\treturn !!this.tables.find(t => t.name == (typeof name == 'object' ? name.name : name.toString()));\n\t}\n\n\ttable<K extends IDBValidKey = any, T = any>(name: any): Table<K, T> {\n\t\treturn new Table<K, T>(this, name.toString());\n\t}\n}\n\nexport class Table<K extends IDBValidKey = any, T = any> {\n\tconstructor(private readonly database: Database, public readonly name: string, public readonly key: keyof T | string = 'id') {\n\t\tthis.database.connection.then(() => {\n\t\t\tconst exists = !!this.database.tables.find(findByProp('name', this.name));\n\t\t\tif(!exists) this.database.createTable(this.name);\n\t\t});\n\t}\n\n\tasync tx<R>(table: string, fn: (store: IDBObjectStore) => IDBRequest, readonly = false): Promise<R> {\n\t\tawait this.database.waitForUpgrade();\n\t\tconst db = await this.database.connection;\n\t\tconst tx = db.transaction(table, readonly ? 'readonly' : 'readwrite');\n\t\treturn new Promise<R>((resolve, reject) => {\n\t\t\tconst request = fn(tx.objectStore(table));\n\t\t\trequest.onsuccess = () => resolve(request.result as R);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t});\n\t}\n\n\tadd(value: T, key?: K): Promise<void> {\n\t\treturn this.tx(this.name, store => store.add(value, key));\n\t}\n\n\tall = this.getAll;\n\n\tclear(): Promise<void> {\n\t\treturn this.tx(this.name, store => store.clear());\n\t}\n\n\tcount(): Promise<number> {\n\t\treturn this.tx(this.name, store => store.count(), true);\n\t}\n\n\tcreate = this.add;\n\n\tdelete(key: K): Promise<void> {\n\t\treturn this.tx(this.name, store => store.delete(key));\n\t}\n\n\tget(key: K): Promise<T> {\n\t\treturn this.tx(this.name, store => store.get(key), true);\n\t}\n\n\tgetAll(): Promise<T[]> {\n\t\treturn this.tx(this.name, store => store.getAll(), true);\n\t}\n\n\tgetAllKeys(): Promise<K[]> {\n\t\treturn this.tx(this.name, store => store.getAllKeys(), true);\n\t}\n\n\tput(value: T, key?: string): Promise<void> {\n\t\treturn this.tx(this.name, store => {\n\t\t\tif(store.keyPath) return store.put(value);\n\t\t\treturn store.put(value, key);\n\t\t});\n\t}\n\n\tread(): Promise<T[]>;\n\tread(key: K): Promise<T>;\n\tread(key?: K): Promise<T | T[]> {\n\t\treturn key ? this.get(key) : this.getAll();\n\t}\n\n\tset(value: T, key?: K): Promise<void> {\n\t\tif(key) (<any>value)[this.key] = key;\n\t\tif(!(<any>value)[this.key]) return this.add(value);\n\t\treturn this.put(value);\n\t}\n\n\tupdate = this.set;\n}\n","export type ProgressCallback = (progress: number) => any;\n\n/**\n * A promise that fires the `onProgress` callback on incremental progress\n *\n * @example\n * ```js\n * const promise = new Promise((resolve, reject, progress) => {\n * const max = 10;\n * \t for(let i = 0; i < max; i++) progress(i / max);\n * \t resolve(1);\n * });\n *\n * console.log(promise.progress);\n *\n * promise.onProgress(console.log)\n * .then(console.log)\n * .catch(console.error)\n * .finally(...);\n *\n * ```\n */\nexport class PromiseProgress<T> extends Promise<T> {\n\tprivate listeners: ProgressCallback[] = [];\n\n\tprivate _progress = 0;\n\tget progress() { return this._progress; }\n\tset progress(p: number) {\n\t\tif(p == this._progress) return;\n\t\tthis._progress = p;\n\t\tthis.listeners.forEach(l => l(p));\n\t}\n\n\tconstructor(executor: (resolve: (value: T) => any, reject: (reason: any) => void, progress: (progress: number) => any) => void) {\n\t\tsuper((resolve, reject) => executor(\n\t\t\t(value: T) => resolve(value),\n\t\t\t(reason: any) => reject(reason),\n\t\t\t(progress: number) => this.progress = progress,\n\t\t));\n\t}\n\n\tstatic from<T>(promise: Promise<T>): PromiseProgress<T> {\n\t\tif(promise instanceof PromiseProgress) return promise;\n\t\treturn new PromiseProgress<T>((res, rej) => promise\n\t\t\t.then((...args) => res(...args))\n\t\t\t.catch((...args) => rej(...args)));\n\t}\n\n\tprivate from(promise: Promise<T>): PromiseProgress<T> {\n\t\tconst newPromise = PromiseProgress.from(promise);\n\t\tthis.onProgress(p => newPromise.progress = p);\n\t\treturn newPromise;\n\t}\n\n\tonProgress(callback: ProgressCallback) {\n\t\tthis.listeners.push(callback);\n\t\treturn this;\n\t}\n\n\tthen(res?: (v: T) => any, rej?: (err: any) => any): PromiseProgress<any> {\n\t\tconst resp = super.then(res, rej);\n\t\treturn this.from(resp);\n\t}\n\n\tcatch(rej?: (err: any) => any): PromiseProgress<any> {\n\t\treturn this.from(super.catch(rej));\n\t}\n\n\tfinally(res?: () => any): PromiseProgress<any> {\n\t\treturn this.from(super.finally(res));\n\t}\n}\n","import {makeArray} from './array.ts';\nimport {JSONAttemptParse} from './json.ts';\nimport {PromiseProgress} from './promise-progress';\nimport {formatDate} from './time.ts';\n\n/**\n * Download blob as a file\n *\n * @param {Blob} blob File as a blob\n * @param {string} name Name blob will be downloaded as\n */\nexport function downloadFile(blob: Blob | string | string[], name: string) {\n\tif(!(blob instanceof Blob)) blob = new Blob(makeArray(blob));\n\tconst url = URL.createObjectURL(blob);\n\tdownloadUrl(url, name);\n\tURL.revokeObjectURL(url);\n}\n\n/**\n * Download a file from a URL\n *\n * @param href URL that will be downloaded\n * @param {string} name Override download name\n */\nexport function downloadUrl(href: any, name?: string) {\n\tconst a = document.createElement('a');\n\ta.href = href;\n\ta.download = name || href.split('/').pop();\n\tdocument.body.appendChild(a);\n\ta.click();\n\tdocument.body.removeChild(a);\n}\n\n/**\n * Open filebrowser & return selected file\n *\n * @param {{accept?: string, multiple?: boolean}} options accept - selectable mimetypes, multiple - Allow selecting more than 1 file\n * @return {Promise<File[]>} Array of selected files\n */\nexport function fileBrowser(options: {accept?: string, multiple?: boolean} = {}): Promise<File[]> {\n\treturn new Promise(res => {\n\t\tconst input = document.createElement('input');\n\t\tinput.type = 'file';\n\t\tinput.accept = options.accept || '*';\n\t\tinput.style.display='none';\n\t\tinput.multiple = !!options.multiple;\n\t\tinput.onblur = input.onchange = async () => {\n\t\t\tres(Array.from(<any>input.files));\n\t\t\tinput.remove();\n\t\t}\n\t\tdocument.body.appendChild(input);\n\t\tinput.click();\n\t});\n}\n\n/**\n * Extract text from a file\n *\n * @param file File to extract text from\n * @return {Promise<string | null>} File contents\n */\nexport function fileText(file: any): Promise<string | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(<string>reader.result);\n\t\treader.onerror = () => reject(reader.error);\n\t\treader.readAsText(file);\n\t});\n}\n\n/**\n * Create timestamp intended for filenames from a date\n *\n * @param {string} name Name of file, `{{TIMESTAMP}}` will be replaced\n * @param {Date | number | string} date Date to use for timestamp\n * @return {string} Interpolated filename, or the raw timestamp if name was omitted\n */\nexport function timestampFilename(name?: string, date: Date | number | string = new Date()) {\n\tif(typeof date == 'number' || typeof date == 'string') date = new Date(date);\n\tconst timestamp = formatDate('YYYY-MM-DD_HH-mm', date);\n\treturn name ? name.replace('{{TIMESTAMP}}', timestamp) : timestamp;\n}\n\n/**\n * Upload file to URL with progress callback using PromiseProgress\n *\n * @param {{url: string, files: File[], headers?: {[p: string]: string}, withCredentials?: boolean}} options\n * @return {PromiseProgress<T>} Promise of request with `onProgress` callback\n */\nexport function uploadWithProgress<T>(options: {\n\turl: string;\n\tfiles: File[];\n\theaders?: {[key: string]: string};\n\twithCredentials?: boolean;\n}): PromiseProgress<T> {\n\treturn new PromiseProgress<T>((res, rej, prog) => {\n\t\tconst xhr = new XMLHttpRequest();\n\t\tconst formData = new FormData();\n\t\toptions.files.forEach(f => formData.append('file', f));\n\n\t\txhr.withCredentials = !!options.withCredentials;\n\t\txhr.upload.addEventListener('progress', (event) => event.lengthComputable ? prog(event.loaded / event.total) : null);\n\t\txhr.addEventListener('loadend', () => res(<T>JSONAttemptParse(xhr.responseText)));\n\t\txhr.addEventListener('error', () => rej(JSONAttemptParse(xhr.responseText)));\n\t\txhr.addEventListener('timeout', () => rej({error: 'Request timed out'}));\n\n\t\txhr.open('POST', options.url);\n\t\tObject.entries(options.headers || {}).forEach(([key, value]) => xhr.setRequestHeader(key, value));\n\t\txhr.send(formData);\n\t});\n}\n","export type TypedListener = (...args: any[]) => any;\r\nexport type TypedEvents = {[k in string | symbol]: TypedListener} & {'*': (event: string, ...args: any[]) => any};\r\n\r\nexport type NamespaceEvents<Namespace extends string, Events extends TypedEvents> = {\r\n\t[K in keyof Events as `${Namespace}:${Extract<K, string>}`]: Events[K];\r\n};\r\n\r\nexport class TypedEmitter<T extends TypedEvents = TypedEvents> {\r\n\tprivate static listeners: {[key: string]: TypedListener[]} = {};\r\n\r\n\tprivate listeners: { [key in keyof T]?: TypedListener[] } = {};\r\n\r\n\tstatic emit(event: any, ...args: any[]) {\r\n\t\t(this.listeners['*'] || []).forEach(l => l(event, ...args));\r\n\t\t(this.listeners[event.toString()] || []).forEach(l => l(...args));\r\n\t};\r\n\r\n\tstatic off(event: any, listener: TypedListener) {\r\n\t\tconst e = event.toString();\r\n\t\tthis.listeners[e] = (this.listeners[e] || []).filter(l => l != listener);\r\n\t}\r\n\r\n\tstatic on(event: any, listener: TypedListener) {\r\n\t\tconst e = event.toString();\r\n\t\tif(!this.listeners[e]) this.listeners[e] = [];\r\n\t\tthis.listeners[e]?.push(listener);\r\n\t\treturn () => this.off(event, listener);\r\n\t}\r\n\r\n\tstatic once(event: any, listener?: TypedListener): Promise<any> {\r\n\t\treturn new Promise(res => {\r\n\t\t\tconst unsubscribe = this.on(event, <any>((...args: any) => {\r\n\t\t\t\tres(args.length == 1 ? args[0] : args);\r\n\t\t\t\tif(listener) listener(...args);\r\n\t\t\t\tunsubscribe();\r\n\t\t\t}));\r\n\t\t});\r\n\t}\r\n\r\n\temit<K extends keyof T>(event: K, ...args: Parameters<T[K]>) {\r\n\t\t(this.listeners['*'] || []).forEach(l => l(event, ...args));\r\n\t\t(this.listeners[event] || []).forEach(l => l(...args));\r\n\t};\r\n\r\n\toff<K extends keyof T = string>(event: K, listener: T[K]) {\r\n\t\tthis.listeners[event] = (this.listeners[event] || []).filter(l => l != listener);\r\n\t}\r\n\r\n\ton<K extends keyof T = string>(event: K, listener: T[K]) {\r\n\t\tif(!this.listeners[event]) this.listeners[event] = [];\r\n\t\tthis.listeners[event]?.push(listener);\r\n\t\treturn () => this.off(event, listener);\r\n\t}\r\n\r\n\tonce<K extends keyof T = string>(event: K, listener?: T[K]): Promise<any> {\r\n\t\treturn new Promise(res => {\r\n\t\t\tconst unsubscribe = this.on(event, <any>((...args: any) => {\r\n\t\t\t\tres(args.length == 1 ? args[0] : args);\r\n\t\t\t\tif(listener) listener(...args);\r\n\t\t\t\tunsubscribe();\r\n\t\t\t}));\r\n\t\t});\r\n\t}\r\n}\r\n","export class CustomError extends Error {\r\n\tstatic code = 500;\r\n\r\n\tprivate _code?: number;\r\n\tget code(): number { return this._code || (<any>this).constructor.code; }\r\n\tset code(c: number) { this._code = c; }\r\n\r\n\tconstructor(message?: string, code?: number) {\r\n\t\tsuper(message);\r\n\t\tif(code != null) this._code = code;\r\n\t}\r\n\r\n\tstatic from(err: Error): CustomError {\r\n\t\tconst code = Number((<any>err).statusCode) ?? Number((<any>err).code);\r\n\t\tconst newErr = new this(err.message || err.toString());\r\n\t\treturn Object.assign(newErr, {\r\n\t\t\tstack: err.stack,\r\n\t\t\t...err,\r\n\t\t\tcode: code ?? undefined\r\n\t\t});\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code != undefined;\r\n\t}\r\n\r\n\ttoString() {\r\n\t\treturn this.message || super.toString();\r\n\t}\r\n}\r\n\r\nexport class BadRequestError extends CustomError {\r\n\tstatic code = 400;\r\n\r\n\tconstructor(message: string = 'Bad Request') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class UnauthorizedError extends CustomError {\r\n\tstatic code = 401;\r\n\r\n\tconstructor(message: string = 'Unauthorized') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class PaymentRequiredError extends CustomError {\r\n\tstatic code = 402;\r\n\r\n\tconstructor(message: string = 'Payment Required') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class ForbiddenError extends CustomError {\r\n\tstatic code = 403;\r\n\r\n\tconstructor(message: string = 'Forbidden') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class NotFoundError extends CustomError {\r\n\tstatic code = 404;\r\n\r\n\tconstructor(message: string = 'Not Found') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class MethodNotAllowedError extends CustomError {\r\n\tstatic code = 405;\r\n\r\n\tconstructor(message: string = 'Method Not Allowed') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class NotAcceptableError extends CustomError {\r\n\tstatic code = 406;\r\n\r\n\tconstructor(message: string = 'Not Acceptable') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class InternalServerError extends CustomError {\r\n\tstatic code = 500;\r\n\r\n\tconstructor(message: string = 'Internal Server Error') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class NotImplementedError extends CustomError {\r\n\tstatic code = 501;\r\n\r\n\tconstructor(message: string = 'Not Implemented') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class BadGatewayError extends CustomError {\r\n\tstatic code = 502;\r\n\r\n\tconstructor(message: string = 'Bad Gateway') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class ServiceUnavailableError extends CustomError {\r\n\tstatic code = 503;\r\n\r\n\tconstructor(message: string = 'Service Unavailable') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\nexport class GatewayTimeoutError extends CustomError {\r\n\tstatic code = 504;\r\n\r\n\tconstructor(message: string = 'Gateway Timeout') {\r\n\t\tsuper(message);\r\n\t}\r\n\r\n\tstatic instanceof(err: Error) {\r\n\t\treturn (<any>err).constructor.code == this.code;\r\n\t}\r\n}\r\n\r\n/**\r\n * Create the correct error object from a status code\r\n * @param {number} code Will be converted to respective error (ex. 404 -> NotFoundError)\r\n * @param {string} message Override default error message\r\n * @return {CustomError} The proper error type\r\n */\r\nexport function errorFromCode(code: number, message?: string) {\r\n\tswitch(code) {\r\n\t\tcase 400:\r\n\t\t\treturn new BadRequestError(message);\r\n\t\tcase 401:\r\n\t\t\treturn new UnauthorizedError(message);\r\n\t\tcase 402:\r\n\t\t\treturn new PaymentRequiredError(message);\r\n\t\tcase 403:\r\n\t\t\treturn new ForbiddenError(message);\r\n\t\tcase 404:\r\n\t\t\treturn new NotFoundError(message);\r\n\t\tcase 405:\r\n\t\t\treturn new MethodNotAllowedError(message);\r\n\t\tcase 406:\r\n\t\t\treturn new NotAcceptableError(message);\r\n\t\tcase 500:\r\n\t\t\treturn new InternalServerError(message);\r\n\t\tcase 501:\r\n\t\t\treturn new NotImplementedError(message);\r\n\t\tcase 502:\r\n\t\t\treturn new BadGatewayError(message);\r\n\t\tcase 503:\r\n\t\t\treturn new ServiceUnavailableError(message);\r\n\t\tcase 504:\r\n\t\t\treturn new GatewayTimeoutError(message);\r\n\t\tdefault:\r\n\t\t\treturn new CustomError(message, code);\r\n\t}\r\n}\r\n","import {clean} from './objects';\nimport {PromiseProgress} from './promise-progress';\n\nexport type DecodedResponse<T> = Response & {data: T | null}\n\nexport type HttpInterceptor = (response: Response, next: () => void) => void;\n\nexport type HttpRequestOptions = {\n\tbody?: any;\n\tdecode?: boolean;\n\tfragment?: string;\n\theaders?: {[key: string | symbol]: string | null | undefined};\n\tmethod?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n\tquery?: {key: string, value: string}[] | {[key: string]: string};\n\turl?: string;\n\t[key: string]: any;\n}\n\nexport type HttpDefaults = {\n\theaders?: {[key: string | symbol]: string | null | undefined};\n\tinterceptors?: HttpInterceptor[];\n\turl?: string;\n}\n\nclass HttpResponse<T = any> extends Response {\n\tdata?: T\n\tok!: boolean;\n\tredirected!: boolean;\n\ttype!: ResponseType;\n\turl!: string;\n\n\tconstructor(resp: Response, stream: ReadableStream) {\n\t\tconst body = [204, 205, 304].includes(resp.status) ? null : stream;\n\t\tsuper(body, {\n\t\t\theaders: resp.headers,\n\t\t\tstatus: resp.status,\n\t\t\tstatusText: resp.statusText,\n\t\t});\n\n\t\tthis.ok = resp.ok;\n\t\tthis.redirected = resp.redirected;\n\t\tthis.type = resp.type;\n\t\tthis.url = resp.url;\n\t}\n}\n\nexport class Http {\n\tprivate static interceptors: {[key: string]: HttpInterceptor} = {};\n\n\tstatic headers: {[key: string]: string | null | undefined} = {};\n\n\tprivate interceptors: {[key: string]: HttpInterceptor} = {}\n\n\theaders: {[key: string]: string | null | undefined} = {}\n\turl!: string | null;\n\n\tconstructor(defaults: HttpDefaults = {}) {\n\t\tthis.url = defaults.url ?? null;\n\t\tthis.headers = defaults.headers || {};\n\t\tif(defaults.interceptors) {\n\t\t\tdefaults.interceptors.forEach(i => Http.addInterceptor(i));\n\t\t}\n\t}\n\n\tstatic addInterceptor(fn: HttpInterceptor): () => void {\n\t\tconst key = Object.keys(Http.interceptors).length.toString();\n\t\tHttp.interceptors[key] = fn;\n\t\treturn () => { Http.interceptors[key] = <any>null; }\n\t}\n\n\taddInterceptor(fn: HttpInterceptor): () => void {\n\t\tconst key = Object.keys(this.interceptors).length.toString();\n\t\tthis.interceptors[key] = fn;\n\t\treturn () => { this.interceptors[key] = <any>null; }\n\t}\n\n\trequest<T>(opts: HttpRequestOptions = {}): PromiseProgress<DecodedResponse<T>> {\n\t\tif(!this.url && !opts.url) throw new Error('URL needs to be set');\n\t\tlet url = opts.url?.startsWith('http') ? opts.url : (this.url || '') + (opts.url || '');\n\t\turl = url.replaceAll(/([^:]\\/)\\/+/g, '$1');\n\t\tif(opts.fragment) url.includes('#') ? url.replace(/#.*([?\\n])/g, (match, arg1) => `#${opts.fragment}${arg1}`) : `${url}#${opts.fragment}`;\n\t\tif(opts.query) {\n\t\t\tconst q = Array.isArray(opts.query) ? opts.query :\n\t\t\t\tObject.keys(opts.query).map(k => ({key: k, value: (<any>opts.query)[k]}))\n\t\t\turl += (url.includes('?') ? '&' : '?') + q.map(q => `${q.key}=${q.value}`).join('&');\n\t\t}\n\n\t\t// Prep headers\n\t\tconst headers = <any>clean({\n\t\t\t'Content-Type': !opts.body ? undefined : (opts.body instanceof FormData ? 'multipart/form-data' : 'application/json'),\n\t\t\t...Http.headers,\n\t\t\t...this.headers,\n\t\t\t...opts.headers\n\t\t});\n\n\t\tif(typeof opts.body == 'object' && opts.body != null && headers['Content-Type'] == 'application/json')\n\t\t\topts.body = JSON.stringify(opts.body);\n\n\t\t// Send request\n\t\treturn new PromiseProgress((res, rej, prog) => {\n\t\t\ttry {\n\t\t\t\tfetch(url, {\n\t\t\t\t\theaders,\n\t\t\t\t\tmethod: opts.method || (opts.body ? 'POST' : 'GET'),\n\t\t\t\t\tbody: opts.body\n\t\t\t\t}).then(async (resp: any) => {\n\t\t\t\t\tfor(let fn of [...Object.values(Http.interceptors), ...Object.values(this.interceptors)]) {\n\t\t\t\t\t\tawait new Promise<void>(res => fn(resp, () => res()));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst contentLength = resp.headers.get('Content-Length');\n\t\t\t\t\tconst total = contentLength ? parseInt(contentLength, 10) : 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\tconst reader = resp.body?.getReader();\n\t\t\t\t\tconst stream = new ReadableStream({\n\t\t\t\t\t\tstart(controller) {\n\t\t\t\t\t\t\tfunction push() {\n\t\t\t\t\t\t\t\treader?.read().then((event: any) => {\n\t\t\t\t\t\t\t\t\tif(event.done) return controller.close();\n\t\t\t\t\t\t\t\t\tloaded += event.value.byteLength;\n\t\t\t\t\t\t\t\t\tprog(loaded / total);\n\t\t\t\t\t\t\t\t\tcontroller.enqueue(event.value);\n\t\t\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t\t\t}).catch((error: any) => controller.error(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tresp = new HttpResponse<T>(resp, stream);\n\t\t\t\t\tif(opts.decode !== false) {\n\t\t\t\t\t\tconst content = resp.headers.get('Content-Type')?.toLowerCase();\n\t\t\t\t\t\tif(content?.includes('form')) resp.data = <T>await resp.formData();\n\t\t\t\t\t\telse if(content?.includes('json')) resp.data = <T>await resp.json();\n\t\t\t\t\t\telse if(content?.includes('text')) resp.data = <T>await resp.text();\n\t\t\t\t\t\telse if(content?.includes('application')) resp.data = <T>await resp.blob();\n\t\t\t\t\t}\n\n\t\t\t\t\tif(resp.ok) res(resp);\n\t\t\t\t\telse rej(resp);\n\t\t\t\t}).catch(err => rej(err));\n\t\t\t} catch(err) {\n\t\t\t\trej(err);\n\t\t\t}\n\t\t});\n\t}\n}\n","import {JSONAttemptParse} from './json.ts';\n\n/**\n * Creates a JSON Web Token (JWT) using the provided payload.\n *\n * @param {object} payload The payload to include in the JWT.\n * @param signature Add a JWT signature\n * @return {string} The generated JWT string.\n */\nexport function createJwt(payload: object, signature = 'unsigned'): string {\n\tconst header = Buffer.from(JSON.stringify({ alg: \"HS256\", typ: \"JWT\" }))\n\t\t.toString('base64url');\n\tconst body = Buffer.from(JSON.stringify(payload))\n\t\t.toString('base64url');\n\t// Signature is irrelevant for decodeJwt\n\treturn `${header}.${body}.${signature}`;\n}\n\n/**\n * Decode a JSON Web Token (JWT) payload, this will not check for tampering so be careful\n *\n * @param {string} token JWT to decode\n * @return {unknown} JWT payload\n */\nexport function decodeJwt<T>(token: string): T {\n\tconst base64 = token.split('.')[1]\n\t\t.replace(/-/g, '+').replace(/_/g, '/');\n\treturn <T>JSONAttemptParse(decodeURIComponent(atob(base64).split('').map(function(c) {\n\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t}).join('')));\n}\n","import {TypedEmitter, TypedEvents} from './emitter';\r\nimport {JSONSanitize} from './json.ts';\r\n\r\nexport const CliEffects = {\r\n\tCLEAR: \"\\x1b[0m\",\r\n\tBRIGHT: \"\\x1b[1m\",\r\n\tDIM: \"\\x1b[2m\",\r\n\tUNDERSCORE: \"\\x1b[4m\",\r\n\tBLINK: \"\\x1b[5m\",\r\n\tREVERSE: \"\\x1b[7m\",\r\n\tHIDDEN: \"\\x1b[8m\",\r\n}\r\n\r\nexport const CliForeground = {\r\n\tBLACK: '\\x1b[30m',\r\n\tRED: '\\x1b[31m',\r\n\tGREEN: '\\x1b[32m',\r\n\tYELLOW: '\\x1b[33m',\r\n\tBLUE: '\\x1b[34m',\r\n\tMAGENTA: '\\x1b[35m',\r\n\tCYAN: '\\x1b[36m',\r\n\tLIGHT_GREY: '\\x1b[37m',\r\n\tGREY: '\\x1b[90m',\r\n\tLIGHT_RED: '\\x1b[91m',\r\n\tLIGHT_GREEN: '\\x1b[92m',\r\n\tLIGHT_YELLOW: '\\x1b[93m',\r\n\tLIGHT_BLUE: '\\x1b[94m',\r\n\tLIGHT_MAGENTA: '\\x1b[95m',\r\n\tLIGHT_CYAN: '\\x1b[96m',\r\n\tWHITE: '\\x1b[97m',\r\n}\r\n\r\nexport const CliBackground = {\r\n\tBLACK: \"\\x1b[40m\",\r\n\tRED: \"\\x1b[41m\",\r\n\tGREEN: \"\\x1b[42m\",\r\n\tYELLOW: \"\\x1b[43m\",\r\n\tBLUE: \"\\x1b[44m\",\r\n\tMAGENTA: \"\\x1b[45m\",\r\n\tCYAN: \"\\x1b[46m\",\r\n\tWHITE: \"\\x1b[47m\",\r\n\tGREY: \"\\x1b[100m\",\r\n}\r\n\r\nexport type LogLevels = 'debug' | 'log' | 'info' | 'warn' | 'error';\r\n\r\nexport enum LOG_LEVEL {\r\n\tERROR = 0,\r\n\tWARN = 1,\r\n\tINFO = 2,\r\n\tLOG = 3,\r\n\tDEBUG = 4,\r\n}\r\n\r\nexport type LoggerEvents = TypedEvents & {\r\n\t'ERROR': (...args: any[]) => any;\r\n\t'WARN': (...args: any[]) => any;\r\n\t'INFO': (...args: any[]) => any;\r\n\t'LOG': (...args: any[]) => any;\r\n\t'DEBUG': (...args: any[]) => any;\r\n};\r\n\r\nexport class Logger extends TypedEmitter<LoggerEvents> {\r\n\tstatic LOG_LEVEL: LOG_LEVEL = LOG_LEVEL.DEBUG;\r\n\r\n\tconstructor(public readonly namespace?: string) {\r\n\t\tsuper();\r\n\t}\r\n\r\n\tprotected format(...text: any[]): string {\r\n\t\tconst now = new Date();\r\n\t\tconst timestamp = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}.${now.getMilliseconds().toString().padEnd(3, '0')}`;\r\n\t\treturn `${timestamp}${this.namespace ? ` [${this.namespace}]` : ''} ${text.map(t => typeof t == 'string' ? t : JSONSanitize(t, 2)).join(' ')}`;\r\n\t}\r\n\r\n\tdebug(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.DEBUG) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.DEBUG, str);\r\n\t\tconsole.debug(CliForeground.LIGHT_GREY + str + CliEffects.CLEAR);\r\n\t}\r\n\r\n\tlog(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.LOG) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.LOG, str);\r\n\t\tconsole.log(CliEffects.CLEAR + str);\r\n\t}\r\n\r\n\tinfo(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.INFO) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.INFO, str);\r\n\t\tconsole.info(CliForeground.BLUE + str + CliEffects.CLEAR);\r\n\t}\r\n\r\n\twarn(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.WARN) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.WARN, str);\r\n\t\tconsole.warn(CliForeground.YELLOW + str + CliEffects.CLEAR);\r\n\t}\r\n\r\n\terror(...args: any[]) {\r\n\t\tif(Logger.LOG_LEVEL < LOG_LEVEL.ERROR) return;\r\n\t\tconst str = this.format(...args);\r\n\t\tLogger.emit(LOG_LEVEL.ERROR, str);\r\n\t\tconsole.error(CliForeground.RED + str + CliEffects.CLEAR);\r\n\t}\r\n}\r\n","/**\n * Convert decimal number to fraction\n *\n * @example\n * ```js\n * dec2Frac(1.25) // Outputs: \"1 1/4\"\n * ```\n *\n * @param {number} num Number to convert\n * @param maxDen\n * @return {string} Fraction with remainder\n */\nexport function dec2Frac(num: number, maxDen=1000): string {\n\tlet sign = Math.sign(num);\n\tnum = Math.abs(num);\n\tif (Number.isInteger(num)) return (sign * num) + \"\";\n\tlet closest = { n: 0, d: 1, diff: Math.abs(num) };\n\tfor (let d = 1; d <= maxDen; d++) {\n\t\tlet n = Math.round(num * d);\n\t\tlet diff = Math.abs(num - n / d);\n\t\tif (diff < closest.diff) {\n\t\t\tclosest = { n, d, diff };\n\t\t\tif (diff < 1e-8) break; // Close enough\n\t\t}\n\t}\n\tlet integer = Math.floor(closest.n / closest.d);\n\tlet numerator = closest.n - integer * closest.d;\n\treturn (sign < 0 ? '-' : '') +\n\t\t(integer ? integer + ' ' : '') +\n\t\t(numerator ? numerator + '/' + closest.d : '');\n}\n\n\n/**\n * Convert fraction to decimal number\n *\n * @example\n * ```js\n * fracToDec('1 1/4') // Outputs: 1.25\n * ```\n *\n * @param {string} frac Fraction to convert\n * @return {number} Faction as a decimal\n */\nexport function fracToDec(frac: string) {\n\tlet split = frac.split(' ');\n\tconst whole = split.length == 2 ? Number(split[0]) : 0;\n\tsplit = (<string>split.pop()).split('/');\n\treturn whole + (Number(split[0]) / Number(split[1]));\n}\n\n/**\n * Add a suffix to a number:\n * 1 = 1st\n * 2 = 2nd\n * 3 = 3rd\n * N = Nth\n * @param {number} n\n * @returns {string}\n */\nexport function numSuffix(n: number): string {\n\tconst s = ['th', 'st', 'nd', 'rd'], v = n % 100;\n\treturn `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;\n}\n","import {LogLevels} from './logger.ts';\r\nimport {PathEvent} from './path-events.ts';\r\nimport {md5} from './string';\r\n\r\n/**\r\n * Compare version numbers\r\n * @param {string} target\r\n * @param {string} vs\r\n * @return {number} -1 = target is lower, 0 = equal, 1 = higher\r\n */\r\nexport function compareVersions(target: string, vs: string): -1 | 0 | 1 {\r\n\tconst [tMajor, tMinor, tPatch] = target.split('.').map(v => +v.replace(/[^0-9]/g, ''));\r\n\tconst [vMajor, vMinor, vPatch] = vs.split('.').map(v => +v.replace(/[^0-9]/g, ''));\r\n\treturn (tMajor > vMajor || tMinor > vMinor || tPatch > vPatch) ? 1 :\r\n\t\t(tMajor < vMajor || tMinor < vMinor || tPatch < vPatch) ? -1 : 0;\r\n}\r\n\r\n/**\r\n * Create a console object to intercept logs with optional passthrough\r\n * @param {null | {debug: Function, log: Function, info: Function, warn: Function, error: Function}} out Passthrough logs, null to silence\r\n * @param {{[K in LogLevels]?: LogLevels | \"none\"}} map Map log levels: {log: 'debug', warn: 'error'} = Suppress debug logs, elevate warnings\r\n * @returns {{debug: Function, log: Function, info: Function, warn: Function, error: Function, stderr: string[], stdout: string[]}}\r\n */\r\nexport function consoleInterceptor(\r\n\tout: null | {debug: Function, log: Function, info: Function, warn: Function, error: Function} = console,\r\n\tmap?: {[K in LogLevels]?: LogLevels | 'none'}\r\n): {debug: Function, log: Function, info: Function, warn: Function, error: Function, output: {debug: any[], log: any[], info: any[], warn: any[], error: any[], stderr: any[], stdout: any[]}} {\r\n\tconst logs: any = {debug: [], log: [], info: [], warn: [], error: [], stderr: [], stdout: [],}\r\n\tconst cWrapper = (type: 'debug' | 'log' | 'info' | 'warn' | 'error') => ((...args: any[]) => {\r\n\t\tif(out) out[type](...args);\r\n\t\tlogs[type].push(...args);\r\n\t\tif(type == 'error') logs.stderr.push(...args);\r\n\t\telse logs.stdout.push(...args);\r\n\t});\r\n\treturn {\r\n\t\tdebug: map?.debug != 'none' ? cWrapper(map?.debug || 'debug') : () => {},\r\n\t\tlog: map?.log != 'none' ? cWrapper(map?.log || 'log') : () => {},\r\n\t\tinfo: map?.info != 'none' ? cWrapper(map?.info || 'info') : () => {},\r\n\t\twarn: map?.warn != 'none' ? cWrapper(map?.warn || 'warn') : () => {},\r\n\t\terror: map?.error != 'none' ? cWrapper(map?.error || 'error') : () => {},\r\n\t\toutput: logs\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * Escape any regex special characters to avoid misinterpretation during search\r\n * @param {string} value String which should be escaped\r\n * @return {string} New escaped sequence\r\n */\r\nexport function escapeRegex(value: string) {\r\n\treturn value.replace(/[.*+?^${}()|\\[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Run a stringified function with arguments asynchronously\r\n * @param {object} args Map of key/value arguments\r\n * @param {string} fn Function as string\r\n * @param {boolean} async Run with async (returns a promise)\r\n * @return {T | Promise<T>} Function return result\r\n */\r\nexport function fn<T>(args: object, fn: string, async: boolean = false): T {\r\n\tconst keys = Object.keys(args);\r\n\treturn new Function(...keys, `return (${async ? 'async ' : ''}(${keys.join(',')}) => { ${fn} })(${keys.join(',')})`)(...keys.map(k => (<any>args)[k]));\r\n}\r\n\r\n/**\r\n * Get profile image from Gravatar\r\n *\r\n * @param {string} email Account email address\r\n * @param {string} def Default image, can be a link or '404', see: https://docs.gravatar.com/general/images/\r\n * @returns {string} Gravatar URL\r\n */\r\nexport function gravatar(email: string, def='mp') {\r\n\tif(!email) return '';\r\n\treturn `https://www.gravatar.com/avatar/${md5(email)}?d=${def}`;\r\n}\r\n\r\n/**\r\n * Convert IPv6 to v4 because who uses that, NAT4Life\r\n * @param {string} ip IPv6 address, e.g. 2001:0db8:85a3:0000:0000:8a2e:0370:7334\r\n * @returns {string | null} IPv4 address, e.g. 172.16.58.3\r\n */\r\nexport function ipV6ToV4(ip: string) {\r\n\tif(!ip) return null;\r\n\tconst ipv4 = ip.split(':').splice(-1)[0];\r\n\tif(ipv4 == '1') return '127.0.0.1';\r\n\treturn ipv4;\r\n}\r\n\r\n/**\r\n * Check if IP is reserved, e.g. localhost, private IPs, etc.\r\n * @param {string} ip\r\n * @returns {boolean}\r\n */\r\nexport function reservedIp(ip: string): boolean {\r\n\tif(ip == 'localhost' || ip == '127.0.0.1') return true;\r\n\treturn /\\b(10\\.(?:[0-9]{1,3}\\.){2}[0-9]{1,3})\\b|\\b(172\\.(?:1[6-9]|2[0-9]|3[0-1])\\.(?:[0-9]{1,3}\\.)[0-9]{1,3})\\b|\\b(192\\.168\\.(?:[0-9]{1,3}\\.)[0-9]{1,3})\\b/.test(ip);\r\n}\r\n\r\n\r\n/**\r\n * Represents a function that listens for events and handles them accordingly.\r\n *\r\n * @param {PathEvent} event - The event object containing data related to the triggered event.\r\n * @param {...any} args - Additional arguments that may be passed to the listener.\r\n * @returns {any} The return value of the listener, which can vary based on implementation.\r\n */\r\nexport type Listener = (event: PathEvent, ...args: any[]) => any;\r\n\r\n/** Represents a function that can be called to unsubscribe from an event, stream, or observer */\r\nexport type Unsubscribe = () => void;\r\n","import {makeArray} from './array.ts';\nimport {ASet} from './aset.ts';\n\n/**\n * Available methods:\n * * - All/Wildcard\n * n - None\n * c - Create\n * r - Read\n * u - Update\n * d - Delete\n * x - Execute\n */\nexport type Method = '*' | 'n' | 'c' | 'r' | 'u' | 'd' | 'x';\n\n/**\n * Shorthand for creating Event from a string\n *\n * @example\n * ```ts\n * const event: Event = PE`users/system:*`;\n * ```\n *\n * @param {TemplateStringsArray} str String that will be parsed into Event\n * @param {string} args\n * @return {PathEvent} Event object\n */\nexport function PE(str: TemplateStringsArray, ...args: any[]) {\n\tconst combined = [];\n\tfor(let i = 0; i < str.length || i < args.length; i++) {\n\t\tif(str[i]) combined.push(str[i]);\n\t\tif(args[i]) combined.push(args[i]);\n\t}\n\treturn new PathEvent(combined.join('/'));\n}\n\n/**\n * Shorthand for creating Event strings, ensures paths are correct\n *\n * @param {TemplateStringsArray} str\n * @param {string} args\n * @return {string}\n * @constructor\n */\nexport function PES(str: TemplateStringsArray, ...args: any[]) {\n\tlet combined = [];\n\tfor(let i = 0; i < str.length || i < args.length; i++) {\n\t\tif(str[i]) combined.push(str[i]);\n\t\tif(args[i]) combined.push(args[i]);\n\t}\n\tconst [paths, methods] = combined.join('/').split(':');\n\treturn PathEvent.toString(paths, <any>methods?.split(''));\n}\n\nexport class PathError extends Error { }\n\n/**\n * A event broken down into its core components for easy processing\n * Event Structure: `module/path/name:method`\n * Example: `users/system:crud` or `storage/some/path/file.txt:r`\n * Supports glob patterns: `users/*:r` or `storage/**:rw`\n */\nexport class PathEvent {\n\t/** First directory in path */\n\tmodule!: string;\n\t/** Entire path, including the module & name */\n\tfullPath!: string;\n\t/** Path including the name, excluding the module */\n\tpath!: string;\n\t/** Last segment of path */\n\tname!: string;\n\t/** List of methods */\n\tmethods!: ASet<Method>;\n\t/** Whether this path contains glob patterns */\n\thasGlob!: boolean;\n\n\t/** Internal cache for PathEvent instances to avoid redundant parsing */\n\tprivate static pathEventCache: Map<string, PathEvent> = new Map();\n\t/** Cache for compiled permissions (path + required permissions → result) */\n\tprivate static permissionCache: Map<string, PathEvent> = new Map();\n\t/** Max size for permission cache before LRU eviction */\n\tprivate static readonly MAX_PERMISSION_CACHE_SIZE = 1000;\n\n\t/** All/Wildcard specified */\n\tget all(): boolean { return this.methods.has('*') }\n\tset all(v: boolean) { v ? this.methods = new ASet<Method>(['*']) : this.methods.delete('*'); }\n\t/** None specified */\n\tget none(): boolean { return this.methods.has('n') }\n\tset none(v: boolean) { v ? this.methods = new ASet<Method>(['n']) : this.methods.delete('n'); }\n\t/** Create method specified */\n\tget create(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('c')) }\n\tset create(v: boolean) { v ? this.methods.delete('n').delete('*').add('c') : this.methods.delete('c'); }\n\t/** Execute method specified */\n\tget execute(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('x')) }\n\tset execute(v: boolean) { v ? this.methods.delete('n').delete('*').add('x') : this.methods.delete('x'); }\n\t/** Read method specified */\n\tget read(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('r')) }\n\tset read(v: boolean) { v ? this.methods.delete('n').delete('*').add('r') : this.methods.delete('r'); }\n\t/** Update method specified */\n\tget update(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('u')) }\n\tset update(v: boolean) { v ? this.methods.delete('n').delete('*').add('u') : this.methods.delete('u'); }\n\t/** Delete method specified */\n\tget delete(): boolean { return !this.methods.has('n') && (this.methods.has('*') || this.methods.has('d')) }\n\tset delete(v: boolean) { v ? this.methods.delete('n').delete('*').add('d') : this.methods.delete('d'); }\n\n\tconstructor(e: string | PathEvent) {\n\t\tif(typeof e == 'object') {\n\t\t\tObject.assign(this, e);\n\t\t\treturn;\n\t\t}\n\n\t\tif(PathEvent.pathEventCache.has(e)) {\n\t\t\tObject.assign(this, PathEvent.pathEventCache.get(e)!);\n\t\t\treturn;\n\t\t}\n\n\t\tlet [p, method] = e.replaceAll(/(^|\\/)\\*+\\/?$/g, '').split(':');\n\t\tif(!method) method = '*';\n\n\t\t// Handle special cases\n\t\tif(p === '' || p === undefined || p === '*') {\n\t\t\tthis.module = '';\n\t\t\tthis.path = '';\n\t\t\tthis.fullPath = '**';\n\t\t\tthis.name = '';\n\t\t\tthis.methods = new ASet<Method>(p === '*' ? ['*'] : <any>method.split(''));\n\t\t\tthis.hasGlob = true;\n\t\t\tPathEvent.pathEventCache.set(e, this);\n\t\t\treturn;\n\t\t}\n\n\t\tlet temp = p.split('/').filter(p => !!p);\n\t\tthis.module = temp.splice(0, 1)[0] || '';\n\t\tthis.path = temp.join('/');\n\t\tthis.fullPath = `${this.module}${this.module && this.path ? '/' : ''}${this.path}`;\n\t\tthis.name = temp.pop() || '';\n\t\tthis.hasGlob = this.fullPath.includes('*');\n\t\tthis.methods = new ASet(<any>method.split(''));\n\t\tPathEvent.pathEventCache.set(e, this);\n\t}\n\n\t/**\n\t * Check if a filter pattern matches a target path\n\t * @private\n\t */\n\tprivate static matches(pattern: PathEvent, target: PathEvent): boolean {\n\t\tconst methodsMatch = pattern.all || target.all || pattern.methods.intersection(target.methods).length > 0;\n\t\tif(!methodsMatch) return false;\n\t\tif(!pattern.hasGlob && !target.hasGlob) {\n\t\t\tconst last = pattern.fullPath[target.fullPath.length];\n\t\t\treturn pattern.fullPath.startsWith(target.fullPath) && (last == null || last == '/');\n\t\t}\n\t\tif(pattern.hasGlob) return this.pathMatchesGlob(target.fullPath, pattern.fullPath);\n\t\treturn this.pathMatchesGlob(pattern.fullPath, target.fullPath);\n\t}\n\n\t/**\n\t * Check if a path matches a glob pattern\n\t * @private\n\t */\n\tprivate static pathMatchesGlob(path: string, pattern: string): boolean {\n\t\tif(pattern === path) return true;\n\t\tconst pathParts = path.split('/').filter(p => !!p);\n\t\tconst patternParts = pattern.split('/').filter(p => !!p);\n\n\t\tlet pathIdx = 0;\n\t\tlet patternIdx = 0;\n\t\twhile (patternIdx < patternParts.length && pathIdx < pathParts.length) {\n\t\t\tconst patternPart = patternParts[patternIdx];\n\t\t\tif(patternPart === '**') {\n\t\t\t\tif(patternIdx === patternParts.length - 1) return true;\n\t\t\t\twhile (pathIdx < pathParts.length) {\n\t\t\t\t\tif(PathEvent.pathMatchesGlob(pathParts.slice(pathIdx).join('/'), patternParts.slice(patternIdx + 1).join('/'))) return true;\n\t\t\t\t\tpathIdx++;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} else if(patternPart === '*') {\n\t\t\t\tpathIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t} else {\n\t\t\t\tif(patternPart !== pathParts[pathIdx]) return false;\n\t\t\t\tpathIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t}\n\t\t}\n\t\tif(patternIdx < patternParts.length) return patternParts.slice(patternIdx).every(p => p === '**');\n\t\treturn pathIdx === pathParts.length;\n\t}\n\n\t/**\n\t * Score a path for specificity ranking (lower = more specific = higher priority)\n\t * @private\n\t */\n\tprivate static scoreSpecificity(path: string): number {\n\t\tif(path === '**' || path === '') return Number.MAX_SAFE_INTEGER;\n\t\tconst segments = path.split('/').filter(p => !!p);\n\t\tlet score = -segments.length;\n\t\tsegments.forEach(seg => {\n\t\t\tif(seg === '**') score += 0.5;\n\t\t\telse if(seg === '*') score += 0.25;\n\t\t});\n\t\treturn score;\n\t}\n\n\t/** Clear the cache of all PathEvents */\n\tstatic clearCache(): void {\n\t\tPathEvent.pathEventCache.clear();\n\t}\n\n\t/** Clear the permission cache */\n\tstatic clearPermissionCache(): void {\n\t\tPathEvent.permissionCache.clear();\n\t}\n\n\t/**\n\t * Combine multiple events into one parsed object. Longest path takes precedent, but all subsequent methods are\n\t * combined until a \"none\" is reached\n\t *\n\t * @param {string | PathEvent} paths Events as strings or pre-parsed\n\t * @return {PathEvent} Final combined permission\n\t */\n\tstatic combine(...paths: (string | PathEvent)[]): PathEvent {\n\t\tconst parsed = paths.map(p => p instanceof PathEvent ? p : new PathEvent(p));\n\t\tconst sorted = parsed.toSorted((p1, p2) => {\n\t\t\tconst score1 = PathEvent.scoreSpecificity(p1.fullPath);\n\t\t\tconst score2 = PathEvent.scoreSpecificity(p2.fullPath);\n\t\t\treturn score1 - score2;\n\t\t});\n\t\tlet result: PathEvent | null = null;\n\t\tfor (const p of sorted) {\n\t\t\tif(!result) {\n\t\t\t\tresult = p;\n\t\t\t} else {\n\t\t\t\tif(result.fullPath.startsWith(p.fullPath)) {\n\t\t\t\t\tif(p.none) break;\n\t\t\t\t\tresult.methods = new ASet([...result.methods, ...p.methods]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result || new PathEvent('');\n\t}\n\n\t/**\n\t * Filter a set of paths based on the target\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of events that will filtered\n\t * @param filter {...PathEvent} Must contain one of\n\t * @return {PathEvent[]} Filtered results\n\t */\n\tstatic filter(target: string | PathEvent | (string | PathEvent)[], ...filter: (string | PathEvent)[]): PathEvent[] {\n\t\tconst parsedTarget = makeArray(target).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\tconst parsedFilter = makeArray(filter).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\treturn parsedTarget.filter(t => !!parsedFilter.find(r => PathEvent.matches(r, t)));\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if any overlap is found\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have at least one of these path\n\t * @return {boolean} Whether there is any overlap\n\t */\n\tstatic has(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): boolean {\n\t\tconst parsedTarget = makeArray(target).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\tconst parsedRequired = makeArray(has).map(pe => pe instanceof PathEvent ? pe : new PathEvent(pe));\n\t\treturn !!parsedRequired.find(r => !!parsedTarget.find(t => PathEvent.matches(r, t)));\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if the target has all paths\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have all these paths\n\t * @return {boolean} Whether all are present\n\t */\n\tstatic hasAll(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): boolean {\n\t\treturn has.filter(h => PathEvent.has(target, h)).length == has.length;\n\t}\n\n\t/**\n\t * Same as `has` but raises an error if there is no overlap\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have at least one of these path\n\t */\n\tstatic hasFatal(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): void {\n\t\tif(!PathEvent.has(target, ...has)) throw new PathError(`Requires one of: ${makeArray(has).join(', ')}`);\n\t}\n\n\t/**\n\t * Same as `hasAll` but raises an error if the target is missing any paths\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of Events as strings or pre-parsed\n\t * @param has Target must have all these paths\n\t */\n\tstatic hasAllFatal(target: string | PathEvent | (string | PathEvent)[], ...has: (string | PathEvent)[]): void {\n\t\tif(!PathEvent.hasAll(target, ...has)) throw new PathError(`Requires all: ${makeArray(has).join(', ')}`);\n\t}\n\n\t/**\n\t * Create event string from its components\n\t *\n\t * @param {string | string[]} path Event path\n\t * @param {Method} methods Event method\n\t * @return {string} String representation of Event\n\t */\n\tstatic toString(path: string | string[], methods: Method | Method[]): string {\n\t\tlet p = makeArray(path).filter(p => !!p).join('/');\n\t\tp = p?.trim().replaceAll(/\\/{2,}/g, '/').replaceAll(/(^\\/|\\/$)/g, '');\n\t\tif(methods?.length) p += `:${makeArray(methods).map(m => m.toLowerCase()).join('')}`;\n\t\treturn p;\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if any overlap is found\n\t *\n\t * @param has Target must have at least one of these path\n\t * @return {boolean} Whether there is any overlap\n\t */\n\thas(...has: (string | PathEvent)[]): boolean {\n\t\treturn PathEvent.has(this, ...has);\n\t}\n\n\t/**\n\t * Squash 2 sets of paths & return true if the target has all paths\n\t *\n\t * @param has Target must have all these paths\n\t * @return {boolean} Whether all are present\n\t */\n\thasAll(...has: (string | PathEvent)[]): boolean {\n\t\treturn PathEvent.hasAll(this, ...has);\n\t}\n\n\t/**\n\t * Same as `has` but raises an error if there is no overlap\n\t *\n\t * @param has Target must have at least one of these path\n\t */\n\thasFatal(...has: (string | PathEvent)[]): void {\n\t\treturn PathEvent.hasFatal(this, ...has);\n\t}\n\n\t/**\n\t * Same as `hasAll` but raises an error if the target is missing any paths\n\t *\n\t * @param has Target must have all these paths\n\t */\n\thasAllFatal(...has: (string | PathEvent)[]): void {\n\t\treturn PathEvent.hasAllFatal(this, ...has);\n\t}\n\n\t/**\n\t * Filter a set of paths based on this event\n\t *\n\t * @param {string | PathEvent | (string | PathEvent)[]} target Array of events that will filtered\n\t * @return {PathEvent[]} Filtered results\n\t */\n\tfilter(target: string | PathEvent | (string | PathEvent)[]): PathEvent[] {\n\t\treturn PathEvent.filter(target, this);\n\t}\n\n\t/**\n\t * Create event string from its components\n\t *\n\t * @return {string} String representation of Event\n\t */\n\ttoString() {\n\t\treturn PathEvent.toString(this.fullPath, this.methods);\n\t}\n}\n\nexport type PathListener = (event: PathEvent, ...args: any[]) => any;\nexport type PathUnsubscribe = () => void;\n\nexport type Event = string | PathEvent;\nexport interface IPathEventEmitter {\n\temit(event: Event, ...args: any[]): void;\n\toff(listener: PathListener): void;\n\ton(event: Event | Event[], listener: PathListener): PathUnsubscribe;\n\tonce(event: Event | Event[], listener?: PathListener): Promise<any>;\n\trelayEvents(emitter: PathEventEmitter): void;\n}\n\n/**\n * Event emitter that uses paths allowing listeners to listen to different combinations of modules, paths & methods\n */\nexport class PathEventEmitter implements IPathEventEmitter{\n\tprivate listeners: [PathEvent, PathListener][] = [];\n\n\tconstructor(public readonly prefix: string = '') { }\n\n\temit(event: Event, ...args: any[]) {\n\t\tconst parsed = event instanceof PathEvent ? event : new PathEvent(`${this.prefix}/${event}`);\n\t\tthis.listeners.filter(l => PathEvent.has(l[0], parsed))\n\t\t\t.forEach(l => l[1](parsed, ...args));\n\t};\n\n\toff(listener: PathListener) {\n\t\tthis.listeners = this.listeners.filter(l => l[1] != listener);\n\t}\n\n\ton(event: Event | Event[], listener: PathListener): PathUnsubscribe {\n\t\tmakeArray(event).forEach(e => {\n\t\t\tlet fullEvent: string;\n\t\t\tif(typeof e === 'string') {\n\t\t\t\t// If event starts with ':', it's a scope specifier - prepend prefix\n\t\t\t\tif(e[0] === ':' && this.prefix) {\n\t\t\t\t\tfullEvent = `${this.prefix}${e}`;\n\t\t\t\t} else if(this.prefix) {\n\t\t\t\t\tfullEvent = `${this.prefix}/${e}`;\n\t\t\t\t} else {\n\t\t\t\t\tfullEvent = e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfullEvent = e instanceof PathEvent ? PathEvent.toString(e.fullPath, e.methods) : (e as string);\n\t\t\t}\n\t\t\tthis.listeners.push([\n\t\t\t\tnew PathEvent(fullEvent),\n\t\t\t\tlistener\n\t\t\t])\n\t\t});\n\t\treturn () => this.off(listener);\n\t}\n\n\tonce(event: Event | Event[], listener?: PathListener): Promise<any> {\n\t\treturn new Promise(res => {\n\t\t\tconst unsubscribe = this.on(event, (event: PathEvent, ...args: any[]) => {\n\t\t\t\tres(args.length < 2 ? args[0] : args);\n\t\t\t\tif(listener) listener(event, ...args);\n\t\t\t\tunsubscribe();\n\t\t\t});\n\t\t});\n\t}\n\n\trelayEvents(emitter: IPathEventEmitter) {\n\t\temitter.on('**', (event, ...args) => this.emit(event, ...args));\n\t}\n}\n","import {JSONAttemptParse, JSONSerialize} from './json.ts';\nimport {dotNotation} from './objects.ts';\n\n/**\n * Filters an array of objects based on a search term and optional regex checking.\n *\n * @param {Array} rows Array of objects to filter\n * @param {string} search The logic string or regext to filter on\n * @param {boolean} [regex=false] Treat search expression as regex\n * @param {Function} [transform=(r) => r] - Transform rows before filtering\n * @return {Array} The filtered array of objects that matched search\n */\nexport function search(rows: any[], search: string, regex?: boolean, transform: Function = (r: any) => r) {\n\tif(!rows) return [];\n\treturn rows.filter(r => {\n\t\t// Empty search\n\t\tif(!search) return true;\n\t\tconst value = transform(r);\n\t\t// Regex search\n\t\tif(regex) {\n\t\t\treturn !!Object.values(value).filter((v: any) => {\n\t\t\t\ttry { return RegExp(search, 'gm').test(v.toString()); }\n\t\t\t\tcatch { return false; }\n\t\t\t}).length\n\t\t} else {\n\t\t\treturn logicTest(value, search);\n\t\t}\n\t});\n}\n\n/**\n * Test an object against a logic condition. By default values are checked\n * @param {string} condition\n * @param {object} target\n * @return {boolean}\n */\nexport function logicTest(target: object, condition: string): boolean {\n\tconst evalBoolean = (a: any, op: string, b: any): boolean => {\n\t\tswitch(op) {\n\t\t\tcase '=':\n\t\t\tcase '==': return a == b;\n\t\t\tcase '!=': return a != b;\n\t\t\tcase '+=': return a?.toString().includes(b);\n\t\t\tcase '-=': return !a?.toString().includes(b);\n\t\t\tcase '>': return a > b;\n\t\t\tcase '>=': return a >= b;\n\t\t\tcase '<': return a < b;\n\t\t\tcase '<=': return a <= b;\n\t\t\tdefault: return false;\n\t\t}\n\t}\n\n\tconst or = condition.split('||').map(p => p.trim()).filter(p => !!p);\n\treturn -1 != or.findIndex(p => {\n\t\t// Make sure all ANDs pass\n\t\tconst and = p.split('&&').map(p => p.trim()).filter(p => !!p);\n\t\treturn and.filter(p => {\n\t\t\t// Boolean operator\n\t\t\tconst prop = /(\\S+)\\s*(==?|!=|\\+=|-=|>=|>|<=|<)\\s*(\\S+)/g.exec(p);\n\t\t\tif(prop) {\n\t\t\t\tconst key = Object.keys(target).find(k => k.toLowerCase() == prop[1].toLowerCase());\n\t\t\t\treturn evalBoolean(dotNotation<any>(target, key || prop[1]), prop[2], JSONAttemptParse(prop[3]));\n\t\t\t}\n\t\t\t// Case-sensitive\n\t\t\tconst v = Object.values(target).map(JSONSerialize).join('');\n\t\t\tif(/[A-Z]/g.test(condition)) return v.includes(p);\n\t\t\t// Case-insensitive\n\t\t\treturn v.toLowerCase().includes(p);\n\t\t}).length == and.length;\n\t});\n}\n","import {BadRequestError} from './errors.ts';\nimport {dotNotation} from './objects.ts';\nimport {matchAll} from './string.ts';\nimport {formatDate} from './time.ts';\n\nexport class TemplateError extends BadRequestError { }\n\nfunction findTemplateVars(html: string): Record<string, any> {\n\tconst variables = new Set<string>();\n\tconst regex = /\\{\\{\\s*([^<>\\*\\?!/}\\s][^}]*?)\\s*}}/g;\n\tlet match;\n\n\twhile ((match = regex.exec(html)) !== null) {\n\t\tconst code = match[1].trim();\n\t\tconst varMatch = code.match(/^([a-zA-Z_$][a-zA-Z0-9_$.]*)/);\n\t\tif (varMatch) variables.add(varMatch[1]);\n\t}\n\n\tconst result: Record<string, any> = {};\n\tfor (const path of variables) {\n\t\tconst parts = path.split('.');\n\t\tlet current = result;\n\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\tconst part = parts[i];\n\t\t\tif (i === parts.length - 1) {\n\t\t\t\tcurrent[part] = '';\n\t\t\t} else {\n\t\t\t\tcurrent[part] = current[part] || {};\n\t\t\t\tcurrent = current[part];\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nexport async function renderTemplate(template: string, data: any, fetch?: (file: string) => Promise<string>) {\n\tlet content = template, found: any;\n\tconst now = new Date(), d = {\n\t\tdate: {\n\t\t\tday: now.getDate(),\n\t\t\tmonth: now.toLocaleString('default', { month: 'long' }),\n\t\t\tyear: now.getFullYear(),\n\t\t\ttime: now.toLocaleTimeString(),\n\t\t\tformat: formatDate\n\t\t},\n\t\t...(data || {}),\n\t};\n\tif(!fetch) fetch = (file) => { throw new TemplateError(`Unable to fetch template: ${file}`); }\n\tconst evaluate = (code: string, data: object, fatal = true) => {\n\t\ttry {\n\t\t\treturn Function('data', `with(data) { return ${code}; }`)(data);\n\t\t} catch {\n\t\t\tif(fatal) throw new TemplateError(`Failed to evaluate: ${code}`);\n\t\t\telse return false;\n\t\t}\n\t}\n\n\t// If Statements - Optimize what we render: `{{ ? javascript }} IF TRUE CONTENT {{ !? javascript }} ELSE-IF CONTENT {{ !? }} ELSE FALSE CONTENT {{ /? }}`\n\twhile(!!(found = /\\{\\{\\s*?\\?\\s*?(.+?)\\s*?}}([\\s\\S]*?)\\{\\{\\s*?\\/\\?\\s*?}}/g.exec(content))) {\n\t\tconst nested = matchAll(found[0], /\\{\\{\\s*?\\?.+?}}/g).slice(-1)?.[0]?.index;\n\t\tif(nested != 0) found = /\\{\\{\\s*?\\?\\s*?(.+?)\\s*?}}([\\s\\S]*?)\\{\\{\\s*?\\/\\?\\s*?}}/g.exec(content.slice(found.index + nested))\n\t\tconst parts = found[2].split(/\\{\\{\\s*?!\\?\\s*?/);\n\t\tlet result = evaluate(found[1], d, false) ? parts[0] : '';\n\t\tif (!result) {\n\t\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\t\tconst [cond, body] = parts[i].split(/}}/);\n\t\t\t\tif (!cond.trim()) {\n\t\t\t\t\tresult = body || '';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (evaluate(cond, d, false)) {\n\t\t\t\t\tresult = body || '';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcontent = content.replace(found[0], result);\n\t}\n\n\t// Imports - We render bottom up: `{{ < file.html }}`\n\twhile(!!(found = /\\{\\{\\s*?<\\s*?(.+?)\\s*?}}/g.exec(content))) {\n\t\tconst t = await fetch(found[1].trim());\n\t\tif(!t) throw new TemplateError(`Unknown imported template: ${found[1].trim()}`);\n\t\tcontent = content.replace(found[0], await renderTemplate(t, d, fetch));\n\t}\n\n\t// For Loops: `{{ * (row, index) in invoice }} CONTENT {{ /* }}`\n\twhile(!!(found = /\\{\\{\\s*?\\*\\s*?(.+?)\\s+in\\s+(.+?)\\s*?}}([\\s\\S]*?)\\{\\{\\s*?\\/\\*\\s*?}}/g.exec(content))) {\n\t\tconst split = found[1].replaceAll(/[()\\s]/g, '').split(',');\n\t\tconst element = split[0];\n\t\tconst index = split[1] || 'index';\n\t\tconst array: any[] = <any>dotNotation(d, found[2]);\n\t\tif(!array || typeof array != 'object') throw new TemplateError(`Cannot iterate: ${found[2]}`);\n\t\tlet compiled = [];\n\t\tfor(let i = 0; i < array.length; i++)\n\t\t\tcompiled.push(await renderTemplate(found[3], {...d, [element]: array[i], [index]: i}, fetch));\n\t\tcontent = content.replace(found[0], compiled.join('\\n'));\n\t}\n\n\t// Evaluate whatever is left - Should come last: `{{ javascript }}`\n\twhile(!!(found = /\\{\\{\\s*([^<>\\*\\?!/}\\s][^}]*?)\\s*}}/g.exec(content))) {\n\t\tcontent = content.replace(found[0], evaluate(found[1].trim(), d) ?? '');\n\t}\n\n\t// Extends: `{{ > file.html:property }} CONTENT {{ /> }}`\n\twhile(!!(found = /\\{\\{\\s*?>\\s*?(.+?):(.+?)\\s*?}}([\\s\\S]*?)\\{\\{\\s*?\\/>\\s*?}}/g.exec(content))) {\n\t\tconst t = await fetch(found[1].trim());\n\t\tif(!t) throw new TemplateError(`Unknown extended templated: ${found[1].trim()}`);\n\t\tcontent = content.replace(found[0], await renderTemplate(t, {\n\t\t\t...d,\n\t\t\t[found[2].trim()]: found[3],\n\t\t}, fetch));\n\t}\n\n\treturn content;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.persist = exports.Persist = void 0;\n/**\n * Sync variable's value with persistent storage (LocalStorage by default)\n *\n * @example\n * ```ts\n * const theme = new Persist('theme.current', {default: 'os'});\n * console.log(theme.value); // Output: os\n *\n * theme.value = 'light'; // Any changes to `.value` will automatically sync with localStorage\n *\n * location.reload(); // Simulate refresh\n * console.log(theme.value); // Output: light\n * ```\n */\nclass Persist {\n key;\n options;\n /** Backend service to store data, must implement `Storage` interface */\n storage;\n /** Listeners which should be notified on changes */\n watches = {};\n /** Private value field */\n _value;\n /** Current value or default if undefined */\n get value() { return this._value !== undefined ? this._value : this.options?.default; }\n /** Set value with proxy object wrapper to sync future changes */\n set value(v) {\n if (v == null || typeof v != 'object')\n this._value = v;\n // @ts-ignore\n else\n this._value = new Proxy(v, {\n get: (target, p) => {\n const f = typeof target[p] == 'function';\n if (!f)\n return target[p];\n return (...args) => {\n const value = target[p](...args);\n this.save();\n return value;\n };\n },\n set: (target, p, newValue) => {\n target[p] = newValue;\n this.save();\n return true;\n }\n });\n this.save();\n }\n /**\n * @param {string} key Primary key value will be stored under\n * @param {PersistOptions<T>} options Configure using {@link PersistOptions}\n */\n constructor(key, options = {}) {\n this.key = key;\n this.options = options;\n this.storage = options.storage || localStorage;\n this.load();\n }\n /** Notify listeners of change */\n notify(value) {\n Object.values(this.watches).forEach(watch => watch(value));\n }\n /** Delete value from storage */\n clear() {\n this.storage.removeItem(this.key);\n }\n /** Save current value to storage */\n save() {\n if (this._value === undefined)\n this.clear();\n else\n this.storage.setItem(this.key, JSON.stringify(this._value));\n this.notify(this.value);\n }\n /** Load value from storage */\n load() {\n if (this.storage[this.key] != undefined) {\n let value = JSON.parse(this.storage.getItem(this.key));\n if (value != null && typeof value == 'object' && this.options.type)\n value.__proto__ = this.options.type.prototype;\n this.value = value;\n }\n else\n this.value = this.options.default || undefined;\n }\n /**\n * Callback function which is run when there are changes\n *\n * @param {(value: T) => any} fn Callback will run on each change; it's passed the next value & it's return is ignored\n * @returns {() => void} Function which will unsubscribe the watch/callback when called\n */\n watch(fn) {\n const index = Object.keys(this.watches).length;\n this.watches[index] = fn;\n return () => { delete this.watches[index]; };\n }\n /**\n * Return value as JSON string\n *\n * @returns {string} Stringified object as JSON\n */\n toString() { return JSON.stringify(this.value); }\n /**\n * Return current value\n *\n * @returns {T} Current value\n */\n valueOf() { return this.value; }\n}\nexports.Persist = Persist;\n/**\n * Sync class property with persistent storage (LocalStorage by default)\n *\n * @example\n * ```ts\n * class ThemeEngine {\n * @persist({default: 'os'}) current!: string;\n * }\n *\n * const theme = new ThemeEngine();\n * console.log(theme.current) // Output: os\n *\n * theme.current = 'light'; //Any changes will be automatically saved to localStorage\n *\n * location.reload(); // Simulate refresh\n * console.log(theme.current) // Output: light\n * ```\n *\n * @group Decorators\n * @param {PersistOptions<T> & {key?: string}} options Configure using {@link PersistOptions}\n * @returns Decorator function\n */\nfunction persist(options) {\n return (target, prop) => {\n const key = options?.key || `${target.constructor.name}.${prop.toString()}`;\n const wrapper = new Persist(key, options);\n Object.defineProperty(target, prop, {\n get: function () { return wrapper.value; },\n set: function (v) { wrapper.value = v; }\n });\n };\n}\nexports.persist = persist;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MemoryStorage = void 0;\n/**\n * Example storage backend. By default, persist will use localStorage however,\n * by implementing the Storage interface you can provide a custom backend to\n * store data anywhere you desire such as an external database or redis.\n *\n * @ignore\n */\nclass MemoryStorage {\n get length() { return Object.keys(this).length; }\n clear() { Object.keys(this).forEach(k => this.removeItem(k)); }\n getItem(key) { return this[key]; }\n key(index) { return Object.keys(this)[index]; }\n removeItem(key) { delete this[key]; }\n setItem(key, value) { this[key] = value; }\n}\nexports.MemoryStorage = MemoryStorage;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./persist\"), exports);\n__exportStar(require(\"./memory-storage\"), exports);\n"],"names":["base","prop","obj","fn","search","key","inQuotes","h","numSuffix","formData","q","res","LOG_LEVEL","p","event","fetch","data","persist_1","persist","this","exports","require$$0","require$$1"],"mappings":"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","x_google_ignoreList":[23,24,25]}