{"version":3,"file":"parser.cjs","names":[],"sources":["../src/parser/number.ts","../src/parser/percent.ts","../src/parser/string.ts","../src/parser/_exports.ts"],"sourcesContent":["import { format } from 'yummies/format';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\n\nexport interface NumberParserSettings<TFallback = number> {\n  digits?: number;\n  fallback?: TFallback;\n  /**\n   * Round to upper boundary\n   * 5.1 -> 6\n   */\n  ceil?: boolean;\n  /**\n   * Round to bottom boundary\n   * 5.9 -> 5\n   */\n  floor?: boolean;\n  clamped?: [min?: Maybe<number>, max?: Maybe<number>];\n}\n\n/**\n * Parses a number from raw input and optionally clamps, rounds or limits\n * fractional digits.\n *\n * Strings are normalized by removing spaces and replacing `,` with `.` before\n * parsing. Invalid inputs return the configured fallback.\n *\n * @template TFallback Fallback value type returned when parsing fails.\n * @param input Raw value to parse.\n * @param userSettings Parser settings merged with `number.defaultSettings`.\n * @returns Parsed number or fallback value.\n *\n * @example\n * ```ts\n * number('1 234,5'); // 1234.5\n * ```\n *\n * @example\n * ```ts\n * number('bad', { fallback: 0 }); // 0\n * ```\n */\nexport const number = <TFallback = number>(\n  input: Maybe<unknown>,\n  userSettings?: Maybe<NumberParserSettings<TFallback>>,\n): number | TFallback => {\n  const settings = {\n    ...number.defaultSettings,\n    ...userSettings,\n  };\n\n  const fallback = (\n    'fallback' in settings ? settings.fallback : 0\n  ) as TFallback;\n\n  let result: number;\n\n  if (typeGuard.isNumber(input)) {\n    result = input;\n  } else if (typeGuard.isString(input)) {\n    const formattedInput = format.skipSpaces(input).replace(',', '.');\n    if (formattedInput === '') {\n      result = fallback as any;\n    } else {\n      result = Number(formattedInput);\n    }\n  } else {\n    result = fallback as any;\n  }\n\n  if (typeGuard.isNumber(result)) {\n    if (settings?.clamped != null) {\n      result = Math.max(\n        settings.clamped[0] ?? -Infinity,\n        Math.min(result, settings.clamped[1] ?? Infinity),\n      );\n    }\n\n    if (settings?.ceil != null) {\n      result = Math.ceil(result);\n    }\n\n    if (settings?.floor != null) {\n      result = Math.floor(result);\n    }\n\n    if (settings?.digits != null) {\n      result = +result.toFixed(settings.digits);\n    }\n\n    return result;\n  } else {\n    return fallback;\n  }\n};\n\nnumber.defaultSettings = {} as NumberParserSettings;\n","import type { Maybe } from 'yummies/types';\n\nimport { type NumberParserSettings, number } from './number.js';\n\n/**\n * Converts a value into a percentage of `maxValue` and parses the result with\n * the shared numeric parser.\n *\n * @template TFallback Fallback value type returned when parsing fails.\n * @param value Current value.\n * @param maxValue Maximum value representing `100%`.\n * @param settings Numeric parser settings for the computed percentage.\n * @returns Parsed percentage or fallback value.\n *\n * @example\n * ```ts\n * percent(25, 200); // 12.5\n * ```\n *\n * @example\n * ```ts\n * percent('bad', 100, { fallback: 0 }); // 0\n * ```\n */\nexport const percent = <TFallback = number>(\n  value: Maybe<string | number>,\n  maxValue?: Maybe<string | number>,\n  settings?: Maybe<NumberParserSettings<TFallback>>,\n) => {\n  return number<TFallback>((Number(value) / Number(maxValue)) * 100, settings);\n};\n","import { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\n\nexport interface StringParserSettings<TFallback = string> {\n  fallback?: TFallback;\n  prettyJson?: boolean;\n}\n\n/**\n * Converts arbitrary input into a string representation.\n *\n * Objects are serialized with `JSON.stringify`, optionally pretty-printed, and\n * nullish values resolve to the configured fallback.\n *\n * @template TFallback Fallback value type returned for nullish input.\n * @param input Raw value to stringify.\n * @param settings String conversion settings.\n * @returns Stringified input or fallback value.\n *\n * @example\n * ```ts\n * string(123); // '123'\n * ```\n *\n * @example\n * ```ts\n * string({ id: 1 }, { prettyJson: true });\n * ```\n */\nexport const string = <TFallback = string>(\n  input: Maybe<unknown>,\n  settings?: Maybe<StringParserSettings<TFallback>>,\n): string | TFallback => {\n  const fallback =\n    settings && 'fallback' in settings ? (settings.fallback as TFallback) : '';\n\n  if (input == null) {\n    return fallback;\n  }\n\n  if (typeGuard.isObject(input)) {\n    if (settings?.prettyJson) {\n      return JSON.stringify(input, null, 2);\n    }\n\n    return JSON.stringify(input);\n  }\n\n  return String(input);\n};\n","/**\n * ---header-docs-section---\n * # yummies/parser\n *\n * ## Description\n *\n * Parsers for user-entered **numbers, percents, and strings** with tolerant input and typed\n * results. Use when normalizing form values, query params, or CSV-like text before validation\n * schemas run, without duplicating regex and `parseFloat` edge cases in every feature module.\n *\n * ## Usage\n *\n * ```ts\n * import { parser } from \"yummies/parser\";\n * ```\n */\n\nexport * from './number.js';\nexport * from './percent.js';\nexport * from './string.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,IAAa,UACX,OACA,iBACuB;CACvB,MAAM,WAAW;EACf,GAAG,OAAO;EACV,GAAG;CACL;CAEA,MAAM,WACJ,cAAc,WAAW,SAAS,WAAW;CAG/C,IAAI;CAEJ,IAAI,mBAAA,UAAU,SAAS,KAAK,GAC1B,SAAS;MACJ,IAAI,mBAAA,UAAU,SAAS,KAAK,GAAG;EACpC,MAAM,iBAAiB,eAAA,OAAO,WAAW,KAAK,EAAE,QAAQ,KAAK,GAAG;EAChE,IAAI,mBAAmB,IACrB,SAAS;OAET,SAAS,OAAO,cAAc;CAElC,OACE,SAAS;CAGX,IAAI,mBAAA,UAAU,SAAS,MAAM,GAAG;EAC9B,IAAI,UAAU,WAAW,MACvB,SAAS,KAAK,IACZ,SAAS,QAAQ,MAAM,WACvB,KAAK,IAAI,QAAQ,SAAS,QAAQ,MAAM,QAAQ,CAClD;EAGF,IAAI,UAAU,QAAQ,MACpB,SAAS,KAAK,KAAK,MAAM;EAG3B,IAAI,UAAU,SAAS,MACrB,SAAS,KAAK,MAAM,MAAM;EAG5B,IAAI,UAAU,UAAU,MACtB,SAAS,CAAC,OAAO,QAAQ,SAAS,MAAM;EAG1C,OAAO;CACT,OACE,OAAO;AAEX;AAEA,OAAO,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;ACxE1B,IAAa,WACX,OACA,UACA,aACG;CACH,OAAO,OAAmB,OAAO,KAAK,IAAI,OAAO,QAAQ,IAAK,KAAK,QAAQ;AAC7E;;;;;;;;;;;;;;;;;;;;;;;;ACDA,IAAa,UACX,OACA,aACuB;CACvB,MAAM,WACJ,YAAY,cAAc,WAAY,SAAS,WAAyB;CAE1E,IAAI,SAAS,MACX,OAAO;CAGT,IAAI,mBAAA,UAAU,SAAS,KAAK,GAAG;EAC7B,IAAI,UAAU,YACZ,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;EAGtC,OAAO,KAAK,UAAU,KAAK;CAC7B;CAEA,OAAO,OAAO,KAAK;AACrB"}