{"version":3,"sources":["../index.ts"],"sourcesContent":["import { randomBytes } from \"crypto\";\n\nconst BASE_SAFE_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!-_.'()\";\nconst STRICT_ADDITIONS = \"*/\";\n\nexport type Options = Partial<{\n  replacement: string;\n  strict: boolean;\n}>;\n\nexport function sanitize(key: string, options?: Options): string {\n  if (typeof key !== \"string\") throw new Error(\"key must be a string\");\n\n  const replacement = options?.replacement ?? \"\";\n\n  const safeChars = new Set(BASE_SAFE_CHARS + (options?.strict ? STRICT_ADDITIONS : \"\"));\n\n  let sanitizedKey = \"\";\n\n  // Start from index 1 if key starts with '/'\n  let startIndex = key.startsWith(\"/\") ? 1 : 0;\n\n  for (let i = startIndex; i < key.length; i++) {\n    const char = key[i] || \"\";\n    sanitizedKey += safeChars.has(char) ? char : replacement;\n  }\n\n  return sanitizedKey || randomBytes(10).toString(\"hex\");\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4B;AAE5B,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AAOlB,SAAS,SAAS,KAAa,SAA2B;AAVjE;AAWE,MAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,MAAM,sBAAsB;AAEnE,QAAM,eAAc,wCAAS,gBAAT,YAAwB;AAE5C,QAAM,YAAY,IAAI,IAAI,oBAAmB,mCAAS,UAAS,mBAAmB,GAAG;AAErF,MAAI,eAAe;AAGnB,MAAI,aAAa,IAAI,WAAW,GAAG,IAAI,IAAI;AAE3C,WAAS,IAAI,YAAY,IAAI,IAAI,QAAQ,KAAK;AAC5C,UAAM,OAAO,IAAI,CAAC,KAAK;AACvB,oBAAgB,UAAU,IAAI,IAAI,IAAI,OAAO;AAAA,EAC/C;AAEA,SAAO,oBAAgB,2BAAY,EAAE,EAAE,SAAS,KAAK;AACvD;","names":[]}