{"version":3,"file":"convert.cjs","names":[],"sources":["../../../src/common/data/convert.ts"],"sourcesContent":["\n// import { jsonStringify } from './json'\n\nconst TRUE_VALUES_LIST = ['1', 'true', 'yes', 'y', 'on']\nconst FALSE_VALUES_LIST = ['0', 'false', 'no', 'n', 'off']\n\n/** Like Number.parseFloat, but returning `undefined` instead of `NaN` */\nexport function parseFloat(value: any): number | undefined {\n  try {\n    const parsed = Number.parseFloat(value)\n    return Number.isNaN(parsed) ? undefined : parsed\n  } catch (e) {\n    return undefined\n  }\n}\n\n/** Like Number.parseInt, but returning `undefined` instead of `NaN` */\nexport function parseInt(value: any, radix = 10): number | undefined {\n  try {\n    const parsed = Number.parseInt(value, radix)\n    return Number.isNaN(parsed) ? undefined : parsed\n  } catch (e) {\n    return undefined\n  }\n}\n\n\nexport function stringToBoolean(value?: string, defaultValue = false): boolean {\n  if (value == null || typeof value !== 'string')\n    return defaultValue\n  return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function stringToInteger(value?: string, defaultValue = 0): number {\n  if (value == null || typeof value !== 'string')\n    return defaultValue\n  return parseInt(value.trim(), 10) ?? defaultValue\n}\n\nexport function stringToFloat(value?: string, defaultValue = 0.0): number {\n  if (value == null || typeof value !== 'string')\n    return defaultValue\n  return parseFloat(value.trim()) ?? defaultValue\n}\n\n/** `true` is a number != 0, a string stating `true`. Otherwise false. */\nexport function valueToBoolean(value?: any, defaultValue = false): boolean {\n  if (value == null)\n    return defaultValue\n  if (typeof value === 'boolean')\n    return value\n  if (typeof value === 'number')\n    return value !== 0\n  return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\n/** Explicitly has to have a `false` value to become `false`, otherwise `true` */\nexport function valueToBooleanNotFalse(value?: any, defaultValue = true): boolean {\n  if (value == null)\n    return defaultValue\n  if (typeof value === 'boolean')\n    return value\n  if (typeof value === 'number')\n    return value !== 0\n  return !(FALSE_VALUES_LIST.includes(String(value).trim().toLowerCase()))\n}\n\nexport function valueToInteger(value?: any, defaultValue = 0): number {\n  if (value == null)\n    return defaultValue\n  if (typeof value === 'boolean')\n    return value ? 1 : 0\n  if (typeof value === 'number')\n    return Math.floor(value)\n  return parseInt(String(value).trim(), 10) ?? defaultValue\n}\n\nexport function valueToFloat(value?: any, defaultValue = 0.0): number {\n  if (value == null)\n    return defaultValue\n  if (typeof value === 'boolean')\n    return value ? 1 : 0\n  if (typeof value === 'number')\n    return Math.floor(value)\n  return parseFloat(String(value).trim()) ?? defaultValue\n}\n\nexport function valueToString(value?: any, defaultValue = ''): string {\n  if (value == null)\n    return defaultValue\n  // if (value == \"\") return defaultValue // ???\n  return String(value) ?? defaultValue\n}\n\n// todo: toDate, toTimestamp, toData(value, base=64)\n\n// export function mapToObject<T>(map: Map<string, T>): { [key: string]: T } {\n//   return Object.fromEntries(map)\n// }\n\n// export function objectToMap<T>(obj: { [key: string]: T }): Map<string, T> {\n//   return new Map(Object.entries(obj))\n// }\n\n// Shortcuts\n\nexport const toFloat = valueToFloat\nexport const toInt = valueToInteger\nexport const toString = valueToString\nexport const toBool = valueToBoolean\n\n\n// Awesome trick from https://stackoverflow.com/a/5396742/140927\nexport function fixBrokenUtf8String(brokenString: string): string {\n  try {\n    return decodeURIComponent(escape(brokenString))\n  }\n  catch (e) {\n    // log.debug(\"fixString failed for\", s)\n  }\n  return brokenString\n}\n"],"mappings":";;;AAGA,MAAM,mBAAmB;CAAC;CAAK;CAAQ;CAAO;CAAK;CAAK;AACxD,MAAM,oBAAoB;CAAC;CAAK;CAAS;CAAM;CAAK;CAAM;;AAG1D,SAAgB,WAAW,OAAgC;AACzD,KAAI;EACF,MAAM,SAAS,OAAO,WAAW,MAAM;AACvC,SAAO,OAAO,MAAM,OAAO,GAAG,SAAY;UACnC,GAAG;AACV;;;;AAKJ,SAAgB,SAAS,OAAY,QAAQ,IAAwB;AACnE,KAAI;EACF,MAAM,SAAS,OAAO,SAAS,OAAO,MAAM;AAC5C,SAAO,OAAO,MAAM,OAAO,GAAG,SAAY;UACnC,GAAG;AACV;;;AAKJ,SAAgB,gBAAgB,OAAgB,eAAe,OAAgB;AAC7E,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AACT,QAAO,iBAAiB,SAAS,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;;AAGtE,SAAgB,gBAAgB,OAAgB,eAAe,GAAW;AACxE,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AACT,QAAO,SAAS,MAAM,MAAM,EAAE,GAAG,IAAI;;AAGvC,SAAgB,cAAc,OAAgB,eAAe,GAAa;AACxE,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AACT,QAAO,WAAW,MAAM,MAAM,CAAC,IAAI;;;AAIrC,SAAgB,eAAe,OAAa,eAAe,OAAgB;AACzE,KAAI,SAAS,KACX,QAAO;AACT,KAAI,OAAO,UAAU,UACnB,QAAO;AACT,KAAI,OAAO,UAAU,SACnB,QAAO,UAAU;AACnB,QAAO,iBAAiB,SAAS,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;;;AAItE,SAAgB,uBAAuB,OAAa,eAAe,MAAe;AAChF,KAAI,SAAS,KACX,QAAO;AACT,KAAI,OAAO,UAAU,UACnB,QAAO;AACT,KAAI,OAAO,UAAU,SACnB,QAAO,UAAU;AACnB,QAAO,CAAE,kBAAkB,SAAS,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;;AAGzE,SAAgB,eAAe,OAAa,eAAe,GAAW;AACpE,KAAI,SAAS,KACX,QAAO;AACT,KAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,IAAI;AACrB,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,MAAM,MAAM;AAC1B,QAAO,SAAS,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI;;AAG/C,SAAgB,aAAa,OAAa,eAAe,GAAa;AACpE,KAAI,SAAS,KACX,QAAO;AACT,KAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,IAAI;AACrB,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,MAAM,MAAM;AAC1B,QAAO,WAAW,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI;;AAG7C,SAAgB,cAAc,OAAa,eAAe,IAAY;AACpE,KAAI,SAAS,KACX,QAAO;AAET,QAAO,OAAO,MAAM,IAAI;;AAe1B,MAAa,UAAU;AACvB,MAAa,QAAQ;AACrB,MAAa,WAAW;AACxB,MAAa,SAAS;AAItB,SAAgB,oBAAoB,cAA8B;AAChE,KAAI;AACF,SAAO,mBAAmB,OAAO,aAAa,CAAC;UAE1C,GAAG;AAGV,QAAO"}