{
  "version": 3,
  "sources": ["../index.ts"],
  "sourcesContent": [
    "/**\n * Special symbol to indicate that an infer function did not match/process the value.\n */\nconst NO_MATCH: unique symbol = Symbol(\"≇\");\n\ntype inferType = string | number | boolean | null | undefined | object;\n\n/**\n * Parse a value and run it through a transformer for custom behavior.\n */\nexport function enval<T, R>(value: unknown, transformer: (inferred: T, raw: unknown) => R): R;\n\n/**\n * Parse a value into a typed representation based on env-style input.\n */\nexport function enval<T = inferType>(value: unknown): T;\n\n/**\n * Parse a value into a boolean, number, null/undefined, JSON, or keep it as a string.\n */\nexport function enval<T>(\n  value: unknown,\n  transformer?: (inferred: inferType, raw: unknown) => T,\n): T {\n  const inferred = infer(value);\n\n  if (transformer) {\n    return transformer(inferred, value);\n  }\n\n  return inferred as T;\n}\n\nfunction infer(value: unknown): inferType {\n  if (typeof value !== \"string\") {\n    return value as inferType;\n  }\n\n  const text = value.trim();\n\n  if (text === \"\") {\n    return text;\n  }\n\n  const unquoted = text.replace(/^(['\"])(.*)\\1$/, \"$2\");\n  const lower = unquoted.toLowerCase();\n\n  for (const fn of inferFns) {\n    const result = fn(lower);\n    if (result !== NO_MATCH) return result;\n  }\n\n  return unquoted;\n}\n\nconst inferFns = [\n  function inferNullish(text: string) {\n    if (text === \"null\") return null;\n    if (text === \"undefined\") return undefined;\n    return NO_MATCH;\n  },\n  function inferBoolean(text: string) {\n    if ([\"true\", \"yes\", \"on\"].includes(text)) return true;\n    if ([\"false\", \"no\", \"off\"].includes(text)) return false;\n    return NO_MATCH;\n  },\n  function inferNumber(text: string) {\n    const numberPattern = /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/;\n    if (!numberPattern.test(text)) return NO_MATCH;\n\n    const num = Number(text);\n    return Number.isSafeInteger(num) || !Number.isInteger(num) ? num : NO_MATCH;\n  },\n  function inferJson(text: string) {\n    if (\n      (text.startsWith(\"{\") && text.endsWith(\"}\")) ||\n      (text.startsWith(\"[\") && text.endsWith(\"]\"))\n    ) {\n      try {\n        return JSON.parse(text);\n      } catch {\n        return NO_MATCH;\n      }\n    }\n    return NO_MATCH;\n  },\n];\n"
  ],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,WAA0B,OAAO,GAAE;AAiBlC,SAAS,KAAQ,CACtB,OACA,aACG;AAAA,EACH,MAAM,WAAW,MAAM,KAAK;AAAA,EAE5B,IAAI,aAAa;AAAA,IACf,OAAO,YAAY,UAAU,KAAK;AAAA,EACpC;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,KAAK,CAAC,OAA2B;AAAA,EACxC,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,MAAM,KAAK;AAAA,EAExB,IAAI,SAAS,IAAI;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,KAAK,QAAQ,kBAAkB,IAAI;AAAA,EACpD,MAAM,QAAQ,SAAS,YAAY;AAAA,EAEnC,WAAW,MAAM,UAAU;AAAA,IACzB,MAAM,SAAS,GAAG,KAAK;AAAA,IACvB,IAAI,WAAW;AAAA,MAAU,OAAO;AAAA,EAClC;AAAA,EAEA,OAAO;AAAA;AAGT,IAAM,WAAW;AAAA,EACf,SAAS,YAAY,CAAC,MAAc;AAAA,IAClC,IAAI,SAAS;AAAA,MAAQ,OAAO;AAAA,IAC5B,IAAI,SAAS;AAAA,MAAa;AAAA,IAC1B,OAAO;AAAA;AAAA,EAET,SAAS,YAAY,CAAC,MAAc;AAAA,IAClC,IAAI,CAAC,QAAQ,OAAO,IAAI,EAAE,SAAS,IAAI;AAAA,MAAG,OAAO;AAAA,IACjD,IAAI,CAAC,SAAS,MAAM,KAAK,EAAE,SAAS,IAAI;AAAA,MAAG,OAAO;AAAA,IAClD,OAAO;AAAA;AAAA,EAET,SAAS,WAAW,CAAC,MAAc;AAAA,IACjC,MAAM,gBAAgB;AAAA,IACtB,IAAI,CAAC,cAAc,KAAK,IAAI;AAAA,MAAG,OAAO;AAAA,IAEtC,MAAM,MAAM,OAAO,IAAI;AAAA,IACvB,OAAO,OAAO,cAAc,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,IAAI,MAAM;AAAA;AAAA,EAErE,SAAS,SAAS,CAAC,MAAc;AAAA,IAC/B,IACG,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,KACzC,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAC1C;AAAA,MACA,IAAI;AAAA,QACF,OAAO,KAAK,MAAM,IAAI;AAAA,QACtB,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,IAEX;AAAA,IACA,OAAO;AAAA;AAEX;",
  "debugId": "0B42359A10C6406964756E2164756E21",
  "names": []
}