@bulutklinik/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/token-store.ts","../src/config.ts","../src/errors.ts","../src/types.ts","../src/http.ts","../src/resources/appointments.ts","../src/resources/auth.ts","../src/resources/doctors.ts","../src/resources/measures.ts","../src/resources/payments.ts","../src/resources/slots.ts","../src/client.ts"],"names":[],"mappings":";AAeO,IAAM,mBAAN,MAA6C;AAAA,EAClD,OAAA;AAAA,EACA,QAAA;AAAA,EAEA,YAAY,IAAA,EAAsE;AAChF,IAAA,IAAA,CAAK,OAAA,GAAU,MAAM,WAAA,IAAe,IAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,MAAM,YAAA,IAAgB,IAAA;AAAA,EACxC;AAAA,EAEA,cAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,SAAA,CAAU,aAAqB,YAAA,EAAmC;AAChE,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAAA,EAClB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AACF;;;ACpCO,IAAM,qBAAA,GAAqD;AAAA,EAChE,UAAA,EAAY,oCAAA;AAAA,EACZ,IAAA,EAAM,wCAAA;AAAA,EACN,KAAA,EAAO;AACT;AAoCO,SAAS,aAAA,CAAc,OAAA,GAAyB,EAAC,EAAmB;AACzE,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA,IAAW,qBAAA,CAAsB,OAAA,CAAQ,eAAe,YAAY,CAAA;AAIzF,EAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,KAAA,KACP,OAAO,UAAA,CAAW,KAAA,KAAU,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA,CAAA;AAChF,EAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAAA,IAChC,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACtB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,IAAI,gBAAA,EAAiB;AAAA,IACvD,SAAA,EAAW,QAAQ,SAAA,IAAa,GAAA;AAAA,IAChC;AAAA,GACF;AACF;;;ACzDO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AAAA,EACzB;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,gBAAA,CAAiB;AAAA,EACnD,WAAA,CAAY,SAAiB,KAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA;AAAA,EAC1B;AACF;AAGO,IAAM,QAAA,GAAN,cAAuB,gBAAA,CAAiB;AAAA,EACpC,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,SAAiB,GAAA,EAAsB;AACjD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACtB,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACtB,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,SAAA;AACrB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,IAAA;AAChB,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA;AAClB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,IAAA;AAAA,EAClB;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAC;AAExC,IAAM,mBAAA,GAAN,cAAkC,QAAA,CAAS;AAAC;AAE5C,IAAM,kBAAA,GAAN,cAAiC,QAAA,CAAS;AAAC;AAE3C,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAC;AAGtC,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EAClC,UAAA;AAAA,EAET,WAAA,CAAY,SAAiB,GAAA,EAAsB;AACjD,IAAA,KAAA,CAAM,SAAS,GAAG,CAAA;AAClB,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AAAA,EACxB;AACF;AAMO,SAAS,cAAA,CAAe,KAAsB,OAAA,EAA2B;AAC9E,EAAA,IAAI,IAAI,UAAA,KAAe,CAAA,SAAU,IAAI,mBAAA,CAAoB,SAAS,GAAG,CAAA;AAErE,EAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,SAAA,KAAc,WAAW,GAAA,CAAI,SAAA,CAAU,aAAY,GAAI,MAAA;AAC/E,EAAA,IAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,UAAA,KAAe,GAAA,EAAK;AACnD,IAAA,OAAO,IAAI,eAAA,CAAgB,OAAA,EAAS,GAAG,CAAA;AAAA,EACzC;AAEA,EAAA,QAAQ,IAAI,UAAA;AAAY,IACtB,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,mBAAA,CAAoB,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7C,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,kBAAA,CAAmB,OAAA,EAAS,GAAG,CAAA;AAAA,IAC5C,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,aAAA,CAAc,OAAA,EAAS,GAAG,CAAA;AAAA,IACvC,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,GAAG,CAAA;AAAA,IACxC;AACE,MAAA,OAAO,IAAI,QAAA,CAAS,OAAA,EAAS,GAAG,CAAA;AAAA;AAEtC;;;ACjFO,IAAM,UAAA,GAAa;AAAA,EACxB,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS;AACX;;;ACYO,IAAM,aAAN,MAAiB;AAAA,EACb,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EAEQ,OAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACT,eAAA,GAAwC,IAAA;AAAA,EAEhD,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AAAA,EAC1B;AAAA,EAEA,QAAW,IAAA,EAA+B;AACxC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,cAAA,EAAe;AAAA,EAC5B;AAAA,EAEA,MAAc,IAAA,CAAQ,IAAA,EAAmB,OAAA,EAA8B;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAEjD,IAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,UAAA,KAAe,WAAW,OAAA,EAAS;AAC7D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAEA,IAAA,MAAM,UAAU,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,eAAe,UAAA,CAAW,OAAA;AAC9E,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,OAAA,IAAW,CAAC,OAAA,EAAS;AACjD,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC7C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO,IAAA,CAAK,IAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,UAAA,KAAe,UAAA,CAAW,MAAA,EAAQ;AAC7C,MAAA,MAAM,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,IAC9B;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,SAAS,IAAA,EAAsC;AAC3D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,IAAA;AAChC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,MAAA,EAAQ,kBAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK;AAAA,KAC1B;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,KAAK,MAAA,KAAW,KAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAEvC,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,cAAA,EAAe;AACnD,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAClC,MAAA,IAAI,KAAK,YAAA,EAAc,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,YAAY,CAAA,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AACjE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,QAC/B,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA;AAAA,QACA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QAC5C,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC7B,QAAA,MAAM,IAAI,cAAA;AAAA,UACR,CAAA,QAAA,EAAW,KAAK,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,iBAAA,EAAoB,KAAK,SAAS,CAAA,EAAA,CAAA;AAAA,UACrE;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,eAAe,CAAA,iBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,IAChF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,QAAA,EAAuC;AAChE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,EAAE,cAAc,IAAA,EAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,GAAoC;AAChD,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,cAAA,EAAe,CAAE,QAAQ,MAAM;AACzD,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,eAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,eAAA,EAAgB;AAC3D,IAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,YAAA,EAAc;AACxC,MAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS;AAAA,MACnC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,EAAE,YAAA,EAAc,QAAA,EAAU,KAAK,QAAA,EAAU,eAAA,EAAiB,KAAK,YAAA;AAAa,KACnF,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACjD,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,IAAM,QAAA,CAAS,eAAe,UAAA,CAAW,OAAA,IAAW,CAAC,IAAA,EAAM,YAAA,EAAc;AACrF,MAAA,MAAM,IAAA,CAAK,WAAW,KAAA,EAAM;AAC5B,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,KAAK,YAAA,EAAc,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAAA,EACvF;AAAA,EAEQ,OAAA,CAAQ,IAAA,EAAmB,QAAA,EAAoB,QAAA,EAA8B;AACnF,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC3D,IAAA,MAAM,GAAA,GAAuB;AAAA,MAC3B,YAAY,QAAA,CAAS,MAAA;AAAA,MACrB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAA,EAAY,gBAAA,GAAmB,MAAA,CAAO,gBAAgB,CAAA,GAAI;AAAA,KAC5D;AACA,IAAA,MAAM,OAAA,GACJ,QAAA,CAAS,YAAA,IACT,CAAA,gCAAA,EAAmC,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA,CAAA;AACtF,IAAA,OAAO,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,EACpC;AACF,CAAA;;;AClLO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,iBAAiB,KAAA,EAA6C;AAC5D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAc;AAAA,MAC7B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,uCAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,eAAA,EAAiB,MAAM,eAAA,IAAmB;AAAA;AAC5C,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,YAAY,KAAA,EAAmD;AAC7D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,6BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,EAAE,QAAA,EAAU,MAAM,QAAA,EAAU,eAAA,EAAiB,MAAM,eAAA;AAAgB,KAC1E,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,OAAA,EAA4C;AACjD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,mCAAmC,OAAO,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;;;AC7BO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7B,MAAM,QAAQ,KAAA,EAA2C;AACvD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,WAAA,EAAa,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,QAAA;AAAA,QACzC,YAAA,EAAc,KAAA,CAAM,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,YAAA;AAAA,QAC9C,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,GAAI,MAAM,eAAA,KAAoB,MAAA,GAC1B,EAAE,eAAA,EAAiB,KAAA,CAAM,eAAA,EAAgB,GACzC;AAAC;AACP,KACD,CAAA;AAED,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAC3B,MAAA,OAAO,EAAE,iBAAA,EAAmB,KAAA,EAAO,cAAA,EAAgB,KAAK,eAAA,EAAgB;AAAA,IAC1E;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,EAAE,iBAAA,EAAmB,IAAA,EAAM,iBAAA,EAAmB,KAAK,QAAA,EAAS;AAAA,IACrE;AACA,IAAA,OAAO,EAAE,mBAAmB,KAAA,EAAM;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAA,EAAsC;AAC/D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,kCAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,EAAE,mBAAA,EAAqB,MAAM,mBAAA,EAAqB,QAAA,EAAU,MAAM,QAAA;AAAS,KAClF,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAM,SAAS,KAAA,EAAqC;AAClD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,yBAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,qBAAqB,KAAA,CAAM,mBAAA;AAAA,QAC3B,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,mBAAA,EAAqB,MAAM,mBAAA,IAAuB,CAAA;AAAA,QAClD,WAAA,EAAa,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,QAAA;AAAA,QACzC,YAAA,EAAc,KAAA,CAAM,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK;AAAA;AAChD,KACD,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,OAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,EAC3B;AAAA;AAAA,EAGA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,QAC/B,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,wBAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,MAAM;AAAC,OACR,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,IAAA,EAAgC;AACxD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,IAAA,CAAK,KAAK,UAAA,CAAW,SAAA,CAAU,KAAK,YAAA,EAAc,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,EACpF;AACF;;;AC5FO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA,EAE7B,QAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAkB;AAAA,MACjC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA,EAEA,SAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAoB;AAAA,MACnC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,wBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA,EAEA,YAAY,KAAA,EAAqD;AAC/D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA2B;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA;AAC9B,KACD,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,KAAA,EAAuD;AAC5D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA4B;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,0BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,KAAA,CAAM,YAAA,IAAgB,EAAC;AAAA,QACrC,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,EAAC;AAAA,QACnC,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,EAAC;AAAA,QACnC,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,YAAA,EAAc,MAAM,YAAA,IAAgB;AAAA;AACtC,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CAAO,IAAqB,SAAA,EAAoD;AAC9E,IAAA,MAAM,IAAA,GACJ,cAAc,MAAA,GACV,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GACzC,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA;AAClC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAsB,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAChF;AACF;;;ACxDO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,QAAQ,OAAA,EAA4C;AAClD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,8BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,MAAmB,MAAA,EAAyC;AAC9D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,gCAAgC,IAAI,CAAA,CAAA;AAAA,MAC1C,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,MACA,KAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,gCAAgC,IAAI,CAAA,CAAA;AAAA,MAC1C,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CAAO,MAAmB,EAAA,EAAuC;AAC/D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,gCAAgC,IAAI,CAAA,CAAA;AAAA,MAC1C,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,EAAE,EAAA;AAAG,KACZ,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,IAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiC;AAAA,MAChD,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,wBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,IAAA,CACE,IAAA,EACA,IAAA,EACA,WAAA,EACkB;AAClB,IAAA,MAAM,IAAA,GACJ,WAAA,KAAgB,MAAA,GACZ,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GACzD,CAAA,2BAAA,EAA8B,IAAI,IAAI,IAAI,CAAA,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,KAAA,CACE,IAAA,EACA,MAAA,EACA,IAAA,EACA,WAAA,EACkB;AAClB,IAAA,MAAM,OACJ,WAAA,KAAgB,MAAA,GACZ,CAAA,4BAAA,EAA+B,IAAI,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GACpE,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,IAAI,CAAA,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,yBAAyB,KAAA,EAA6C;AACpE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,2BAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,aAAa,KAAA,CAAM,WAAA,EAAa,IAAA,EAAM,KAAA,CAAM,IAAA;AAAK,KACpF,CAAA;AAAA,EACH;AACF;;;ACxFO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,kBAAkB,KAAA,EAAoD;AACpE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAwB;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,6BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,EAAE,GAAG,KAAA;AAAM,KAClB,CAAA;AAAA,EACH;AAAA,EAEA,QAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAgC;AAAA,MAC/C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,oBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA,EAEA,SAAS,IAAA,EAAkC;AACzC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,oBAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,EAAE,GAAG,IAAA;AAAK,KACjB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,EAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,4BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,eAAA,EAAiB,MAAM,eAAA,IAAmB,WAAA;AAAA,QAC1C,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,QAAA,EAAU,MAAM,QAAA,IAAY,CAAA;AAAA,QAC5B,YAAA,EAAc,MAAM,YAAA,IAAgB,EAAA;AAAA,QACpC,GAAI,MAAM,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAAI,EAAC;AAAA,QAC7D,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,QACrD,GAAI,MAAM,UAAA,GAAa,EAAE,YAAY,KAAA,CAAM,UAAA,KAAe;AAAC;AAC7D,KACD,CAAA;AAAA,EACH;AAAA,EAEA,WAAW,MAAA,EAA2C;AACpD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,wBAAwB,MAAM,CAAA,CAAA;AAAA,MACpC,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;;;ACrEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,SAAS,KAAA,EAAiD;AACxD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,2BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,QACpC,YAAA,EAAc,MAAM,YAAA,IAAgB,GAAA;AAAA,QACpC,YAAA,EAAc,MAAM,YAAA,IAAgB,GAAA;AAAA,QACpC,UAAU,KAAA,CAAM;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AACF;;;ACAO,IAAM,oBAAN,MAAwB;AAAA,EACpB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA,EAEQ,IAAA;AAAA,EAEjB,YAAY,OAAA,EAAyB;AACnC,IAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AAEzB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,EAChD;AACF","file":"index.js","sourcesContent":["import type { MaybePromise } from \"./types\";\n\n/**\n * Pluggable token persistence. The default is in-memory; provide a custom\n * implementation to persist tokens to a file, database or secure storage.\n * All methods may be synchronous or return a promise.\n */\nexport interface TokenStore {\n getAccessToken(): MaybePromise<string | null>;\n getRefreshToken(): MaybePromise<string | null>;\n setTokens(accessToken: string, refreshToken: string | null): MaybePromise<void>;\n clear(): MaybePromise<void>;\n}\n\n/** In-memory token store (default). Tokens are lost when the process exits. */\nexport class MemoryTokenStore implements TokenStore {\n #access: string | null;\n #refresh: string | null;\n\n constructor(seed?: { accessToken?: string | null; refreshToken?: string | null }) {\n this.#access = seed?.accessToken ?? null;\n this.#refresh = seed?.refreshToken ?? null;\n }\n\n getAccessToken(): string | null {\n return this.#access;\n }\n\n getRefreshToken(): string | null {\n return this.#refresh;\n }\n\n setTokens(accessToken: string, refreshToken: string | null): void {\n this.#access = accessToken;\n this.#refresh = refreshToken;\n }\n\n clear(): void {\n this.#access = null;\n this.#refresh = null;\n }\n}\n","import { MemoryTokenStore, type TokenStore } from \"./token-store\";\nimport type { Lang } from \"./types\";\n\nexport type Environment = \"production\" | \"test\" | \"local\";\n\nexport const ENVIRONMENT_BASE_URLS: Record<Environment, string> = {\n production: \"https://api.bulutklinik.com/api/v3\",\n test: \"https://apitest.bulutklinik.com/api/v3\",\n local: \"https://api-bulutklinik.test/api/v3\",\n};\n\nexport type FetchLike = typeof fetch;\n\nexport interface ClientOptions {\n /** Named environment preset. Ignored when `baseUrl` is provided. Default: `production`. */\n environment?: Environment;\n /** Explicit base URL (e.g. `https://api.bulutklinik.com/api/v3`). Overrides `environment`. */\n baseUrl?: string;\n /** Default `lang` header. Default: `tr`. */\n lang?: Lang;\n /** OAuth client id — used by `auth.connect` and for token refresh. */\n clientId?: string;\n /** OAuth client secret — used by `auth.connect` and for token refresh. */\n clientSecret?: string;\n /** Bearer token for the partner (`teusan`) endpoint. */\n partnerToken?: string;\n /** Pluggable token persistence. Default: in-memory. */\n tokenStore?: TokenStore;\n /** Per-request timeout in milliseconds. Default: 30000. */\n timeoutMs?: number;\n /** Injectable fetch implementation. Default: global `fetch`. */\n fetch?: FetchLike;\n}\n\nexport interface ResolvedConfig {\n baseUrl: string;\n lang: Lang;\n clientId?: string;\n clientSecret?: string;\n partnerToken?: string;\n tokenStore: TokenStore;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}\n\nexport function resolveConfig(options: ClientOptions = {}): ResolvedConfig {\n const base = options.baseUrl ?? ENVIRONMENT_BASE_URLS[options.environment ?? \"production\"];\n // Use the caller's fetch as-is; bind the global default to `globalThis` so it\n // works when called detached from its receiver (browsers otherwise throw\n // \"Illegal invocation\"). Node's fetch is unaffected either way.\n const fetchImpl =\n options.fetch ??\n (typeof globalThis.fetch === \"function\" ? globalThis.fetch.bind(globalThis) : undefined);\n if (typeof fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Provide options.fetch or run on Node >= 18.\",\n );\n }\n return {\n baseUrl: base.replace(/\\/+$/, \"\"),\n lang: options.lang ?? \"tr\",\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n partnerToken: options.partnerToken,\n tokenStore: options.tokenStore ?? new MemoryTokenStore(),\n timeoutMs: options.timeoutMs ?? 30_000,\n fetchImpl,\n };\n}\n","export interface ApiErrorContext {\n httpStatus: number;\n resultType?: number;\n errorType?: string | number;\n data?: unknown;\n method: string;\n path: string;\n retryAfter?: number;\n}\n\n/** Base class for every error thrown by the SDK. */\nexport class BulutklinikError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\n/** Network failure, timeout, DNS or TLS error — no HTTP response was received. */\nexport class TransportError extends BulutklinikError {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/** An HTTP response was received but the call was not successful. */\nexport class ApiError extends BulutklinikError {\n readonly httpStatus: number;\n readonly resultType: number | undefined;\n readonly errorType: string | number | undefined;\n readonly data: unknown;\n readonly method: string;\n readonly path: string;\n\n constructor(message: string, ctx: ApiErrorContext) {\n super(message);\n this.httpStatus = ctx.httpStatus;\n this.resultType = ctx.resultType;\n this.errorType = ctx.errorType;\n this.data = ctx.data;\n this.method = ctx.method;\n this.path = ctx.path;\n }\n}\n\n/** 422 / errorType=validation. */\nexport class ValidationError extends ApiError {}\n/** 401, a logout (resultType 2), or a failed token refresh. */\nexport class AuthenticationError extends ApiError {}\n/** 403 — authenticated but not permitted / out of scope. */\nexport class AuthorizationError extends ApiError {}\n/** 404. */\nexport class NotFoundError extends ApiError {}\n\n/** 429 — throttled. Carries `retryAfter` (seconds) when the header is present. */\nexport class RateLimitError extends ApiError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, ctx: ApiErrorContext) {\n super(message, ctx);\n this.retryAfter = ctx.retryAfter;\n }\n}\n\n/**\n * Map an API failure to the most specific error type.\n * Precedence: logout (resultType 2) → errorType=validation → HTTP status.\n */\nexport function createApiError(ctx: ApiErrorContext, message: string): ApiError {\n if (ctx.resultType === 2) return new AuthenticationError(message, ctx);\n\n const type = typeof ctx.errorType === \"string\" ? ctx.errorType.toLowerCase() : undefined;\n if (type === \"validation\" || ctx.httpStatus === 422) {\n return new ValidationError(message, ctx);\n }\n\n switch (ctx.httpStatus) {\n case 401:\n return new AuthenticationError(message, ctx);\n case 403:\n return new AuthorizationError(message, ctx);\n case 404:\n return new NotFoundError(message, ctx);\n case 429:\n return new RateLimitError(message, ctx);\n default:\n return new ApiError(message, ctx);\n }\n}\n","/** Supported UI/content languages for the `lang` header. */\nexport type Lang = \"tr\" | \"en\" | \"de\" | \"az\";\n\n/**\n * Envelope `resultType` state codes returned by the Bulutklinik API.\n * A call is successful only when HTTP is 2xx AND resultType === Success (0).\n */\nexport const ResultType = {\n Success: 0,\n Error: 1,\n Logout: 2,\n Update: 3,\n Refresh: 4,\n} as const;\n\nexport type ResultTypeValue = (typeof ResultType)[keyof typeof ResultType];\n\n/** The standard response envelope wrapping every API response. */\nexport interface Envelope<T = unknown> {\n resultType?: number;\n /** May be a string label or a numeric code depending on the endpoint. */\n errorType?: string | number;\n errorMessage?: string;\n successMessage?: string;\n data?: T;\n}\n\nexport type MaybePromise<T> = T | Promise<T>;\n","import type { FetchLike, ResolvedConfig } from \"./config\";\nimport {\n TransportError,\n createApiError,\n type ApiError,\n type ApiErrorContext,\n} from \"./errors\";\nimport type { TokenStore } from \"./token-store\";\nimport { ResultType, type Envelope, type Lang } from \"./types\";\n\nexport type AuthMode = \"public\" | \"bearer\" | \"partner\";\n\nexport interface RequestSpec {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n path: string;\n auth: AuthMode;\n body?: unknown;\n lang?: Lang;\n}\n\n/**\n * Low-level transport. Builds requests, unwraps the response envelope, maps\n * failures to typed errors, and performs a single silent token refresh + retry\n * on a 401 / `resultType 4`. Concurrent refreshes share one in-flight promise.\n */\nexport class HttpClient {\n readonly tokenStore: TokenStore;\n readonly clientId: string | undefined;\n readonly clientSecret: string | undefined;\n\n private readonly baseUrl: string;\n private readonly lang: Lang;\n private readonly partnerToken: string | undefined;\n private readonly timeoutMs: number;\n private readonly fetchImpl: FetchLike;\n private refreshInFlight: Promise<void> | null = null;\n\n constructor(config: ResolvedConfig) {\n this.baseUrl = config.baseUrl;\n this.lang = config.lang;\n this.clientId = config.clientId;\n this.clientSecret = config.clientSecret;\n this.partnerToken = config.partnerToken;\n this.tokenStore = config.tokenStore;\n this.timeoutMs = config.timeoutMs;\n this.fetchImpl = config.fetchImpl;\n }\n\n request<T>(spec: RequestSpec): Promise<T> {\n return this.send<T>(spec, false);\n }\n\n /** Force a token refresh using the stored refresh token. Throws on failure. */\n async refresh(): Promise<void> {\n await this.performRefresh();\n }\n\n private async send<T>(spec: RequestSpec, isRetry: boolean): Promise<T> {\n const response = await this.dispatch(spec);\n const envelope = await this.readEnvelope(response);\n\n if (response.ok && envelope.resultType === ResultType.Success) {\n return envelope.data as T;\n }\n\n const expired = response.status === 401 || envelope.resultType === ResultType.Refresh;\n if (spec.auth === \"bearer\" && expired && !isRetry) {\n const refreshed = await this.ensureRefreshed();\n if (refreshed) {\n return this.send<T>(spec, true);\n }\n }\n\n if (envelope.resultType === ResultType.Logout) {\n await this.tokenStore.clear();\n }\n\n throw this.toError(spec, response, envelope);\n }\n\n private async dispatch(spec: RequestSpec): Promise<Response> {\n const url = this.baseUrl + spec.path;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n lang: spec.lang ?? this.lang,\n };\n const hasBody = spec.body !== undefined && spec.method !== \"GET\";\n if (hasBody) headers[\"Content-Type\"] = \"application/json\";\n\n if (spec.auth === \"bearer\") {\n const token = await this.tokenStore.getAccessToken();\n if (token) headers.Authorization = `Bearer ${token}`;\n } else if (spec.auth === \"partner\") {\n if (this.partnerToken) headers.Authorization = `Bearer ${this.partnerToken}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n return await this.fetchImpl(url, {\n method: spec.method,\n headers,\n body: hasBody ? JSON.stringify(spec.body) : undefined,\n signal: controller.signal,\n });\n } catch (error) {\n if (controller.signal.aborted) {\n throw new TransportError(\n `Request ${spec.method} ${spec.path} timed out after ${this.timeoutMs}ms`,\n error,\n );\n }\n throw new TransportError(`Network error on ${spec.method} ${spec.path}`, error);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async readEnvelope(response: Response): Promise<Envelope> {\n const text = await response.text();\n if (!text) return {};\n try {\n return JSON.parse(text) as Envelope;\n } catch {\n // Non-JSON body — not expected for the covered endpoints.\n return { errorMessage: text };\n }\n }\n\n private async ensureRefreshed(): Promise<boolean> {\n if (!this.refreshInFlight) {\n this.refreshInFlight = this.performRefresh().finally(() => {\n this.refreshInFlight = null;\n });\n }\n try {\n await this.refreshInFlight;\n return true;\n } catch {\n return false;\n }\n }\n\n private async performRefresh(): Promise<void> {\n const refreshToken = await this.tokenStore.getRefreshToken();\n if (!refreshToken) throw new Error(\"No refresh token available\");\n if (!this.clientId || !this.clientSecret) {\n throw new Error(\"clientId and clientSecret are required to refresh tokens\");\n }\n\n const response = await this.dispatch({\n method: \"POST\",\n path: \"/general/refreshApi\",\n auth: \"public\",\n body: { refreshToken, clientId: this.clientId, clientSecretKey: this.clientSecret },\n });\n const envelope = await this.readEnvelope(response);\n const data = envelope.data as { access_token?: string; refresh_token?: string } | undefined;\n\n if (!response.ok || envelope.resultType !== ResultType.Success || !data?.access_token) {\n await this.tokenStore.clear();\n throw new Error(\"Token refresh failed\");\n }\n await this.tokenStore.setTokens(data.access_token, data.refresh_token ?? refreshToken);\n }\n\n private toError(spec: RequestSpec, response: Response, envelope: Envelope): ApiError {\n const retryAfterHeader = response.headers.get(\"retry-after\");\n const ctx: ApiErrorContext = {\n httpStatus: response.status,\n resultType: envelope.resultType,\n errorType: envelope.errorType,\n data: envelope.data,\n method: spec.method,\n path: spec.path,\n retryAfter: retryAfterHeader ? Number(retryAfterHeader) : undefined,\n };\n const message =\n envelope.errorMessage ??\n `Bulutklinik API request failed: ${spec.method} ${spec.path} (HTTP ${response.status})`;\n return createApiError(ctx, message);\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type { PhysicalAppointmentInput, ReserveInterviewInput } from \"../models\";\n\n/** Online reservation, physical appointment and cancellation. */\nexport class AppointmentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Reserve an online (interview) slot. Resolves to `null` on success. */\n reserveInterview(input: ReserveInterviewInput): Promise<null> {\n return this.http.request<null>({\n method: \"POST\",\n path: \"/patients/addInterviewDateReservation\",\n auth: \"bearer\",\n body: {\n doctorId: input.doctorId,\n appointmentDate: input.appointmentDate,\n appointmentType: input.appointmentType ?? \"interview\",\n },\n });\n }\n\n /** Create a physical appointment. */\n addPhysical(input: PhysicalAppointmentInput): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/patients/addNewAppointment\",\n auth: \"bearer\",\n body: { doctorId: input.doctorId, appointmentDate: input.appointmentDate },\n });\n }\n\n /** Cancel an appointment by event id (`cln_events.id`). */\n cancel(eventId: number | string): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"DELETE\",\n path: `/patients/deleteUserAppointment/${eventId}`,\n auth: \"bearer\",\n });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n ConnectInput,\n LoginData,\n LoginResult,\n RegisterInput,\n TwoFactorInput,\n} from \"../models\";\n\n/** Login, 2FA, token refresh, registration and logout. */\nexport class AuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Log in. On success tokens are stored automatically and\n * `{ twoFactorRequired: false }` is returned. If 2FA is enabled the result is\n * `{ twoFactorRequired: true, twoFactorResponse }` — pass that blob to\n * {@link connectWithTwoFactor} together with the SMS code.\n */\n async connect(input: ConnectInput): Promise<LoginResult> {\n const data = await this.http.request<LoginData>({\n method: \"POST\",\n path: \"/general/connectApi\",\n auth: \"public\",\n body: {\n apiUserName: input.apiUserName,\n apiUserPassword: input.apiUserPassword,\n apiClientId: input.clientId ?? this.http.clientId,\n apiSecretKey: input.clientSecret ?? this.http.clientSecret,\n loginMode: input.loginMode,\n ...(input.withPhoneNumber !== undefined\n ? { withPhoneNumber: input.withPhoneNumber }\n : {}),\n },\n });\n\n if (data.access_token) {\n await this.storeTokens(data);\n return { twoFactorRequired: false, passwordPolicy: data.password_policy };\n }\n if (data.response) {\n return { twoFactorRequired: true, twoFactorResponse: data.response };\n }\n return { twoFactorRequired: false };\n }\n\n /** Complete a 2FA login with the SMS code and the challenge blob. */\n async connectWithTwoFactor(input: TwoFactorInput): Promise<void> {\n const data = await this.http.request<LoginData>({\n method: \"POST\",\n path: \"/general/connectApiWithTwoFactor\",\n auth: \"public\",\n body: { smsVerificationCode: input.smsVerificationCode, response: input.response },\n });\n await this.storeTokens(data);\n }\n\n /** Register a new patient (afterRegister auto-login). Stores tokens on success. */\n async register(input: RegisterInput): Promise<void> {\n const data = await this.http.request<LoginData>({\n method: \"POST\",\n path: \"/patients/addNewPatient\",\n auth: \"public\",\n body: {\n name: input.name,\n surname: input.surname,\n apiUserName: input.apiUserName,\n phoneNumber: input.phoneNumber,\n password: input.password,\n smsVerificationCode: input.smsVerificationCode,\n response: input.response,\n acceptUserAgreement: input.acceptUserAgreement ?? 1,\n apiClientId: input.clientId ?? this.http.clientId,\n apiSecretKey: input.clientSecret ?? this.http.clientSecret,\n },\n });\n await this.storeTokens(data);\n }\n\n /** Manually refresh the access token using the stored refresh token. */\n refresh(): Promise<void> {\n return this.http.refresh();\n }\n\n /** Revoke the current tokens server-side and clear the local token store. */\n async disconnect(): Promise<void> {\n try {\n await this.http.request<unknown>({\n method: \"POST\",\n path: \"/general/disconnectApi\",\n auth: \"bearer\",\n body: {},\n });\n } finally {\n await this.http.tokenStore.clear();\n }\n }\n\n private async storeTokens(data: LoginData): Promise<void> {\n if (!data.access_token) {\n throw new Error(\"Login response did not contain an access token\");\n }\n await this.http.tokenStore.setTokens(data.access_token, data.refresh_token ?? null);\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n Branch,\n DoctorDetail,\n DoctorSearchInput,\n DoctorSearchResult,\n Location,\n QuickSearchInput,\n QuickSearchResult,\n} from \"../models\";\n\n/** Branches, locations, quick/filtered doctor search and doctor detail. */\nexport class DoctorsResource {\n constructor(private readonly http: HttpClient) {}\n\n branches(): Promise<Branch[]> {\n return this.http.request<Branch[]>({\n method: \"GET\",\n path: \"/patients/allBranches\",\n auth: \"bearer\",\n });\n }\n\n locations(): Promise<Location[]> {\n return this.http.request<Location[]>({\n method: \"GET\",\n path: \"/patients/allLocations\",\n auth: \"bearer\",\n });\n }\n\n quickSearch(input: QuickSearchInput): Promise<QuickSearchResult> {\n return this.http.request<QuickSearchResult>({\n method: \"POST\",\n path: \"/patients/quickSearch\",\n auth: \"bearer\",\n body: {\n searchText: input.searchText,\n listType: input.listType ?? null,\n location: input.location ?? null,\n },\n });\n }\n\n search(input: DoctorSearchInput): Promise<DoctorSearchResult> {\n return this.http.request<DoctorSearchResult>({\n method: \"POST\",\n path: \"/patients/filteredSearch\",\n auth: \"bearer\",\n body: {\n searchParams: input.searchParams ?? {},\n orderParams: input.orderParams ?? [],\n otherParams: input.otherParams ?? [],\n currentPage: input.currentPage,\n perPageLimit: input.perPageLimit ?? 20,\n },\n });\n }\n\n detail(id: number | string, corporate?: number | string): Promise<DoctorDetail> {\n const path =\n corporate !== undefined\n ? `/patients/doctorDetail/${id}/${corporate}`\n : `/patients/doctorDetail/${id}`;\n return this.http.request<DoctorDetail>({ method: \"GET\", path, auth: \"bearer\" });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n GraphPeriod,\n MeasureFields,\n MeasureRecord,\n MeasureType,\n PartnerHealthInput,\n} from \"../models\";\n\n/** Health measurements: CRUD, latest, history list, graph and partner submission. */\nexport class MeasuresResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Submit multiple measurements of any types in one call (primary entrypoint). */\n addList(records: MeasureRecord[]): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/patients/addNewUserMeasures\",\n auth: \"bearer\",\n body: { data: records },\n });\n }\n\n /** Submit a single measurement of one type. */\n add(type: MeasureType, fields: MeasureFields): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: `/patients/addNewUserMeasures/${type}`,\n auth: \"bearer\",\n body: fields,\n });\n }\n\n update(\n type: MeasureType,\n input: { id: number | string } & MeasureFields,\n ): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"PUT\",\n path: `/patients/updateUserMeasures/${type}`,\n auth: \"bearer\",\n body: input,\n });\n }\n\n delete(type: MeasureType, id: number | string): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"DELETE\",\n path: `/patients/deleteUserMeasures/${type}`,\n auth: \"bearer\",\n body: { id },\n });\n }\n\n /** Latest value of each measurement type. */\n last(): Promise<Record<string, unknown>> {\n return this.http.request<Record<string, unknown>>({\n method: \"GET\",\n path: \"/patients/measuresList\",\n auth: \"bearer\",\n });\n }\n\n /** Paginated history for one type. `glucoseType` (0/1) applies only to glucose. */\n list(\n type: MeasureType,\n page: number | string,\n glucoseType?: 0 | 1,\n ): Promise<unknown> {\n const path =\n glucoseType !== undefined\n ? `/patients/userMeasuresList/${type}/${page}/${glucoseType}`\n : `/patients/userMeasuresList/${type}/${page}`;\n return this.http.request<unknown>({ method: \"GET\", path, auth: \"bearer\" });\n }\n\n /** Grouped graph data. `period`: 1=day, 2=week, 3=month, 4=year. */\n graph(\n type: MeasureType,\n period: GraphPeriod,\n page: number | string,\n glucoseType?: 0 | 1,\n ): Promise<unknown> {\n const path =\n glucoseType !== undefined\n ? `/patients/userMeasuresGraph/${type}/${period}/${page}/${glucoseType}`\n : `/patients/userMeasuresGraph/${type}/${period}/${page}`;\n return this.http.request<unknown>({ method: \"GET\", path, auth: \"bearer\" });\n }\n\n /** Partner (teusan) submission — uses the configured partner token. */\n partnerHealthInformation(input: PartnerHealthInput): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/outher/healthInformation\",\n auth: \"partner\",\n body: { identity: input.identity, phoneNumber: input.phoneNumber, data: input.data },\n });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n CardInfo,\n DiscountCheckInput,\n DiscountResult,\n PaymentInput,\n PaymentResult,\n SavedCard,\n} from \"../models\";\n\n/** Discount check, saved cards and the 3DS payment entrypoint. */\nexport class PaymentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Validate a discount code. Note: this endpoint lives under the `patients` prefix. */\n checkDiscountCode(input: DiscountCheckInput): Promise<DiscountResult> {\n return this.http.request<DiscountResult>({\n method: \"POST\",\n path: \"/patients/checkDiscountCode\",\n auth: \"bearer\",\n body: { ...input },\n });\n }\n\n getCards(): Promise<{ cards: SavedCard[] }> {\n return this.http.request<{ cards: SavedCard[] }>({\n method: \"GET\",\n path: \"/payments/getCards\",\n auth: \"bearer\",\n });\n }\n\n saveCard(card: CardInfo): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/payments/saveCard\",\n auth: \"bearer\",\n body: { ...card },\n });\n }\n\n /**\n * Start an appointment payment. The amount is computed server-side. On a 3DS\n * flow the result carries `payment3DUrl` — a browser URL to open; the SDK does\n * not follow it. 3DS capture happens via the bank → server callback.\n */\n pay(input: PaymentInput): Promise<PaymentResult> {\n return this.http.request<PaymentResult>({\n method: \"POST\",\n path: \"/payments/interviewPayment\",\n auth: \"bearer\",\n body: {\n doctorId: input.doctorId,\n appointmentDate: input.appointmentDate,\n appointmentType: input.appointmentType ?? \"interview\",\n is3D: input.is3D,\n termsAccept: input.termsAccept,\n saveCard: input.saveCard ?? 0,\n discountCode: input.discountCode ?? \"\",\n ...(input.cardId !== undefined ? { cardId: input.cardId } : {}),\n ...(input.cardInfo ? { cardInfo: input.cardInfo } : {}),\n ...(input.caseDetail ? { caseDetail: input.caseDetail } : {}),\n },\n });\n }\n\n deleteCard(cardId: number | string): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"DELETE\",\n path: `/payments/deleteCard/${cardId}`,\n auth: \"bearer\",\n });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type { SchedulerInput, SchedulerResult } from \"../models\";\n\n/** Doctor availability (materialized slots). */\nexport class SlotsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Fetch a doctor's free slots. Returns a date-keyed map of slots. Build the\n * next step's `appointmentDate` as `\"<date> <slotStart>\"` (drop the seconds).\n */\n schedule(input: SchedulerInput): Promise<SchedulerResult> {\n return this.http.request<SchedulerResult>({\n method: \"POST\",\n path: \"/patients/doctorScheduler\",\n auth: \"bearer\",\n body: {\n doctorId: input.doctorId,\n scheduleDate: input.scheduleDate ?? null,\n scheduleStep: input.scheduleStep ?? \"7\",\n schedulePage: input.schedulePage ?? \"1\",\n listType: input.listType,\n },\n });\n }\n}\n","import { resolveConfig, type ClientOptions } from \"./config\";\nimport { HttpClient } from \"./http\";\nimport { AppointmentsResource } from \"./resources/appointments\";\nimport { AuthResource } from \"./resources/auth\";\nimport { DoctorsResource } from \"./resources/doctors\";\nimport { MeasuresResource } from \"./resources/measures\";\nimport { PaymentsResource } from \"./resources/payments\";\nimport { SlotsResource } from \"./resources/slots\";\nimport type { TokenStore } from \"./token-store\";\n\n/**\n * The Bulutklinik API client. Construct once and reuse; service groups are\n * exposed as properties.\n *\n * @example\n * ```ts\n * const client = new BulutklinikClient({\n * environment: \"test\",\n * clientId: \"…\",\n * clientSecret: \"…\",\n * });\n * await client.auth.connect({ apiUserName: \"…\", apiUserPassword: \"…\", loginMode: \"email\" });\n * const result = await client.doctors.quickSearch({ searchText: \"kardiyo\" });\n * ```\n */\nexport class BulutklinikClient {\n readonly auth: AuthResource;\n readonly doctors: DoctorsResource;\n readonly slots: SlotsResource;\n readonly appointments: AppointmentsResource;\n readonly payments: PaymentsResource;\n readonly measures: MeasuresResource;\n /** The active token store (also accepts a custom one via options). */\n readonly tokenStore: TokenStore;\n\n private readonly http: HttpClient;\n\n constructor(options?: ClientOptions) {\n const config = resolveConfig(options);\n this.http = new HttpClient(config);\n this.tokenStore = config.tokenStore;\n\n this.auth = new AuthResource(this.http);\n this.doctors = new DoctorsResource(this.http);\n this.slots = new SlotsResource(this.http);\n this.appointments = new AppointmentsResource(this.http);\n this.payments = new PaymentsResource(this.http);\n this.measures = new MeasuresResource(this.http);\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@bulutklinik/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Official Bulutklinik API SDK for JavaScript / TypeScript",
5
+ "license": "MIT",
6
+ "author": "Bulutklinik",
7
+ "homepage": "https://github.com/bulutklinik/js-sdk#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/bulutklinik/js-sdk.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/bulutklinik/js-sdk/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "import": {
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/index.d.cts",
27
+ "default": "./dist/index.cjs"
28
+ }
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "DESIGN.md",
35
+ "LICENSE"
36
+ ],
37
+ "engines": {
38
+ "node": ">=18"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "sideEffects": false,
44
+ "scripts": {
45
+ "build": "tsup",
46
+ "typecheck": "tsc --noEmit",
47
+ "lint": "eslint .",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "check:pkg": "publint && attw --pack .",
51
+ "prepublishOnly": "npm run build"
52
+ },
53
+ "keywords": [
54
+ "bulutklinik",
55
+ "sdk",
56
+ "api",
57
+ "telemedicine",
58
+ "health",
59
+ "appointments",
60
+ "hbys"
61
+ ],
62
+ "devDependencies": {
63
+ "@arethetypeswrong/cli": "^0.18.3",
64
+ "@types/node": "^22.7.0",
65
+ "eslint": "^9.13.0",
66
+ "publint": "^0.3.21",
67
+ "tsup": "^8.3.0",
68
+ "typescript": "^5.6.0",
69
+ "typescript-eslint": "^8.10.0",
70
+ "vitest": "^2.1.0"
71
+ }
72
+ }