/** * Basic string formatting, akin to `sprintf` or `util.format`, but limited. * Only supports `%o` for arrays, `%j` for objects, `%s` for strings and `%d` for numbers. * * You should really be using template literals instead (developer's note to self, lol). * @param fmt Input * @param args Arguments * @returns Formatted string */ export function formatstr(fmt: string, ...args: any[]) { const re = /(%?)(%([ojds]))/g; if (args.length) { fmt = fmt.replace(re, function (match, escaped, ptn, flag) { let arg = args.shift(); switch (flag) { case 'o': if (Array.isArray(arg)) { arg = JSON.stringify(arg); break; } case 's': arg = '' + arg; break; case 'd': arg = Number(arg); break; case 'j': arg = JSON.stringify(arg); break; } if (!escaped) { return arg; } args.unshift(arg); return match; }); } // arguments remain after formatting if (args.length) { fmt += ' ' + args.join(' '); } fmt = fmt.replace('%%', '%'); return '' + fmt; }