{"version":3,"sources":["../../src/utils/strings.ts"],"sourcesContent":["const reStructuralChars = /(?<structural>[\\{\\}\\[\\]\\:\\#\\\"\\'\\\\\\\\~])/;\r\nconst reRequiresQuoting = /[\\,]/;  // Characters that require quoting, not escaping\r\nconst escapeChars = /(?<escape>[\\n\\r\\t])/;\r\nconst reNewLine = /(?<newlines>(\\r\\n?)|\\n)/g;\r\n\r\nexport const toOpenString = (str: string, escapeLines: boolean) => {\r\n  str = str.replace(new RegExp(reStructuralChars, 'g'), '\\\\$1');\r\n\r\n  if (escapeLines) {\r\n    str = str.replace(reNewLine, '\\\\n');\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\nexport const toRegularString = (str: string, escapeLines: boolean, encloser: string='\"') => {\r\n  str = str.replace(new RegExp(escapeChars, 'g'), '\\\\$1');\r\n\r\n  if (escapeLines) {\r\n    str = str.replace(reNewLine, '\\\\n');\r\n  }\r\n\r\n  return `${encloser}${str.replace(new RegExp(encloser, 'g'), `\\\\${encloser}`)}${encloser}`;\r\n}\r\n\r\nexport const toRawString = (str: string, encloser: string='\"') => {\r\n  return `r${encloser}${str.replace(new RegExp(encloser, 'g'), encloser + encloser)}${encloser}`;\r\n}\r\n\r\n// Regex to detect ANY string that looks like a number when parsed\r\n// This includes:\r\n// - Pure digits: \"123\", \"0001\", \"5001\"\r\n// - Negative numbers: \"-123\"\r\n// - Decimals: \"3.14\", \".5\", \"123.\"\r\n// - Scientific notation: \"1e10\", \"1E-5\"\r\n// - Special numeric values that IO parser recognizes\r\n// All of these MUST be quoted to preserve string type\r\nconst reNumericLooking = /^-?\\.?\\d/;  // Starts with optional minus, optional dot, then digit\r\n\r\n// More precise check for values that would parse as numbers\r\nfunction looksLikeNumber(str: string): boolean {\r\n  // Empty string is not a number\r\n  if (str.length === 0) return false;\r\n\r\n  // Check if it starts like a number (digit, or -/+ followed by digit, or . followed by digit)\r\n  const first = str[0];\r\n  if (first === '-' || first === '+') {\r\n    if (str.length === 1) return false;\r\n    const second = str[1];\r\n    return second >= '0' && second <= '9' || second === '.';\r\n  }\r\n  if (first === '.') {\r\n    if (str.length === 1) return false;\r\n    const second = str[1];\r\n    return second >= '0' && second <= '9';\r\n  }\r\n  // If it starts with a digit, it looks like a number\r\n  return first >= '0' && first <= '9';\r\n}\r\n\r\n// Regex for Date/Time/DateTime\r\nconst reDate = /^\\d{4}-\\d{2}-\\d{2}$/;\r\nconst reTime = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/;\r\nconst reDateTime = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?$/;\r\n\r\nconst ambiguousValues = new Set([\r\n  'null', 'N',\r\n  'true', 'T',\r\n  'false', 'F',\r\n  'Inf', '+Inf', '-Inf', 'NaN',\r\n  'undefined'\r\n]);\r\n\r\nfunction isAmbiguous(str: string): boolean {\r\n  if (str === null || str === undefined) return true;\r\n  if (str.length === 0) return true;\r\n  if (ambiguousValues.has(str)) return true;\r\n  // Any string that looks like a number must be quoted\r\n  if (looksLikeNumber(str)) return true;\r\n  if (reDate.test(str)) return true;\r\n  if (reTime.test(str)) return true;\r\n  if (reDateTime.test(str)) return true;\r\n  return false;\r\n}\r\n\r\nexport const toAutoString = (str: string, escapeLines: boolean, encloser: string='\"') => {\r\n  // Handle null/undefined\r\n  if (str === null || str === undefined) {\r\n    return '\"\"';  // Empty string representation\r\n  }\r\n\r\n  // If it looks like a number, bool, null, or date, quote it to preserve type\r\n  if (isAmbiguous(str)) {\r\n    return toRegularString(str, escapeLines, encloser);\r\n  }\r\n\r\n  // If the string contains comma, it MUST be quoted (not escaped) to avoid parsing issues\r\n  if (reRequiresQuoting.test(str)) {\r\n    return toRegularString(str, escapeLines, encloser);\r\n  }\r\n\r\n  // If the string contains any of the structural characters, then return as open string\r\n  if (reStructuralChars.test(str)) {\r\n    return toOpenString(str, escapeLines);\r\n  }\r\n\r\n  // If the string contains any of the escape characters, then retrun as raw string\r\n  if (escapeChars.test(str)) {\r\n    return toRawString(str, encloser);\r\n  }\r\n\r\n  // Otherwise, return as open string (it was regular string before)\r\n  return toOpenString(str, escapeLines);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,cAAc;AACpB,MAAM,YAAY;AAEX,MAAM,eAAe,CAAC,KAAa,gBAAyB;AACjE,QAAM,IAAI,QAAQ,IAAI,OAAO,mBAAmB,GAAG,GAAG,MAAM;AAE5D,MAAI,aAAa;AACf,UAAM,IAAI,QAAQ,WAAW,KAAK;AAAA,EACpC;AAEA,SAAO;AACT;AAEO,MAAM,kBAAkB,CAAC,KAAa,aAAsB,WAAiB,QAAQ;AAC1F,QAAM,IAAI,QAAQ,IAAI,OAAO,aAAa,GAAG,GAAG,MAAM;AAEtD,MAAI,aAAa;AACf,UAAM,IAAI,QAAQ,WAAW,KAAK;AAAA,EACpC;AAEA,SAAO,GAAG,QAAQ,GAAG,IAAI,QAAQ,IAAI,OAAO,UAAU,GAAG,GAAG,KAAK,QAAQ,EAAE,CAAC,GAAG,QAAQ;AACzF;AAEO,MAAM,cAAc,CAAC,KAAa,WAAiB,QAAQ;AAChE,SAAO,IAAI,QAAQ,GAAG,IAAI,QAAQ,IAAI,OAAO,UAAU,GAAG,GAAG,WAAW,QAAQ,CAAC,GAAG,QAAQ;AAC9F;AAUA,MAAM,mBAAmB;AAGzB,SAAS,gBAAgB,KAAsB;AAE7C,MAAI,IAAI,WAAW,EAAG,QAAO;AAG7B,QAAM,QAAQ,IAAI,CAAC;AACnB,MAAI,UAAU,OAAO,UAAU,KAAK;AAClC,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,UAAM,SAAS,IAAI,CAAC;AACpB,WAAO,UAAU,OAAO,UAAU,OAAO,WAAW;AAAA,EACtD;AACA,MAAI,UAAU,KAAK;AACjB,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,UAAM,SAAS,IAAI,CAAC;AACpB,WAAO,UAAU,OAAO,UAAU;AAAA,EACpC;AAEA,SAAO,SAAS,OAAO,SAAS;AAClC;AAGA,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,aAAa;AAEnB,MAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EAAQ;AAAA,EACR;AAAA,EAAQ;AAAA,EACR;AAAA,EAAS;AAAA,EACT;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACvB;AACF,CAAC;AAED,SAAS,YAAY,KAAsB;AACzC,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,MAAI,gBAAgB,IAAI,GAAG,EAAG,QAAO;AAErC,MAAI,gBAAgB,GAAG,EAAG,QAAO;AACjC,MAAI,OAAO,KAAK,GAAG,EAAG,QAAO;AAC7B,MAAI,OAAO,KAAK,GAAG,EAAG,QAAO;AAC7B,MAAI,WAAW,KAAK,GAAG,EAAG,QAAO;AACjC,SAAO;AACT;AAEO,MAAM,eAAe,CAAC,KAAa,aAAsB,WAAiB,QAAQ;AAEvF,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAO;AAAA,EACT;AAGA,MAAI,YAAY,GAAG,GAAG;AACpB,WAAO,gBAAgB,KAAK,aAAa,QAAQ;AAAA,EACnD;AAGA,MAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,WAAO,gBAAgB,KAAK,aAAa,QAAQ;AAAA,EACnD;AAGA,MAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,WAAO,aAAa,KAAK,WAAW;AAAA,EACtC;AAGA,MAAI,YAAY,KAAK,GAAG,GAAG;AACzB,WAAO,YAAY,KAAK,QAAQ;AAAA,EAClC;AAGA,SAAO,aAAa,KAAK,WAAW;AACtC;","names":[]}