{"version":3,"sources":["../src/index.ts","../src/client.ts"],"sourcesContent":["export * from \"./types\";\nexport { CleanModClient } from \"./client\";\n\nimport type { CleanModOptions } from \"./types\";\nimport { CleanModClient } from \"./client\";\n\nexport function createCleanModClient(options: CleanModOptions): CleanModClient {\n  return new CleanModClient(options);\n}\n","import type {\n  CleanModOptions,\n  ModerateRequest,\n  ModerateResponse,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://cleanmod.dev\";\nconst DEFAULT_TIMEOUT_MS = 10000;\n\nexport class CleanModClient {\n  private apiKey: string;\n  private baseUrl: string;\n  private timeoutMs: number;\n\n  constructor(options: CleanModOptions) {\n    if (!options.apiKey) {\n      throw new Error(\"CleanMod: apiKey is required\");\n    }\n\n    this.apiKey = options.apiKey;\n    this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n    this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n  }\n\n  async moderate(req: ModerateRequest): Promise<ModerateResponse> {\n    if (!req?.text || typeof req.text !== \"string\") {\n      throw new Error(\"CleanMod: 'text' is required and must be a string\");\n    }\n\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/moderate`, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify({\n          text: req.text,\n          model: req.model ?? \"english-basic\",\n        }),\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        let bodyText: string | undefined;\n        try {\n          bodyText = await response.text();\n        } catch {\n          // ignore\n        }\n\n        throw new Error(\n          `CleanMod: API request failed with status ${response.status}${\n            bodyText ? ` – ${bodyText}` : \"\"\n          }`\n        );\n      }\n\n      const data = await response.json();\n\n      // Transform snake_case API response fields to camelCase for SDK\n      return {\n        id: data.id,\n        model: data.model,\n        provider: data.provider,\n        providerModel: data.providerModel,\n        decision: data.decision,\n        overallScore: data.overall_score,\n        thresholds: data.thresholds,\n        categories: data.categories,\n        createdAt: new Date(data.created_at),\n      } as ModerateResponse;\n    } catch (err: any) {\n      if (err?.name === \"AbortError\") {\n        throw new Error(\"CleanMod: request timed out\");\n      }\n      throw err;\n    } finally {\n      clearTimeout(timeout);\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAEpB,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAAY,SAA0B;AACpC,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,SAAS,KAAiD;AAC9D,QAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,SAAS,UAAU;AAC9C,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAEnE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,oBAAoB;AAAA,QAC9D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM,IAAI;AAAA,UACV,OAAO,IAAI,SAAS;AAAA,QACtB,CAAC;AAAA,QACD,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI;AACJ,YAAI;AACF,qBAAW,MAAM,SAAS,KAAK;AAAA,QACjC,QAAQ;AAAA,QAER;AAEA,cAAM,IAAI;AAAA,UACR,4CAA4C,SAAS,MAAM,GACzD,WAAW,WAAM,QAAQ,KAAK,EAChC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,eAAe,KAAK;AAAA,QACpB,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,QACnB,YAAY,KAAK;AAAA,QACjB,YAAY,KAAK;AAAA,QACjB,WAAW,IAAI,KAAK,KAAK,UAAU;AAAA,MACrC;AAAA,IACF,SAAS,KAAU;AACjB,UAAI,KAAK,SAAS,cAAc;AAC9B,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AACA,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AACF;;;AD9EO,SAAS,qBAAqB,SAA0C;AAC7E,SAAO,IAAI,eAAe,OAAO;AACnC;","names":[]}