@scell/sdk 1.0.0 → 1.2.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/retry.ts","../src/resources/api-keys.ts","../src/resources/auth.ts","../src/resources/balance.ts","../src/resources/companies.ts","../src/resources/invoices.ts","../src/resources/signatures.ts","../src/resources/webhooks.ts","../src/utils/webhook-verify.ts","../src/index.ts"],"names":["ScellAuthenticationError","ScellAuthorizationError","ScellError","ScellInsufficientBalanceError","ScellNetworkError","ScellNotFoundError","ScellRateLimitError","ScellServerError","ScellTimeoutError","ScellValidationError","parseApiError","crypto"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,wBAAA,EAAA,MAAAA,gCAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,+BAAA;AAAA,EAAA,UAAA,EAAA,MAAAC,kBAAA;AAAA,EAAA,6BAAA,EAAA,MAAAC,qCAAA;AAAA,EAAA,iBAAA,EAAA,MAAAC,yBAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,0BAAA;AAAA,EAAA,mBAAA,EAAA,MAAAC,2BAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,wBAAA;AAAA,EAAA,iBAAA,EAAA,MAAAC,yBAAA;AAAA,EAAA,oBAAA,EAAA,MAAAC,4BAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA4NO,SAAS,aAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACO;AACP,EAAA,MAAM,SAAA,GAAY,IAAA;AAClB,EAAA,MAAM,OAAA,GAAU,WAAW,OAAA,IAAW,eAAA;AACtC,EAAA,MAAM,MAAA,GAAS,SAAA,EAAW,MAAA,IAAU,EAAC;AACrC,EAAA,MAAM,OAAO,SAAA,EAAW,IAAA;AAExB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,GAAA;AACH,MAAA,MAAM,IAAIT,gCAAA,CAAyB,OAAA,EAAS,IAAI,CAAA;AAAA,IAClD,KAAK,GAAA;AACH,MAAA,MAAM,IAAIG,qCAAA,CAA8B,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD,KAAK,GAAA;AACH,MAAA,MAAM,IAAIF,+BAAA,CAAwB,OAAA,EAAS,IAAI,CAAA;AAAA,IACjD,KAAK,GAAA;AACH,MAAA,MAAM,IAAII,0BAAA,CAAmB,OAAA,EAAS,IAAI,CAAA;AAAA,IAC5C,KAAK,GAAA;AACH,MAAA,MAAM,IAAII,4BAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,IACtD,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,GAAA,CAAI,aAAa,CAAA;AAC7C,MAAA,MAAM,IAAIH,2BAAA;AAAA,QACR,OAAA;AAAA,QACA,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA;AAAA,QACxC;AAAA,OACF;AAAA,IACF;AAAA,IACA;AACE,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,MAAM,IAAIC,wBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,IAAIL,kBAAA,CAAW,OAAA,EAAS,MAAA,EAAQ,MAAM,IAAI,CAAA;AAAA;AAEtD;AApPaA,2BAAA,CAAA,CAyCAF,2CAqBAC,wCAAA,CAAA,CAqBAQ,qCAAA,CAAA,CAmDAH,sCAkBAD,mCAAA,CAAA,CAUAE,iCAAA,CAAA,CAcAJ,gDAUAC,kCAAA,CAAA,CAaAI;AAlNb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,eAAA,GAAA;AAWO,IAAMN,kBAAA,GAAN,cAAyB,KAAA,CAAM;AAAA;AAAA,MAEpB,MAAA;AAAA;AAAA,MAEA,IAAA;AAAA;AAAA,MAEA,IAAA;AAAA,MAEhB,WAAA,CACE,OAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,EACA;AACA,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAGZ,QAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,UAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,QAChD;AAAA,MACF;AAAA,KACF;AAgBO,IAAMF,gCAAA,GAAN,cAAuCE,kBAAA,CAAW;AAAA,MACvD,WAAA,CAAY,OAAA,GAAU,uBAAA,EAAyB,IAAA,EAAgB;AAC7D,QAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,sBAAA,EAAwB,IAAI,CAAA;AAChD,QAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,MACd;AAAA,KACF;AAgBO,IAAMD,+BAAA,GAAN,cAAsCC,kBAAA,CAAW;AAAA,MACtD,WAAA,CAAY,OAAA,GAAU,eAAA,EAAiB,IAAA,EAAgB;AACrD,QAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,qBAAA,EAAuB,IAAI,CAAA;AAC/C,QAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,MACd;AAAA,KACF;AAgBO,IAAMO,4BAAA,GAAN,cAAmCP,kBAAA,CAAW;AAAA;AAAA,MAEnC,MAAA;AAAA,MAEhB,WAAA,CACE,OAAA,EACA,MAAA,GAAmC,IACnC,IAAA,EACA;AACA,QAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,kBAAA,EAAoB,IAAI,CAAA;AAC5C,QAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,GAA2B;AACzB,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,KAAA,EAAyB;AACtC,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,IAAK,EAAC;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,KAAA,EAAwB;AACpC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACrC,QAAA,OAAO,WAAA,KAAgB,MAAA,IAAa,WAAA,CAAY,MAAA,GAAS,CAAA;AAAA,MAC3D;AAAA,KACF;AAgBO,IAAMI,2BAAA,GAAN,cAAkCJ,kBAAA,CAAW;AAAA;AAAA,MAElC,UAAA;AAAA,MAEhB,WAAA,CACE,OAAA,GAAU,qBAAA,EACV,UAAA,EACA,IAAA,EACA;AACA,QAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,qBAAA,EAAuB,IAAI,CAAA;AAC/C,QAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,MACpB;AAAA,KACF;AAKO,IAAMG,0BAAA,GAAN,cAAiCH,kBAAA,CAAW;AAAA,MACjD,WAAA,CAAY,OAAA,GAAU,oBAAA,EAAsB,IAAA,EAAgB;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,IAAI,CAAA;AACrC,QAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,MACd;AAAA,KACF;AAKO,IAAMK,wBAAA,GAAN,cAA+BL,kBAAA,CAAW;AAAA,MAC/C,WAAA,CACE,OAAA,GAAU,uBAAA,EACV,MAAA,GAAS,KACT,IAAA,EACA;AACA,QAAA,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,IAAI,CAAA;AAC3C,QAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,MACd;AAAA,KACF;AAKO,IAAMC,qCAAA,GAAN,cAA4CD,kBAAA,CAAW;AAAA,MAC5D,WAAA,CAAY,OAAA,GAAU,sBAAA,EAAwB,IAAA,EAAgB;AAC5D,QAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,sBAAA,EAAwB,IAAI,CAAA;AAChD,QAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AAAA,MACd;AAAA,KACF;AAKO,IAAME,yBAAA,GAAN,cAAgCF,kBAAA,CAAW;AAAA,MAChC,aAAA;AAAA,MAEhB,WAAA,CAAY,SAAiB,aAAA,EAAsB;AACjD,QAAA,KAAA,CAAM,OAAA,EAAS,GAAG,eAAe,CAAA;AACjC,QAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,QAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,MACvB;AAAA,KACF;AAKO,IAAMM,yBAAA,GAAN,cAAgCN,kBAAA,CAAW;AAAA,MAChD,WAAA,CAAY,UAAU,mBAAA,EAAqB;AACzC,QAAA,KAAA,CAAM,OAAA,EAAS,GAAG,SAAS,CAAA;AAC3B,QAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,MACd;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjNA,WAAA,EAAA;;;ACAA,WAAA,EAAA;AAqBA,IAAM,qBAAA,GAAqE;AAAA,EACzE,UAAA,EAAY,CAAA;AAAA,EACZ,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU,GAAA;AAAA,EACV,YAAA,EAAc;AAChB,CAAA;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,IAAI,iBAAiBI,2BAAA,EAAqB;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,iBAAiBC,wBAAA,EAAkB;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,mBAAA,EAAqB;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,cAAA,CACd,OAAA,EACA,SAAA,EACA,QAAA,EACA,cACA,UAAA,EACQ;AAER,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,GAAa,CAAA,EAAG;AAC9C,IAAA,OAAO,UAAA,GAAa,GAAA;AAAA,EACtB;AAGA,EAAA,MAAM,gBAAA,GAAmB,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAGxD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,QAAQ,CAAA;AAGvD,EAAA,MAAM,SAAS,WAAA,GAAc,YAAA,IAAgB,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AAEjE,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,MAAM,CAAA;AACxC;AAKA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAiBA,eAAsB,SAAA,CACpB,EAAA,EACA,OAAA,GAAwB,EAAC,EACb;AACZ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,qBAAA,CAAsB,UAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,qBAAA,CAAsB,SAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,qBAAA,CAAsB,QAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,qBAAA,CAAsB,YAAA;AACnE,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,gBAAA;AAE3C,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,OAAA,IAAW,UAAA,IAAc,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AAChD,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,UAAA,GACJ,KAAA,YAAiBD,2BAAA,GAAsB,KAAA,CAAM,UAAA,GAAa,MAAA;AAG5D,MAAA,MAAM,KAAA,GAAQ,cAAA;AAAA,QACZ,OAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,MAAM,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA;AACR;AAWO,SAAS,kBAAA,CACd,cAAA,GAA+B,EAAC,EACiC;AACjE,EAAA,OAAO,CAAI,EAAA,EAAsB,OAAA,GAAwB,EAAC,KACxD,SAAA,CAAU,EAAA,EAAI,EAAE,GAAG,cAAA,EAAgB,GAAG,OAAA,EAAS,CAAA;AACnD;;;ADzGO,IAAM,aAAN,MAAiB;AAAA,EACL,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CACE,QAAA,EACA,SAAA,EACA,MAAA,GAAuB,EAAC,EACxB;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,6BAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,KAAA,IAAS,EAAC;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,IAAA;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,KAAA,IAAS,KAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CACN,MACA,KAAA,EACQ;AACR,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,KAAK,OAAO,CAAA;AAEtC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,aACN,iBAAA,EACwB;AACxB,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IACrD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,WAAW,IAAI,IAAA,CAAK,SAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAkB,MAAA,EAA2C;AACzE,IAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,OAAA,EAAS,OAAA,EAAS,QAAO,GAAI,MAAA;AAEhE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACrC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAChD,IAAA,MAAM,cAAA,GAAiB,WAAW,IAAA,CAAK,OAAA;AAGvC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,cAAc,CAAA;AAGrE,IAAA,MAAM,iBAAiB,MAAA,GACnB,IAAI,eAAA,EAAgB,CAAE,SACtB,UAAA,CAAW,MAAA;AAEf,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,OAAO,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAA4B;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,QAAA,YAAA,CAAa,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,YAAY,CAAA;AAErD,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,MAAA,IAAI,YAAA;AAEJ,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,aAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,YAAA,EAAc,QAAA,CAAS,OAAO,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAE1B,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,UAAA,MAAM,IAAIE,yBAAA;AAAA,YACR,2BAA2B,cAAc,CAAA,EAAA;AAAA,WAC3C;AAAA,QACF;AAGA,QAAA,IACE,MAAM,IAAA,KAAS,WAAA,IACf,MAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAC9B;AACA,UAAA,MAAM,IAAIJ,yBAAA,CAAkB,wBAAA,EAA0B,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAW,MAAA,EAA2C;AAClE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,IAAe,CAAC,MAAA,CAAO,SAAA;AAEhD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,SAAA;AAAA,QACL,MAAM,IAAA,CAAK,cAAA,CAAkB,MAAM,CAAA;AAAA,QACnC,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,eAAkB,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,IAAA,EACA,KAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,MAAA,GAAgC;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA;AAAA,MACA,GAAG;AAAA,KACL;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAAA,IACjB;AACA,IAAA,OAAO,IAAA,CAAK,QAAW,MAAM,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAU,IAAA,EAAc,OAAA,EAAsC;AAClE,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF,CAAA;;;AEtQO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBhD,MAAM,KAAK,cAAA,EAA8D;AACvE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,WAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,GAAA,CACJ,EAAA,EACA,cAAA,EACiC;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAa,EAAE,CAAA,CAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EACoD;AACpD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,MAAA,CACJ,EAAA,EACA,cAAA,EAC0B;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAwB,CAAA,UAAA,EAAa,EAAE,IAAI,cAAc,CAAA;AAAA,EAC5E;AACF,CAAA;;;ACtGO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAchD,MAAM,GAAG,cAAA,EAAgE;AACvE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAO,cAAA,EAA2D;AACtE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,cAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AA2BO,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAA,EAAS,6BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBT,MAAM,QAAA,CACJ,KAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,OAAO,CAAA,cAAA,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,EAAE,aAAA,EAAAM,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAChC,MAAAA,cAAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,KAAA,CACJ,WAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,OAAO,CAAA,WAAA,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACjC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,EAAE,aAAA,EAAAA,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAChC,MAAAA,cAAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,cAAA,CACJ,KAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,OAAO,CAAA,qBAAA,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,EAAE,aAAA,EAAAA,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAChC,MAAAA,cAAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,aAAA,CACJ,KAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,OAAO,CAAA,oBAAA,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,EAAE,aAAA,EAAAA,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAChC,MAAAA,cAAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACrPO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBhD,MAAM,IAAI,cAAA,EAAmE;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EACgC;AAChC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,iBAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,cAAA,CACJ,KAAA,EACA,cAAA,EACoD;AACpD,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,mBAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,YAAA,CACJ,OAAA,GAAkC,IAClC,cAAA,EACyC;AACzC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,uBAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;ACrHO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAchD,MAAM,KACJ,cAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,YAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,GAAA,CACJ,EAAA,EACA,cAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,cAAc,EAAE,CAAA,CAAA;AAAA,MAChB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EAC2C;AAC3C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,YAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,MAAA,CACJ,EAAA,EACA,KAAA,EACA,cAAA,EAC2C;AAC3C,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,cAAc,EAAE,CAAA,CAAA;AAAA,MAChB,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAA,CACJ,EAAA,EACA,cAAA,EAC0B;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,cAAc,EAAE,CAAA,CAAA;AAAA,MAChB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,WAAA,CACJ,EAAA,EACA,cAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,cAAc,EAAE,CAAA,IAAA,CAAA;AAAA,MAChB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,SAAA,CACJ,EAAA,EACA,cAAA,EAC4B;AAC5B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,cAAc,EAAE,CAAA,WAAA,CAAA;AAAA,MAChB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;ACjLO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBhD,MAAM,IAAA,CACJ,OAAA,GAA8B,IAC9B,cAAA,EACqC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,WAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,GAAA,CACJ,EAAA,EACA,cAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAa,EAAE,CAAA,CAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkDA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EAC2C;AAC3C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,QAAA,CACJ,EAAA,EACA,IAAA,EACA,cAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,UAAA,EAAa,EAAE,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA;AAAA,MAChC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,UAAA,CACJ,EAAA,EACA,cAAA,EAC6B;AAC7B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAa,EAAE,CAAA,YAAA,CAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAA,CACJ,KAAA,EACA,cAAA,EACyE;AACzE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAId,mBAAA,EAAqB,OAAO,cAAc,CAAA;AAAA,EAC/C;AACF,CAAA;;;ACzMO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBhD,MAAM,IAAA,CACJ,OAAA,GAAgC,IAChC,cAAA,EACuC;AACvC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,GAAA,CACJ,EAAA,EACA,cAAA,EACoC;AACpC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,eAAe,EAAE,CAAA,CAAA;AAAA,MACjB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmDA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,aAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAM,QAAA,CACJ,EAAA,EACA,IAAA,EACA,cAAA,EACoC;AACpC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,EAAE,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA;AAAA,MAClC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,MAAA,CACJ,EAAA,EACA,cAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,eAAe,EAAE,CAAA,OAAA,CAAA;AAAA,MACjB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,MAAA,CACJ,EAAA,EACA,cAAA,EAC0B;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,eAAe,EAAE,CAAA,OAAA,CAAA;AAAA,MACjB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;AC1MO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBhD,MAAM,IAAA,CACJ,OAAA,GAA8B,IAC9B,cAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,WAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EACqD;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,MAAA,CACJ,EAAA,EACA,KAAA,EACA,cAAA,EAC2C;AAC3C,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAa,EAAE,CAAA,CAAA;AAAA,MACf,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAA,CACJ,EAAA,EACA,cAAA,EAC0B;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAwB,CAAA,UAAA,EAAa,EAAE,IAAI,cAAc,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,gBAAA,CACJ,EAAA,EACA,cAAA,EACqD;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,aAAa,EAAE,CAAA,kBAAA,CAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,IAAA,CACJ,EAAA,EACA,cAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,aAAa,EAAE,CAAA,KAAA,CAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,IAAA,CACJ,EAAA,EACA,OAAA,GAAiC,IACjC,cAAA,EACwC;AACxC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAa,EAAE,CAAA,KAAA,CAAA;AAAA,MACf,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;AC3OA,SAAS,qBAAqB,MAAA,EAGrB;AACP,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,IAAA,IAAI,eAAe,EAAA,EAAI;AAEvB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,UAAU,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,UAAA,GAAa,CAAC,CAAA;AAE3C,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,SAAA,GAAY,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,MAAA,EAAW;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAChC;AAUA,eAAe,gBAAA,CACb,OAAA,EACA,SAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAG7C,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AAEhD,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IACpC,KAAA;AAAA,IACA,OAAA;AAAA,IACA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,KAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA;AAAA,IAC1C,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,UAAA,CAAW,eAAe,CAAC,CAAA,CAC9C,IAAI,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ;AAKA,SAAS,aAAA,CAAc,GAAW,CAAA,EAAoB;AACpD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAA,IAAU,EAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,MAAA,KAAW,CAAA;AACpB;AA8BO,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmB3B,MAAM,eAAA,CACJ,OAAA,EACA,WACA,MAAA,EACA,OAAA,GAAkC,EAAC,EACjB;AAClB,IAAA,MAAM,EAAE,SAAA,GAAY,GAAA,EAAI,GAAI,OAAA;AAG5B,IAAA,MAAM,MAAA,GAAS,qBAAqB,SAAS,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,iBAAA,EAAkB,GAAI,MAAA;AAGpD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,SAAS,IAAI,SAAA,EAAW;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,iBAAA,GAAoB,MAAM,gBAAA,CAAiB,OAAA,EAAS,WAAW,MAAM,CAAA;AAG3E,IAAA,OAAO,aAAA,CAAc,mBAAmB,iBAAiB,CAAA;AAAA,EAC3D,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,oBACE,OAAA,EACA,SAAA,EACA,MAAA,EACA,OAAA,GAAkC,EAAC,EAC1B;AACT,IAAA,MAAM,EAAE,SAAA,GAAY,GAAA,EAAI,GAAI,OAAA;AAG5B,IAAA,MAAM,MAAA,GAAS,qBAAqB,SAAS,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,iBAAA,EAAkB,GAAI,MAAA;AAGpD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,SAAS,IAAI,SAAA,EAAW;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AAIA,IAAA,MAAMC,OAAAA,GAAS,UAAQ,QAAQ,CAAA;AAC/B,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC7C,IAAA,MAAM,iBAAA,GAAoBA,OAAAA,CACvB,UAAA,CAAW,QAAA,EAAU,MAAM,EAC3B,MAAA,CAAO,aAAa,CAAA,CACpB,MAAA,CAAO,KAAK,CAAA;AAGf,IAAA,IAAI;AACF,MAAA,OAAOA,OAAAA,CAAO,eAAA;AAAA,QACZ,MAAA,CAAO,KAAK,iBAAiB,CAAA;AAAA,QAC7B,MAAA,CAAO,KAAK,iBAAiB;AAAA,OAC/B;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,aAA0B,OAAA,EAAoC;AAC5D,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAA,CACJ,KAAA,EACA,IAAA,EACA,MAAA,EAIC;AACD,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC9C,IAAA,MAAM,cAAA,GAAoC;AAAA,MACxC,KAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC;AAAA,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,OAAA,EAAS,WAAW,MAAM,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB,CAAA,EAAA,EAAK,SAAS,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA;AAAA,QACnD,eAAA,EAAiB,KAAA;AAAA,QACjB,kBAAA,EAAoB,OAAO,UAAA,EAAW;AAAA,QACtC,cAAA,EAAgB;AAAA;AAClB,KACF;AAAA,EACF;AACF;;;AC7GA,WAAA,EAAA;AArHO,IAAM,cAAN,MAAkB;AAAA,EACN,IAAA;AAAA;AAAA,EAGD,IAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBhB,WAAA,CAAY,KAAA,EAAe,MAAA,GAAuB,EAAC,EAAG;AACpD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,QAAA,EAAU,OAAO,MAAM,CAAA;AAElD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC5C,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;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAAA,EACpD;AACF;AA+BO,IAAM,iBAAN,MAAqB;AAAA,EACT,IAAA;AAAA;AAAA,EAGD,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBhB,WAAA,CAAY,MAAA,EAAgB,MAAA,GAAuB,EAAC,EAAG;AACrD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,SAAA,EAAW,QAAQ,MAAM,CAAA;AAEpD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAAA,EACpD;AACF","file":"index.js","sourcesContent":["/**\n * Scell SDK Error Classes\n *\n * @packageDocumentation\n */\n\nimport type { ApiErrorResponse } from './types/common.js';\n\n/**\n * Base error class for all Scell API errors\n */\nexport class ScellError extends Error {\n /** HTTP status code */\n public readonly status: number;\n /** Error code from API */\n public readonly code: string | undefined;\n /** Original response body */\n public readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n code?: string,\n body?: unknown\n ) {\n super(message);\n this.name = 'ScellError';\n this.status = status;\n this.code = code;\n this.body = body;\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n *\n * @example\n * ```typescript\n * try {\n * await client.invoices.list();\n * } catch (error) {\n * if (error instanceof ScellAuthenticationError) {\n * console.log('Invalid or expired token');\n * }\n * }\n * ```\n */\nexport class ScellAuthenticationError extends ScellError {\n constructor(message = 'Authentication failed', body?: unknown) {\n super(message, 401, 'AUTHENTICATION_ERROR', body);\n this.name = 'ScellAuthenticationError';\n }\n}\n\n/**\n * Error thrown when authorization fails (403)\n *\n * @example\n * ```typescript\n * try {\n * await client.admin.users();\n * } catch (error) {\n * if (error instanceof ScellAuthorizationError) {\n * console.log('Insufficient permissions');\n * }\n * }\n * ```\n */\nexport class ScellAuthorizationError extends ScellError {\n constructor(message = 'Access denied', body?: unknown) {\n super(message, 403, 'AUTHORIZATION_ERROR', body);\n this.name = 'ScellAuthorizationError';\n }\n}\n\n/**\n * Error thrown when validation fails (422)\n *\n * @example\n * ```typescript\n * try {\n * await client.invoices.create(invalidData);\n * } catch (error) {\n * if (error instanceof ScellValidationError) {\n * console.log('Validation errors:', error.errors);\n * }\n * }\n * ```\n */\nexport class ScellValidationError extends ScellError {\n /** Field-level validation errors */\n public readonly errors: Record<string, string[]>;\n\n constructor(\n message: string,\n errors: Record<string, string[]> = {},\n body?: unknown\n ) {\n super(message, 422, 'VALIDATION_ERROR', body);\n this.name = 'ScellValidationError';\n this.errors = errors;\n }\n\n /**\n * Get all error messages as a flat array\n */\n getAllMessages(): string[] {\n return Object.values(this.errors).flat();\n }\n\n /**\n * Get error messages for a specific field\n */\n getFieldErrors(field: string): string[] {\n return this.errors[field] ?? [];\n }\n\n /**\n * Check if a specific field has errors\n */\n hasFieldError(field: string): boolean {\n const fieldErrors = this.errors[field];\n return fieldErrors !== undefined && fieldErrors.length > 0;\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n *\n * @example\n * ```typescript\n * try {\n * await client.invoices.create(data);\n * } catch (error) {\n * if (error instanceof ScellRateLimitError) {\n * console.log(`Retry after ${error.retryAfter} seconds`);\n * }\n * }\n * ```\n */\nexport class ScellRateLimitError extends ScellError {\n /** Seconds to wait before retrying */\n public readonly retryAfter: number | undefined;\n\n constructor(\n message = 'Rate limit exceeded',\n retryAfter?: number,\n body?: unknown\n ) {\n super(message, 429, 'RATE_LIMIT_EXCEEDED', body);\n this.name = 'ScellRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error thrown when a resource is not found (404)\n */\nexport class ScellNotFoundError extends ScellError {\n constructor(message = 'Resource not found', body?: unknown) {\n super(message, 404, 'NOT_FOUND', body);\n this.name = 'ScellNotFoundError';\n }\n}\n\n/**\n * Error thrown when the API returns a server error (5xx)\n */\nexport class ScellServerError extends ScellError {\n constructor(\n message = 'Internal server error',\n status = 500,\n body?: unknown\n ) {\n super(message, status, 'SERVER_ERROR', body);\n this.name = 'ScellServerError';\n }\n}\n\n/**\n * Error thrown when insufficient balance for an operation\n */\nexport class ScellInsufficientBalanceError extends ScellError {\n constructor(message = 'Insufficient balance', body?: unknown) {\n super(message, 402, 'INSUFFICIENT_BALANCE', body);\n this.name = 'ScellInsufficientBalanceError';\n }\n}\n\n/**\n * Error thrown for network-related issues\n */\nexport class ScellNetworkError extends ScellError {\n public readonly originalError: Error;\n\n constructor(message: string, originalError: Error) {\n super(message, 0, 'NETWORK_ERROR');\n this.name = 'ScellNetworkError';\n this.originalError = originalError;\n }\n}\n\n/**\n * Error thrown when request times out\n */\nexport class ScellTimeoutError extends ScellError {\n constructor(message = 'Request timed out') {\n super(message, 0, 'TIMEOUT');\n this.name = 'ScellTimeoutError';\n }\n}\n\n/**\n * Parse API error response and throw appropriate error\n */\nexport function parseApiError(\n status: number,\n body: unknown,\n headers?: Headers\n): never {\n const errorBody = body as ApiErrorResponse | undefined;\n const message = errorBody?.message ?? 'Unknown error';\n const errors = errorBody?.errors ?? {};\n const code = errorBody?.code;\n\n switch (status) {\n case 401:\n throw new ScellAuthenticationError(message, body);\n case 402:\n throw new ScellInsufficientBalanceError(message, body);\n case 403:\n throw new ScellAuthorizationError(message, body);\n case 404:\n throw new ScellNotFoundError(message, body);\n case 422:\n throw new ScellValidationError(message, errors, body);\n case 429: {\n const retryAfter = headers?.get('Retry-After');\n throw new ScellRateLimitError(\n message,\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n body\n );\n }\n default:\n if (status >= 500) {\n throw new ScellServerError(message, status, body);\n }\n throw new ScellError(message, status, code, body);\n }\n}\n","/**\n * Scell HTTP Client\n *\n * @packageDocumentation\n */\n\nimport {\n parseApiError,\n ScellNetworkError,\n ScellTimeoutError,\n} from './errors.js';\nimport { withRetry, type RetryOptions } from './utils/retry.js';\n\n/**\n * Authentication mode\n */\nexport type AuthMode = 'bearer' | 'api-key';\n\n/**\n * Client configuration options\n */\nexport interface ClientConfig {\n /** Base URL for the API (default: https://api.scell.io/api/v1) */\n baseUrl?: string | undefined;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number | undefined;\n /** Retry configuration */\n retry?: RetryOptions | undefined;\n /** Enable automatic retries (default: true) */\n enableRetry?: boolean | undefined;\n /** Custom fetch implementation */\n fetch?: typeof fetch | undefined;\n}\n\n/**\n * Request options for individual requests\n */\nexport interface RequestOptions {\n /** Override timeout for this request */\n timeout?: number | undefined;\n /** Skip retry for this request */\n skipRetry?: boolean | undefined;\n /** Additional headers */\n headers?: Record<string, string> | undefined;\n /** Abort signal */\n signal?: AbortSignal | undefined;\n}\n\n/**\n * Internal request configuration\n */\ninterface InternalRequestConfig extends RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\n/**\n * HTTP client for Scell API\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly retryOptions: RetryOptions;\n private readonly enableRetry: boolean;\n private readonly fetchFn: typeof fetch;\n private readonly authMode: AuthMode;\n private readonly authToken: string;\n\n constructor(\n authMode: AuthMode,\n authToken: string,\n config: ClientConfig = {}\n ) {\n this.authMode = authMode;\n this.authToken = authToken;\n this.baseUrl = config.baseUrl ?? 'https://api.scell.io/api/v1';\n this.timeout = config.timeout ?? 30000;\n this.retryOptions = config.retry ?? {};\n this.enableRetry = config.enableRetry ?? true;\n this.fetchFn = config.fetch ?? fetch;\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): string {\n const url = new URL(path, this.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Build headers for request\n */\n private buildHeaders(\n additionalHeaders?: Record<string, string>\n ): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...additionalHeaders,\n };\n\n if (this.authMode === 'bearer') {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n } else {\n headers['X-API-Key'] = this.authToken;\n }\n\n return headers;\n }\n\n /**\n * Execute HTTP request\n */\n private async executeRequest<T>(config: InternalRequestConfig): Promise<T> {\n const { method, path, body, query, headers, timeout, signal } = config;\n\n const url = this.buildUrl(path, query);\n const requestHeaders = this.buildHeaders(headers);\n const requestTimeout = timeout ?? this.timeout;\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n // Combine signals if provided\n const combinedSignal = signal\n ? new AbortController().signal\n : controller.signal;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers: requestHeaders,\n signal: combinedSignal,\n };\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await this.fetchFn(url, fetchOptions);\n\n clearTimeout(timeoutId);\n\n // Parse response body\n const contentType = response.headers.get('Content-Type') ?? '';\n let responseBody: unknown;\n\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n // Handle errors\n if (!response.ok) {\n parseApiError(response.status, responseBody, response.headers);\n }\n\n return responseBody as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n // Handle abort/timeout\n if (error.name === 'AbortError') {\n throw new ScellTimeoutError(\n `Request timed out after ${requestTimeout}ms`\n );\n }\n\n // Handle network errors\n if (\n error.name === 'TypeError' &&\n error.message.includes('fetch')\n ) {\n throw new ScellNetworkError('Network request failed', error);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Execute request with optional retry\n */\n private async request<T>(config: InternalRequestConfig): Promise<T> {\n const shouldRetry = this.enableRetry && !config.skipRetry;\n\n if (shouldRetry) {\n return withRetry(\n () => this.executeRequest<T>(config),\n this.retryOptions\n );\n }\n\n return this.executeRequest<T>(config);\n }\n\n /**\n * GET request\n */\n async get<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n const config: InternalRequestConfig = {\n method: 'GET',\n path,\n ...options,\n };\n if (query !== undefined) {\n config.query = query;\n }\n return this.request<T>(config);\n }\n\n /**\n * POST request\n */\n async post<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n path,\n body,\n ...options,\n });\n }\n\n /**\n * PUT request\n */\n async put<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n path,\n body,\n ...options,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n path,\n body,\n ...options,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n path,\n ...options,\n });\n }\n}\n","/**\n * Retry utility with exponential backoff and jitter\n *\n * @packageDocumentation\n */\n\nimport { ScellRateLimitError, ScellServerError } from '../errors.js';\n\n/**\n * Retry configuration options\n */\nexport interface RetryOptions {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries?: number | undefined;\n /** Base delay in milliseconds (default: 1000) */\n baseDelay?: number | undefined;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelay?: number | undefined;\n /** Jitter factor (0-1, default: 0.1) */\n jitterFactor?: number | undefined;\n /** Custom function to determine if error is retryable */\n isRetryable?: ((error: unknown) => boolean) | undefined;\n}\n\n/**\n * Default retry options\n */\nconst DEFAULT_RETRY_OPTIONS: Required<Omit<RetryOptions, 'isRetryable'>> = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n jitterFactor: 0.1,\n};\n\n/**\n * Check if an error is retryable (429 or 5xx)\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof ScellRateLimitError) {\n return true;\n }\n if (error instanceof ScellServerError) {\n return true;\n }\n // Network errors are also retryable\n if (error instanceof Error && error.name === 'ScellNetworkError') {\n return true;\n }\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n *\n * @param attempt - Current attempt number (0-indexed)\n * @param baseDelay - Base delay in milliseconds\n * @param maxDelay - Maximum delay in milliseconds\n * @param jitterFactor - Jitter factor (0-1)\n * @param retryAfter - Optional retry-after header value in seconds\n * @returns Delay in milliseconds\n */\nexport function calculateDelay(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n jitterFactor: number,\n retryAfter?: number\n): number {\n // If we have a retry-after header, use it\n if (retryAfter !== undefined && retryAfter > 0) {\n return retryAfter * 1000;\n }\n\n // Exponential backoff: baseDelay * 2^attempt\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n\n // Cap at maxDelay\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n\n // Add jitter: delay * (1 +/- jitterFactor * random)\n const jitter = cappedDelay * jitterFactor * (Math.random() * 2 - 1);\n\n return Math.floor(cappedDelay + jitter);\n}\n\n/**\n * Sleep for a specified duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Execute a function with retry logic\n *\n * @param fn - Async function to execute\n * @param options - Retry options\n * @returns Result of the function\n *\n * @example\n * ```typescript\n * const result = await withRetry(\n * () => client.invoices.create(data),\n * { maxRetries: 5 }\n * );\n * ```\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const maxRetries = options.maxRetries ?? DEFAULT_RETRY_OPTIONS.maxRetries;\n const baseDelay = options.baseDelay ?? DEFAULT_RETRY_OPTIONS.baseDelay;\n const maxDelay = options.maxDelay ?? DEFAULT_RETRY_OPTIONS.maxDelay;\n const jitterFactor = options.jitterFactor ?? DEFAULT_RETRY_OPTIONS.jitterFactor;\n const isRetryable = options.isRetryable ?? isRetryableError;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if we should retry\n if (attempt >= maxRetries || !isRetryable(error)) {\n throw error;\n }\n\n // Get retry-after header if available\n const retryAfter: number | undefined =\n error instanceof ScellRateLimitError ? error.retryAfter : undefined;\n\n // Calculate delay\n const delay = calculateDelay(\n attempt,\n baseDelay,\n maxDelay,\n jitterFactor,\n retryAfter\n );\n\n // Wait before retrying\n await sleep(delay);\n }\n }\n\n // This should never be reached, but TypeScript needs it\n throw lastError;\n}\n\n/**\n * Create a retry wrapper with pre-configured options\n *\n * @example\n * ```typescript\n * const retry = createRetryWrapper({ maxRetries: 5 });\n * const result = await retry(() => client.invoices.create(data));\n * ```\n */\nexport function createRetryWrapper(\n defaultOptions: RetryOptions = {}\n): <T>(fn: () => Promise<T>, options?: RetryOptions) => Promise<T> {\n return <T>(fn: () => Promise<T>, options: RetryOptions = {}) =>\n withRetry(fn, { ...defaultOptions, ...options });\n}\n","/**\n * API Keys Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyInput,\n} from '../types/api-keys.js';\n\n/**\n * API Keys resource\n *\n * @example\n * ```typescript\n * // Create an API key for a company\n * const apiKey = await client.apiKeys.create({\n * name: 'Production Key',\n * company_id: 'company-uuid',\n * environment: 'production'\n * });\n *\n * // Store the key securely!\n * console.log('API Key:', apiKey.key);\n * ```\n */\nexport class ApiKeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all API keys\n *\n * @param requestOptions - Request options\n * @returns List of API keys (without secrets)\n *\n * @example\n * ```typescript\n * const { data: keys } = await client.apiKeys.list();\n * keys.forEach(key => {\n * console.log(`${key.name}: ${key.key_prefix}...`);\n * });\n * ```\n */\n async list(requestOptions?: RequestOptions): Promise<{ data: ApiKey[] }> {\n return this.http.get<{ data: ApiKey[] }>(\n '/api-keys',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get a specific API key\n *\n * @param id - API Key UUID\n * @param requestOptions - Request options\n * @returns API key details (without secret)\n *\n * @example\n * ```typescript\n * const { data: key } = await client.apiKeys.get('key-uuid');\n * console.log(`Last used: ${key.last_used_at}`);\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<ApiKey>> {\n return this.http.get<SingleResponse<ApiKey>>(\n `/api-keys/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new API key\n *\n * Important: The full key is only returned once during creation.\n * Store it securely - you won't be able to retrieve it again.\n *\n * @param input - API key configuration\n * @param requestOptions - Request options\n * @returns Created API key with full key value\n *\n * @example\n * ```typescript\n * const { data: apiKey } = await client.apiKeys.create({\n * name: 'Production Integration',\n * company_id: 'company-uuid',\n * environment: 'production',\n * permissions: ['invoices:write', 'signatures:write']\n * });\n *\n * // IMPORTANT: Store this key securely!\n * // You won't be able to see it again.\n * console.log('Save this key:', apiKey.key);\n * ```\n */\n async create(\n input: CreateApiKeyInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<ApiKeyWithSecret>> {\n return this.http.post<MessageWithDataResponse<ApiKeyWithSecret>>(\n '/api-keys',\n input,\n requestOptions\n );\n }\n\n /**\n * Delete an API key\n *\n * Warning: This will immediately revoke the key and all\n * requests using it will fail.\n *\n * @param id - API Key UUID\n * @param requestOptions - Request options\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.apiKeys.delete('key-uuid');\n * console.log('API key revoked');\n * ```\n */\n async delete(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.delete<MessageResponse>(`/api-keys/${id}`, requestOptions);\n }\n}\n","/**\n * Auth Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type { MessageResponse, SingleResponse } from '../types/common.js';\nimport type {\n AuthResponse,\n ForgotPasswordInput,\n LoginCredentials,\n RegisterInput,\n ResetPasswordInput,\n User,\n} from '../types/auth.js';\n\n/**\n * Auth API resource\n *\n * Note: Most auth endpoints are only used during initial setup.\n * After login, use the returned token to create a ScellClient.\n *\n * @example\n * ```typescript\n * // Login and get token\n * const auth = await ScellAuth.login({\n * email: 'user@example.com',\n * password: 'password'\n * });\n *\n * // Create client with token\n * const client = new ScellClient(auth.token);\n *\n * // Get current user\n * const user = await client.auth.me();\n * ```\n */\nexport class AuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current authenticated user\n *\n * @param requestOptions - Request options\n * @returns Current user details\n *\n * @example\n * ```typescript\n * const { data: user } = await client.auth.me();\n * console.log(`Logged in as: ${user.name} (${user.email})`);\n * ```\n */\n async me(requestOptions?: RequestOptions): Promise<SingleResponse<User>> {\n return this.http.get<SingleResponse<User>>(\n '/auth/me',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Logout (revoke current token)\n *\n * @param requestOptions - Request options\n * @returns Logout confirmation\n *\n * @example\n * ```typescript\n * await client.auth.logout();\n * // Token is now invalid\n * ```\n */\n async logout(requestOptions?: RequestOptions): Promise<MessageResponse> {\n return this.http.post<MessageResponse>(\n '/auth/logout',\n undefined,\n requestOptions\n );\n }\n}\n\n/**\n * Static auth methods (don't require authentication)\n *\n * @example\n * ```typescript\n * import { ScellAuth } from '@scell/sdk';\n *\n * // Register new user\n * const auth = await ScellAuth.register({\n * name: 'John Doe',\n * email: 'john@example.com',\n * password: 'securepassword123',\n * password_confirmation: 'securepassword123'\n * });\n *\n * // Login existing user\n * const auth = await ScellAuth.login({\n * email: 'john@example.com',\n * password: 'securepassword123'\n * });\n *\n * // Use the token\n * const client = new ScellClient(auth.token);\n * ```\n */\nexport const ScellAuth = {\n /**\n * Default base URL for auth requests\n */\n baseUrl: 'https://api.scell.io/api/v1',\n\n /**\n * Register a new user\n *\n * @param input - Registration data\n * @param baseUrl - Optional base URL override\n * @returns Auth response with token\n *\n * @example\n * ```typescript\n * const auth = await ScellAuth.register({\n * name: 'Jane Doe',\n * email: 'jane@example.com',\n * password: 'MySecurePassword123!',\n * password_confirmation: 'MySecurePassword123!'\n * });\n *\n * console.log('Welcome,', auth.user.name);\n * const client = new ScellClient(auth.token);\n * ```\n */\n async register(\n input: RegisterInput,\n baseUrl?: string\n ): Promise<AuthResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/register`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(input),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as AuthResponse;\n },\n\n /**\n * Login an existing user\n *\n * @param credentials - Login credentials\n * @param baseUrl - Optional base URL override\n * @returns Auth response with token\n *\n * @example\n * ```typescript\n * const auth = await ScellAuth.login({\n * email: 'user@example.com',\n * password: 'password'\n * });\n *\n * // Store the token securely\n * localStorage.setItem('scell_token', auth.token);\n *\n * // Create client\n * const client = new ScellClient(auth.token);\n * ```\n */\n async login(\n credentials: LoginCredentials,\n baseUrl?: string\n ): Promise<AuthResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/login`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(credentials),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as AuthResponse;\n },\n\n /**\n * Request password reset email\n *\n * @param input - Email address\n * @param baseUrl - Optional base URL override\n * @returns Confirmation message\n *\n * @example\n * ```typescript\n * await ScellAuth.forgotPassword({\n * email: 'user@example.com'\n * });\n * console.log('Check your email for reset link');\n * ```\n */\n async forgotPassword(\n input: ForgotPasswordInput,\n baseUrl?: string\n ): Promise<MessageResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/forgot-password`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(input),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as MessageResponse;\n },\n\n /**\n * Reset password with token from email\n *\n * @param input - Reset password data\n * @param baseUrl - Optional base URL override\n * @returns Confirmation message\n *\n * @example\n * ```typescript\n * await ScellAuth.resetPassword({\n * email: 'user@example.com',\n * token: 'reset-token-from-email',\n * password: 'NewSecurePassword123!',\n * password_confirmation: 'NewSecurePassword123!'\n * });\n * ```\n */\n async resetPassword(\n input: ResetPasswordInput,\n baseUrl?: string\n ): Promise<MessageResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/reset-password`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(input),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as MessageResponse;\n },\n};\n","/**\n * Balance Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageWithDataResponse,\n PaginatedResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n Balance,\n ReloadBalanceInput,\n ReloadBalanceResponse,\n Transaction,\n TransactionListOptions,\n UpdateBalanceSettingsInput,\n} from '../types/balance.js';\n\n/**\n * Balance API resource\n *\n * @example\n * ```typescript\n * // Check balance\n * const balance = await client.balance.get();\n * console.log(`Current balance: ${balance.amount} ${balance.currency}`);\n *\n * // Reload balance\n * await client.balance.reload({ amount: 100 });\n *\n * // View transactions\n * const transactions = await client.balance.transactions({\n * type: 'debit',\n * service: 'invoice'\n * });\n * ```\n */\nexport class BalanceResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current balance and settings\n *\n * @param requestOptions - Request options\n * @returns Current balance details\n *\n * @example\n * ```typescript\n * const { data: balance } = await client.balance.get();\n * console.log(`Balance: ${balance.amount} ${balance.currency}`);\n *\n * if (balance.amount < balance.low_balance_alert_threshold) {\n * console.log('Warning: Low balance!');\n * }\n * ```\n */\n async get(requestOptions?: RequestOptions): Promise<SingleResponse<Balance>> {\n return this.http.get<SingleResponse<Balance>>(\n '/balance',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Reload balance\n *\n * Note: This is a simulation endpoint. In production, use Stripe integration.\n *\n * @param input - Reload amount (10-10000 EUR)\n * @param requestOptions - Request options\n * @returns Reload transaction details\n *\n * @example\n * ```typescript\n * const { transaction } = await client.balance.reload({ amount: 100 });\n * console.log(`New balance: ${transaction.balance_after}`);\n * ```\n */\n async reload(\n input: ReloadBalanceInput,\n requestOptions?: RequestOptions\n ): Promise<ReloadBalanceResponse> {\n return this.http.post<ReloadBalanceResponse>(\n '/balance/reload',\n input,\n requestOptions\n );\n }\n\n /**\n * Update balance settings\n *\n * Configure auto-reload and alert thresholds.\n *\n * @param input - Settings to update\n * @param requestOptions - Request options\n * @returns Updated settings\n *\n * @example\n * ```typescript\n * await client.balance.updateSettings({\n * auto_reload_enabled: true,\n * auto_reload_threshold: 50,\n * auto_reload_amount: 200,\n * low_balance_alert_threshold: 100,\n * critical_balance_alert_threshold: 25\n * });\n * ```\n */\n async updateSettings(\n input: UpdateBalanceSettingsInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Partial<Balance>>> {\n return this.http.put<MessageWithDataResponse<Partial<Balance>>>(\n '/balance/settings',\n input,\n requestOptions\n );\n }\n\n /**\n * List balance transactions\n *\n * @param options - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of transactions\n *\n * @example\n * ```typescript\n * // List all invoice debits\n * const { data, meta } = await client.balance.transactions({\n * type: 'debit',\n * service: 'invoice',\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n *\n * data.forEach(tx => {\n * console.log(`${tx.description}: -${tx.amount} EUR`);\n * });\n * ```\n */\n async transactions(\n options: TransactionListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Transaction>> {\n return this.http.get<PaginatedResponse<Transaction>>(\n '/balance/transactions',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n}\n","/**\n * Companies Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n Company,\n CreateCompanyInput,\n KycInitiateResponse,\n KycStatusResponse,\n UpdateCompanyInput,\n} from '../types/companies.js';\n\n/**\n * Companies API resource\n *\n * @example\n * ```typescript\n * // Create a company\n * const company = await client.companies.create({\n * name: 'My Company',\n * siret: '12345678901234',\n * address_line1: '1 Rue de la Paix',\n * postal_code: '75001',\n * city: 'Paris'\n * });\n *\n * // Initiate KYC\n * const kyc = await client.companies.initiateKyc(company.id);\n * console.log('KYC URL:', kyc.redirect_url);\n * ```\n */\nexport class CompaniesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all companies for the authenticated user\n *\n * @param requestOptions - Request options\n * @returns List of companies\n *\n * @example\n * ```typescript\n * const { data: companies } = await client.companies.list();\n * companies.forEach(c => console.log(c.name, c.status));\n * ```\n */\n async list(\n requestOptions?: RequestOptions\n ): Promise<{ data: Company[] }> {\n return this.http.get<{ data: Company[] }>(\n '/companies',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get a specific company by ID\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns Company details\n *\n * @example\n * ```typescript\n * const { data: company } = await client.companies.get('uuid');\n * console.log(company.name, company.siret);\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Company>> {\n return this.http.get<SingleResponse<Company>>(\n `/companies/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new company\n *\n * @param input - Company creation data\n * @param requestOptions - Request options\n * @returns Created company\n *\n * @example\n * ```typescript\n * const { data: company } = await client.companies.create({\n * name: 'Acme Corp',\n * siret: '12345678901234',\n * vat_number: 'FR12345678901',\n * legal_form: 'SAS',\n * address_line1: '123 Business Street',\n * postal_code: '75001',\n * city: 'Paris',\n * country: 'FR',\n * email: 'contact@acme.com',\n * phone: '+33 1 23 45 67 89'\n * });\n * ```\n */\n async create(\n input: CreateCompanyInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Company>> {\n return this.http.post<MessageWithDataResponse<Company>>(\n '/companies',\n input,\n requestOptions\n );\n }\n\n /**\n * Update a company\n *\n * @param id - Company UUID\n * @param input - Fields to update\n * @param requestOptions - Request options\n * @returns Updated company\n *\n * @example\n * ```typescript\n * const { data: company } = await client.companies.update('uuid', {\n * email: 'new-email@acme.com',\n * phone: '+33 1 98 76 54 32'\n * });\n * ```\n */\n async update(\n id: string,\n input: UpdateCompanyInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Company>> {\n return this.http.put<MessageWithDataResponse<Company>>(\n `/companies/${id}`,\n input,\n requestOptions\n );\n }\n\n /**\n * Delete a company\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.companies.delete('company-uuid');\n * ```\n */\n async delete(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.delete<MessageResponse>(\n `/companies/${id}`,\n requestOptions\n );\n }\n\n /**\n * Initiate KYC verification for a company\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns KYC reference and redirect URL\n *\n * @example\n * ```typescript\n * const { kyc_reference, redirect_url } = await client.companies.initiateKyc(\n * 'company-uuid'\n * );\n * // Redirect user to redirect_url for KYC verification\n * ```\n */\n async initiateKyc(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<KycInitiateResponse> {\n return this.http.post<KycInitiateResponse>(\n `/companies/${id}/kyc`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get KYC verification status\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns Current KYC status\n *\n * @example\n * ```typescript\n * const status = await client.companies.kycStatus('company-uuid');\n * if (status.status === 'active') {\n * console.log('KYC completed at:', status.kyc_completed_at);\n * }\n * ```\n */\n async kycStatus(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<KycStatusResponse> {\n return this.http.get<KycStatusResponse>(\n `/companies/${id}/kyc/status`,\n undefined,\n requestOptions\n );\n }\n}\n","/**\n * Invoices Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageWithDataResponse,\n PaginatedResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n AuditTrailResponse,\n ConvertInvoiceInput,\n CreateInvoiceInput,\n Invoice,\n InvoiceDownloadResponse,\n InvoiceDownloadType,\n InvoiceListOptions,\n} from '../types/invoices.js';\n\n/**\n * Invoices API resource\n *\n * @example\n * ```typescript\n * // List invoices\n * const invoices = await client.invoices.list({\n * direction: 'outgoing',\n * status: 'validated'\n * });\n *\n * // Create an invoice\n * const invoice = await client.invoices.create({\n * invoice_number: 'FACT-2024-001',\n * direction: 'outgoing',\n * output_format: 'facturx',\n * // ...\n * });\n *\n * // Download invoice\n * const download = await client.invoices.download(invoice.id, 'pdf');\n * console.log('Download URL:', download.url);\n * ```\n */\nexport class InvoicesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List invoices with optional filtering\n *\n * @param options - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of invoices\n *\n * @example\n * ```typescript\n * // List all outgoing invoices\n * const { data, meta } = await client.invoices.list({\n * direction: 'outgoing',\n * per_page: 50\n * });\n * console.log(`Found ${meta.total} invoices`);\n * ```\n */\n async list(\n options: InvoiceListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Invoice>> {\n return this.http.get<PaginatedResponse<Invoice>>(\n '/invoices',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Get a specific invoice by ID\n *\n * @param id - Invoice UUID\n * @param requestOptions - Request options\n * @returns Invoice details\n *\n * @example\n * ```typescript\n * const { data: invoice } = await client.invoices.get('uuid-here');\n * console.log('Invoice number:', invoice.invoice_number);\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Invoice>> {\n return this.http.get<SingleResponse<Invoice>>(\n `/invoices/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new invoice\n *\n * Note: This endpoint requires API key authentication.\n * Creating an invoice in production mode will debit your balance.\n *\n * @param input - Invoice creation data\n * @param requestOptions - Request options\n * @returns Created invoice\n *\n * @example\n * ```typescript\n * const { data: invoice } = await client.invoices.create({\n * invoice_number: 'FACT-2024-001',\n * direction: 'outgoing',\n * output_format: 'facturx',\n * issue_date: '2024-01-15',\n * total_ht: 100.00,\n * total_tax: 20.00,\n * total_ttc: 120.00,\n * seller_siret: '12345678901234',\n * seller_name: 'My Company',\n * seller_address: {\n * line1: '1 Rue Example',\n * postal_code: '75001',\n * city: 'Paris',\n * country: 'FR'\n * },\n * buyer_siret: '98765432109876',\n * buyer_name: 'Client Company',\n * buyer_address: {\n * line1: '2 Avenue Test',\n * postal_code: '75002',\n * city: 'Paris',\n * country: 'FR'\n * },\n * lines: [{\n * description: 'Service prestation',\n * quantity: 1,\n * unit_price: 100.00,\n * tax_rate: 20.00,\n * total_ht: 100.00,\n * total_tax: 20.00,\n * total_ttc: 120.00\n * }]\n * });\n * ```\n */\n async create(\n input: CreateInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Invoice>> {\n return this.http.post<MessageWithDataResponse<Invoice>>(\n '/invoices',\n input,\n requestOptions\n );\n }\n\n /**\n * Download invoice file\n *\n * @param id - Invoice UUID\n * @param type - File type to download\n * @param requestOptions - Request options\n * @returns Temporary download URL\n *\n * @example\n * ```typescript\n * // Download PDF version\n * const { url, expires_at } = await client.invoices.download(\n * 'invoice-uuid',\n * 'pdf'\n * );\n * console.log('Download before:', expires_at);\n * ```\n */\n async download(\n id: string,\n type: InvoiceDownloadType,\n requestOptions?: RequestOptions\n ): Promise<InvoiceDownloadResponse> {\n return this.http.get<InvoiceDownloadResponse>(\n `/invoices/${id}/download/${type}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get invoice audit trail (Piste d'Audit Fiable)\n *\n * @param id - Invoice UUID\n * @param requestOptions - Request options\n * @returns Audit trail entries with integrity validation\n *\n * @example\n * ```typescript\n * const { data: entries, integrity_valid } = await client.invoices.auditTrail(\n * 'invoice-uuid'\n * );\n *\n * if (integrity_valid) {\n * console.log('Audit trail is valid');\n * entries.forEach(e => console.log(e.action, e.created_at));\n * }\n * ```\n */\n async auditTrail(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<AuditTrailResponse> {\n return this.http.get<AuditTrailResponse>(\n `/invoices/${id}/audit-trail`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Convert invoice to another format\n *\n * @param input - Conversion parameters\n * @param requestOptions - Request options\n * @returns Conversion status\n *\n * @example\n * ```typescript\n * await client.invoices.convert({\n * invoice_id: 'invoice-uuid',\n * target_format: 'ubl'\n * });\n * ```\n */\n async convert(\n input: ConvertInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<{ message: string; invoice_id: string; target_format: string }> {\n return this.http.post<{\n message: string;\n invoice_id: string;\n target_format: string;\n }>('/invoices/convert', input, requestOptions);\n }\n}\n","/**\n * Signatures Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n PaginatedResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n CreateSignatureInput,\n Signature,\n SignatureDownloadResponse,\n SignatureDownloadType,\n SignatureListOptions,\n SignatureRemindResponse,\n} from '../types/signatures.js';\n\n/**\n * Signatures API resource\n *\n * @example\n * ```typescript\n * // Create a signature request\n * const signature = await client.signatures.create({\n * title: 'Employment Contract',\n * document: btoa(pdfContent), // Base64 encoded\n * document_name: 'contract.pdf',\n * signers: [{\n * first_name: 'John',\n * last_name: 'Doe',\n * email: 'john@example.com',\n * auth_method: 'email'\n * }]\n * });\n *\n * // Send reminder\n * await client.signatures.remind(signature.id);\n * ```\n */\nexport class SignaturesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List signature requests with optional filtering\n *\n * @param options - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of signatures\n *\n * @example\n * ```typescript\n * const { data, meta } = await client.signatures.list({\n * status: 'pending',\n * per_page: 25\n * });\n * console.log(`${meta.total} pending signatures`);\n * ```\n */\n async list(\n options: SignatureListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Signature>> {\n return this.http.get<PaginatedResponse<Signature>>(\n '/signatures',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Get a specific signature by ID\n *\n * @param id - Signature UUID\n * @param requestOptions - Request options\n * @returns Signature details with signers\n *\n * @example\n * ```typescript\n * const { data: signature } = await client.signatures.get('uuid-here');\n * signature.signers?.forEach(signer => {\n * console.log(`${signer.full_name}: ${signer.status}`);\n * });\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Signature>> {\n return this.http.get<SingleResponse<Signature>>(\n `/signatures/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new signature request\n *\n * Note: This endpoint requires API key authentication.\n * Creating a signature in production mode will debit your balance.\n *\n * @param input - Signature creation data\n * @param requestOptions - Request options\n * @returns Created signature\n *\n * @example\n * ```typescript\n * import { readFileSync } from 'fs';\n *\n * const pdfContent = readFileSync('contract.pdf');\n * const { data: signature } = await client.signatures.create({\n * title: 'Service Agreement',\n * description: 'Annual service contract',\n * document: pdfContent.toString('base64'),\n * document_name: 'contract.pdf',\n * signers: [\n * {\n * first_name: 'Alice',\n * last_name: 'Smith',\n * email: 'alice@example.com',\n * auth_method: 'email'\n * },\n * {\n * first_name: 'Bob',\n * last_name: 'Jones',\n * phone: '+33612345678',\n * auth_method: 'sms'\n * }\n * ],\n * ui_config: {\n * logo_url: 'https://mycompany.com/logo.png',\n * primary_color: '#3b82f6',\n * company_name: 'My Company'\n * },\n * redirect_complete_url: 'https://myapp.com/signed',\n * redirect_cancel_url: 'https://myapp.com/cancelled'\n * });\n *\n * // Send signing URLs to signers\n * signature.signers?.forEach(signer => {\n * console.log(`${signer.email}: ${signer.signing_url}`);\n * });\n * ```\n */\n async create(\n input: CreateSignatureInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Signature>> {\n return this.http.post<MessageWithDataResponse<Signature>>(\n '/signatures',\n input,\n requestOptions\n );\n }\n\n /**\n * Download signature files\n *\n * @param id - Signature UUID\n * @param type - File type to download\n * @param requestOptions - Request options\n * @returns Temporary download URL\n *\n * @example\n * ```typescript\n * // Download signed document\n * const { url } = await client.signatures.download(\n * 'signature-uuid',\n * 'signed'\n * );\n *\n * // Download audit trail (proof file)\n * const { url: auditUrl } = await client.signatures.download(\n * 'signature-uuid',\n * 'audit_trail'\n * );\n * ```\n */\n async download(\n id: string,\n type: SignatureDownloadType,\n requestOptions?: RequestOptions\n ): Promise<SignatureDownloadResponse> {\n return this.http.get<SignatureDownloadResponse>(\n `/signatures/${id}/download/${type}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Send reminder to pending signers\n *\n * @param id - Signature UUID\n * @param requestOptions - Request options\n * @returns Number of signers reminded\n *\n * @example\n * ```typescript\n * const { signers_reminded } = await client.signatures.remind('uuid');\n * console.log(`Reminded ${signers_reminded} signers`);\n * ```\n */\n async remind(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SignatureRemindResponse> {\n return this.http.post<SignatureRemindResponse>(\n `/signatures/${id}/remind`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Cancel a signature request\n *\n * Note: Cannot cancel completed signatures.\n *\n * @param id - Signature UUID\n * @param requestOptions - Request options\n * @returns Cancellation confirmation\n *\n * @example\n * ```typescript\n * await client.signatures.cancel('signature-uuid');\n * console.log('Signature cancelled');\n * ```\n */\n async cancel(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.post<MessageResponse>(\n `/signatures/${id}/cancel`,\n undefined,\n requestOptions\n );\n }\n}\n","/**\n * Webhooks Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n PaginatedResponse,\n} from '../types/common.js';\nimport type {\n CreateWebhookInput,\n UpdateWebhookInput,\n Webhook,\n WebhookListOptions,\n WebhookLog,\n WebhookTestResponse,\n WebhookWithSecret,\n} from '../types/webhooks.js';\n\n/**\n * Webhooks API resource\n *\n * @example\n * ```typescript\n * // Create a webhook\n * const webhook = await client.webhooks.create({\n * url: 'https://myapp.com/webhooks/scell',\n * events: ['invoice.validated', 'signature.completed'],\n * environment: 'production'\n * });\n *\n * // Store the secret securely!\n * console.log('Webhook secret:', webhook.secret);\n *\n * // Test the webhook\n * const test = await client.webhooks.test(webhook.id);\n * console.log('Test success:', test.success);\n * ```\n */\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all webhooks\n *\n * @param options - Filter options\n * @param requestOptions - Request options\n * @returns List of webhooks\n *\n * @example\n * ```typescript\n * const { data: webhooks } = await client.webhooks.list();\n * webhooks.forEach(wh => {\n * console.log(`${wh.url}: ${wh.is_active ? 'active' : 'inactive'}`);\n * });\n * ```\n */\n async list(\n options: WebhookListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<{ data: Webhook[] }> {\n return this.http.get<{ data: Webhook[] }>(\n '/webhooks',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Create a new webhook\n *\n * Important: The secret is only returned once during creation.\n * Store it securely - you'll need it to verify webhook signatures.\n *\n * @param input - Webhook configuration\n * @param requestOptions - Request options\n * @returns Created webhook with secret\n *\n * @example\n * ```typescript\n * const { data: webhook } = await client.webhooks.create({\n * url: 'https://myapp.com/webhooks/scell',\n * events: [\n * 'invoice.created',\n * 'invoice.validated',\n * 'signature.completed',\n * 'balance.low'\n * ],\n * environment: 'production',\n * headers: {\n * 'X-Custom-Auth': 'my-secret-token'\n * },\n * retry_count: 5,\n * timeout_seconds: 30\n * });\n *\n * // IMPORTANT: Store this secret securely!\n * await saveWebhookSecret(webhook.id, webhook.secret);\n * ```\n */\n async create(\n input: CreateWebhookInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<WebhookWithSecret>> {\n return this.http.post<MessageWithDataResponse<WebhookWithSecret>>(\n '/webhooks',\n input,\n requestOptions\n );\n }\n\n /**\n * Update a webhook\n *\n * @param id - Webhook UUID\n * @param input - Fields to update\n * @param requestOptions - Request options\n * @returns Updated webhook\n *\n * @example\n * ```typescript\n * // Disable a webhook temporarily\n * await client.webhooks.update('webhook-uuid', {\n * is_active: false\n * });\n *\n * // Update events\n * await client.webhooks.update('webhook-uuid', {\n * events: ['invoice.validated', 'signature.completed']\n * });\n * ```\n */\n async update(\n id: string,\n input: UpdateWebhookInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Webhook>> {\n return this.http.put<MessageWithDataResponse<Webhook>>(\n `/webhooks/${id}`,\n input,\n requestOptions\n );\n }\n\n /**\n * Delete a webhook\n *\n * @param id - Webhook UUID\n * @param requestOptions - Request options\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.webhooks.delete('webhook-uuid');\n * ```\n */\n async delete(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.delete<MessageResponse>(`/webhooks/${id}`, requestOptions);\n }\n\n /**\n * Regenerate webhook secret\n *\n * Use this if your secret has been compromised.\n * The old secret will immediately stop working.\n *\n * @param id - Webhook UUID\n * @param requestOptions - Request options\n * @returns Webhook with new secret\n *\n * @example\n * ```typescript\n * const { data: webhook } = await client.webhooks.regenerateSecret(\n * 'webhook-uuid'\n * );\n *\n * // Update your stored secret\n * await updateWebhookSecret(webhook.id, webhook.secret);\n * ```\n */\n async regenerateSecret(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<WebhookWithSecret>> {\n return this.http.post<MessageWithDataResponse<WebhookWithSecret>>(\n `/webhooks/${id}/regenerate-secret`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Test webhook by sending a test event\n *\n * @param id - Webhook UUID\n * @param requestOptions - Request options\n * @returns Test result\n *\n * @example\n * ```typescript\n * const result = await client.webhooks.test('webhook-uuid');\n *\n * if (result.success) {\n * console.log(`Success! Response time: ${result.response_time_ms}ms`);\n * } else {\n * console.log(`Failed: ${result.error}`);\n * }\n * ```\n */\n async test(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<WebhookTestResponse> {\n return this.http.post<WebhookTestResponse>(\n `/webhooks/${id}/test`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get webhook delivery logs\n *\n * @param id - Webhook UUID\n * @param options - Pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of logs\n *\n * @example\n * ```typescript\n * const { data: logs } = await client.webhooks.logs('webhook-uuid', {\n * per_page: 50\n * });\n *\n * logs.forEach(log => {\n * const status = log.success ? 'OK' : 'FAILED';\n * console.log(`${log.event} - ${status} (${log.response_time_ms}ms)`);\n * });\n * ```\n */\n async logs(\n id: string,\n options: { per_page?: number } = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<WebhookLog>> {\n return this.http.get<PaginatedResponse<WebhookLog>>(\n `/webhooks/${id}/logs`,\n options,\n requestOptions\n );\n }\n}\n","/**\n * Webhook signature verification utility\n *\n * @packageDocumentation\n */\n\nimport type { WebhookPayload } from '../types/webhooks.js';\n\n/**\n * Signature verification options\n */\nexport interface VerifySignatureOptions {\n /** Tolerance in seconds for timestamp validation (default: 300 = 5 minutes) */\n tolerance?: number | undefined;\n}\n\n/**\n * Parse the X-Scell-Signature header\n *\n * @param header - The signature header value (format: \"t=timestamp,v1=signature\")\n * @returns Parsed timestamp and signature\n */\nfunction parseSignatureHeader(header: string): {\n timestamp: number;\n signature: string;\n} | null {\n const parts = header.split(',');\n let timestamp: number | undefined;\n let signature: string | undefined;\n\n for (const part of parts) {\n const splitIndex = part.indexOf('=');\n if (splitIndex === -1) continue;\n\n const key = part.substring(0, splitIndex);\n const value = part.substring(splitIndex + 1);\n\n if (key === 't') {\n timestamp = parseInt(value, 10);\n } else if (key === 'v1') {\n signature = value;\n }\n }\n\n if (timestamp === undefined || signature === undefined) {\n return null;\n }\n\n return { timestamp, signature };\n}\n\n/**\n * Compute HMAC-SHA256 signature\n *\n * @param payload - The payload string\n * @param timestamp - The timestamp\n * @param secret - The webhook secret\n * @returns Hex-encoded signature\n */\nasync function computeSignature(\n payload: string,\n timestamp: number,\n secret: string\n): Promise<string> {\n const signedPayload = `${timestamp}.${payload}`;\n\n // Use Web Crypto API (works in Node.js 18+ and browsers)\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n const messageData = encoder.encode(signedPayload);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signatureBuffer = await crypto.subtle.sign(\n 'HMAC',\n cryptoKey,\n messageData\n );\n\n // Convert to hex string\n return Array.from(new Uint8Array(signatureBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks\n */\nfunction secureCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n\n return result === 0;\n}\n\n/**\n * Scell Webhook signature verification utilities\n *\n * @example\n * ```typescript\n * import { ScellWebhooks } from '@scell/sdk';\n *\n * // In your webhook endpoint\n * app.post('/webhooks/scell', async (req, res) => {\n * const signature = req.headers['x-scell-signature'];\n * const payload = JSON.stringify(req.body);\n *\n * const isValid = await ScellWebhooks.verifySignature(\n * payload,\n * signature,\n * process.env.WEBHOOK_SECRET\n * );\n *\n * if (!isValid) {\n * return res.status(401).send('Invalid signature');\n * }\n *\n * // Process the webhook\n * const event = ScellWebhooks.parsePayload(payload);\n * console.log('Received event:', event.event);\n * });\n * ```\n */\nexport const ScellWebhooks = {\n /**\n * Verify webhook signature\n *\n * @param payload - Raw request body as string\n * @param signature - Value of X-Scell-Signature header\n * @param secret - Your webhook secret (whsec_...)\n * @param options - Verification options\n * @returns True if signature is valid\n *\n * @example\n * ```typescript\n * const isValid = await ScellWebhooks.verifySignature(\n * rawBody,\n * req.headers['x-scell-signature'],\n * 'whsec_abc123...'\n * );\n * ```\n */\n async verifySignature(\n payload: string,\n signature: string,\n secret: string,\n options: VerifySignatureOptions = {}\n ): Promise<boolean> {\n const { tolerance = 300 } = options;\n\n // Parse the signature header\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n return false;\n }\n\n const { timestamp, signature: providedSignature } = parsed;\n\n // Check timestamp tolerance\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - timestamp) > tolerance) {\n return false;\n }\n\n // Compute expected signature\n const expectedSignature = await computeSignature(payload, timestamp, secret);\n\n // Constant-time comparison\n return secureCompare(expectedSignature, providedSignature);\n },\n\n /**\n * Verify webhook signature synchronously using Node.js crypto\n * (Only works in Node.js environment)\n *\n * @param payload - Raw request body as string\n * @param signature - Value of X-Scell-Signature header\n * @param secret - Your webhook secret (whsec_...)\n * @param options - Verification options\n * @returns True if signature is valid\n */\n verifySignatureSync(\n payload: string,\n signature: string,\n secret: string,\n options: VerifySignatureOptions = {}\n ): boolean {\n const { tolerance = 300 } = options;\n\n // Parse the signature header\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n return false;\n }\n\n const { timestamp, signature: providedSignature } = parsed;\n\n // Check timestamp tolerance\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - timestamp) > tolerance) {\n return false;\n }\n\n // Use Node.js crypto for sync operation\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const crypto = require('crypto') as typeof import('crypto');\n const signedPayload = `${timestamp}.${payload}`;\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(signedPayload)\n .digest('hex');\n\n // Use Node.js timingSafeEqual\n try {\n return crypto.timingSafeEqual(\n Buffer.from(expectedSignature),\n Buffer.from(providedSignature)\n );\n } catch {\n return false;\n }\n },\n\n /**\n * Parse webhook payload\n *\n * @param payload - Raw request body as string\n * @returns Parsed webhook payload\n *\n * @example\n * ```typescript\n * const event = ScellWebhooks.parsePayload<InvoiceWebhookData>(rawBody);\n * if (event.event === 'invoice.validated') {\n * console.log('Invoice validated:', event.data.invoice_number);\n * }\n * ```\n */\n parsePayload<T = unknown>(payload: string): WebhookPayload<T> {\n return JSON.parse(payload) as WebhookPayload<T>;\n },\n\n /**\n * Construct a test webhook event for local testing\n *\n * @param event - Event type\n * @param data - Event data\n * @param secret - Webhook secret for signing\n * @returns Object with payload and headers for testing\n */\n async constructTestEvent<T>(\n event: string,\n data: T,\n secret: string\n ): Promise<{\n payload: string;\n headers: Record<string, string>;\n }> {\n const timestamp = Math.floor(Date.now() / 1000);\n const webhookPayload: WebhookPayload<T> = {\n event: event as WebhookPayload<T>['event'],\n timestamp: new Date().toISOString(),\n data,\n };\n\n const payload = JSON.stringify(webhookPayload);\n const signature = await computeSignature(payload, timestamp, secret);\n\n return {\n payload,\n headers: {\n 'X-Scell-Signature': `t=${timestamp},v1=${signature}`,\n 'X-Scell-Event': event,\n 'X-Scell-Delivery': crypto.randomUUID(),\n 'Content-Type': 'application/json',\n },\n };\n },\n};\n","/**\n * Scell.io Official TypeScript SDK\n *\n * @packageDocumentation\n *\n * @example\n * ```typescript\n * import { ScellClient, ScellApiClient, ScellAuth, ScellWebhooks } from '@scell/sdk';\n *\n * // Dashboard client (Bearer token)\n * const auth = await ScellAuth.login({ email, password });\n * const client = new ScellClient(auth.token);\n *\n * // API client (X-API-Key)\n * const apiClient = new ScellApiClient('your-api-key');\n *\n * // Create invoice\n * const invoice = await apiClient.invoices.create({...});\n *\n * // Verify webhook\n * const isValid = await ScellWebhooks.verifySignature(payload, signature, secret);\n * ```\n */\n\n// Client\nimport { HttpClient, type ClientConfig } from './client.js';\n\n// Resources\nimport { ApiKeysResource } from './resources/api-keys.js';\nimport { AuthResource, ScellAuth } from './resources/auth.js';\nimport { BalanceResource } from './resources/balance.js';\nimport { CompaniesResource } from './resources/companies.js';\nimport { InvoicesResource } from './resources/invoices.js';\nimport { SignaturesResource } from './resources/signatures.js';\nimport { WebhooksResource } from './resources/webhooks.js';\n\n// Utilities\nimport { ScellWebhooks } from './utils/webhook-verify.js';\nimport { withRetry, createRetryWrapper } from './utils/retry.js';\n\n/**\n * Scell Dashboard Client\n *\n * Use this client for dashboard/user operations with Bearer token authentication.\n *\n * @example\n * ```typescript\n * import { ScellClient, ScellAuth } from '@scell/sdk';\n *\n * // Login first\n * const auth = await ScellAuth.login({\n * email: 'user@example.com',\n * password: 'password'\n * });\n *\n * // Create client\n * const client = new ScellClient(auth.token);\n *\n * // Use the client\n * const companies = await client.companies.list();\n * const balance = await client.balance.get();\n * ```\n */\nexport class ScellClient {\n private readonly http: HttpClient;\n\n /** Authentication operations */\n public readonly auth: AuthResource;\n /** Company management */\n public readonly companies: CompaniesResource;\n /** API key management */\n public readonly apiKeys: ApiKeysResource;\n /** Balance and transactions */\n public readonly balance: BalanceResource;\n /** Webhook management */\n public readonly webhooks: WebhooksResource;\n /** Invoice listing (read-only via dashboard) */\n public readonly invoices: InvoicesResource;\n /** Signature listing (read-only via dashboard) */\n public readonly signatures: SignaturesResource;\n\n /**\n * Create a new Scell Dashboard Client\n *\n * @param token - Bearer token from login\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * const client = new ScellClient('your-bearer-token', {\n * baseUrl: 'https://api.scell.io/api/v1',\n * timeout: 30000,\n * retry: { maxRetries: 3 }\n * });\n * ```\n */\n constructor(token: string, config: ClientConfig = {}) {\n this.http = new HttpClient('bearer', token, config);\n\n this.auth = new AuthResource(this.http);\n this.companies = new CompaniesResource(this.http);\n this.apiKeys = new ApiKeysResource(this.http);\n this.balance = new BalanceResource(this.http);\n this.webhooks = new WebhooksResource(this.http);\n this.invoices = new InvoicesResource(this.http);\n this.signatures = new SignaturesResource(this.http);\n }\n}\n\n/**\n * Scell API Client\n *\n * Use this client for external API operations with X-API-Key authentication.\n * This is the client you'll use for creating invoices and signatures.\n *\n * @example\n * ```typescript\n * import { ScellApiClient } from '@scell/sdk';\n *\n * const client = new ScellApiClient('your-api-key');\n *\n * // Create an invoice\n * const invoice = await client.invoices.create({\n * invoice_number: 'FACT-2024-001',\n * direction: 'outgoing',\n * output_format: 'facturx',\n * // ...\n * });\n *\n * // Create a signature request\n * const signature = await client.signatures.create({\n * title: 'Contract',\n * document: btoa(pdfContent),\n * document_name: 'contract.pdf',\n * signers: [{...}]\n * });\n * ```\n */\nexport class ScellApiClient {\n private readonly http: HttpClient;\n\n /** Invoice operations (create, download, convert) */\n public readonly invoices: InvoicesResource;\n /** Signature operations (create, download, remind, cancel) */\n public readonly signatures: SignaturesResource;\n\n /**\n * Create a new Scell API Client\n *\n * @param apiKey - Your API key (from dashboard)\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * // Production client\n * const client = new ScellApiClient('sk_live_xxx');\n *\n * // Sandbox client\n * const sandboxClient = new ScellApiClient('sk_test_xxx', {\n * baseUrl: 'https://api.scell.io/api/v1/sandbox'\n * });\n * ```\n */\n constructor(apiKey: string, config: ClientConfig = {}) {\n this.http = new HttpClient('api-key', apiKey, config);\n\n this.invoices = new InvoicesResource(this.http);\n this.signatures = new SignaturesResource(this.http);\n }\n}\n\n// Re-export utilities\nexport { ScellAuth, ScellWebhooks, withRetry, createRetryWrapper };\n\n// Re-export types\nexport type { ClientConfig } from './client.js';\nexport type { RetryOptions } from './utils/retry.js';\nexport type { VerifySignatureOptions } from './utils/webhook-verify.js';\n\n// Re-export errors\nexport {\n ScellError,\n ScellAuthenticationError,\n ScellAuthorizationError,\n ScellValidationError,\n ScellRateLimitError,\n ScellNotFoundError,\n ScellServerError,\n ScellInsufficientBalanceError,\n ScellNetworkError,\n ScellTimeoutError,\n} from './errors.js';\n\n// Re-export all types\nexport * from './types/index.js';\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/retry.ts","../src/resources/api-keys.ts","../src/resources/auth.ts","../src/resources/balance.ts","../src/resources/companies.ts","../src/resources/invoices.ts","../src/resources/signatures.ts","../src/resources/webhooks.ts","../src/utils/webhook-verify.ts","../src/index.ts"],"names":["ScellAuthenticationError","ScellAuthorizationError","ScellError","ScellInsufficientBalanceError","ScellNetworkError","ScellNotFoundError","ScellRateLimitError","ScellServerError","ScellTimeoutError","ScellValidationError","parseApiError","crypto"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Scell SDK Error Classes\n *\n * @packageDocumentation\n */\n\nimport type { ApiErrorResponse } from './types/common.js';\n\n/**\n * Base error class for all Scell API errors\n */\nexport class ScellError extends Error {\n /** HTTP status code */\n public readonly status: number;\n /** Error code from API */\n public readonly code: string | undefined;\n /** Original response body */\n public readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n code?: string,\n body?: unknown\n ) {\n super(message);\n this.name = 'ScellError';\n this.status = status;\n this.code = code;\n this.body = body;\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n *\n * @example\n * ```typescript\n * try {\n * await client.invoices.list();\n * } catch (error) {\n * if (error instanceof ScellAuthenticationError) {\n * console.log('Invalid or expired token');\n * }\n * }\n * ```\n */\nexport class ScellAuthenticationError extends ScellError {\n constructor(message = 'Authentication failed', body?: unknown) {\n super(message, 401, 'AUTHENTICATION_ERROR', body);\n this.name = 'ScellAuthenticationError';\n }\n}\n\n/**\n * Error thrown when authorization fails (403)\n *\n * @example\n * ```typescript\n * try {\n * await client.admin.users();\n * } catch (error) {\n * if (error instanceof ScellAuthorizationError) {\n * console.log('Insufficient permissions');\n * }\n * }\n * ```\n */\nexport class ScellAuthorizationError extends ScellError {\n constructor(message = 'Access denied', body?: unknown) {\n super(message, 403, 'AUTHORIZATION_ERROR', body);\n this.name = 'ScellAuthorizationError';\n }\n}\n\n/**\n * Error thrown when validation fails (422)\n *\n * @example\n * ```typescript\n * try {\n * await client.invoices.create(invalidData);\n * } catch (error) {\n * if (error instanceof ScellValidationError) {\n * console.log('Validation errors:', error.errors);\n * }\n * }\n * ```\n */\nexport class ScellValidationError extends ScellError {\n /** Field-level validation errors */\n public readonly errors: Record<string, string[]>;\n\n constructor(\n message: string,\n errors: Record<string, string[]> = {},\n body?: unknown\n ) {\n super(message, 422, 'VALIDATION_ERROR', body);\n this.name = 'ScellValidationError';\n this.errors = errors;\n }\n\n /**\n * Get all error messages as a flat array\n */\n getAllMessages(): string[] {\n return Object.values(this.errors).flat();\n }\n\n /**\n * Get error messages for a specific field\n */\n getFieldErrors(field: string): string[] {\n return this.errors[field] ?? [];\n }\n\n /**\n * Check if a specific field has errors\n */\n hasFieldError(field: string): boolean {\n const fieldErrors = this.errors[field];\n return fieldErrors !== undefined && fieldErrors.length > 0;\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n *\n * @example\n * ```typescript\n * try {\n * await client.invoices.create(data);\n * } catch (error) {\n * if (error instanceof ScellRateLimitError) {\n * console.log(`Retry after ${error.retryAfter} seconds`);\n * }\n * }\n * ```\n */\nexport class ScellRateLimitError extends ScellError {\n /** Seconds to wait before retrying */\n public readonly retryAfter: number | undefined;\n\n constructor(\n message = 'Rate limit exceeded',\n retryAfter?: number,\n body?: unknown\n ) {\n super(message, 429, 'RATE_LIMIT_EXCEEDED', body);\n this.name = 'ScellRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error thrown when a resource is not found (404)\n */\nexport class ScellNotFoundError extends ScellError {\n constructor(message = 'Resource not found', body?: unknown) {\n super(message, 404, 'NOT_FOUND', body);\n this.name = 'ScellNotFoundError';\n }\n}\n\n/**\n * Error thrown when the API returns a server error (5xx)\n */\nexport class ScellServerError extends ScellError {\n constructor(\n message = 'Internal server error',\n status = 500,\n body?: unknown\n ) {\n super(message, status, 'SERVER_ERROR', body);\n this.name = 'ScellServerError';\n }\n}\n\n/**\n * Error thrown when insufficient balance for an operation\n */\nexport class ScellInsufficientBalanceError extends ScellError {\n constructor(message = 'Insufficient balance', body?: unknown) {\n super(message, 402, 'INSUFFICIENT_BALANCE', body);\n this.name = 'ScellInsufficientBalanceError';\n }\n}\n\n/**\n * Error thrown for network-related issues\n */\nexport class ScellNetworkError extends ScellError {\n public readonly originalError: Error;\n\n constructor(message: string, originalError: Error) {\n super(message, 0, 'NETWORK_ERROR');\n this.name = 'ScellNetworkError';\n this.originalError = originalError;\n }\n}\n\n/**\n * Error thrown when request times out\n */\nexport class ScellTimeoutError extends ScellError {\n constructor(message = 'Request timed out') {\n super(message, 0, 'TIMEOUT');\n this.name = 'ScellTimeoutError';\n }\n}\n\n/**\n * Parse API error response and throw appropriate error\n */\nexport function parseApiError(\n status: number,\n body: unknown,\n headers?: Headers\n): never {\n const errorBody = body as ApiErrorResponse | undefined;\n const message = errorBody?.message ?? 'Unknown error';\n const errors = errorBody?.errors ?? {};\n const code = errorBody?.code;\n\n switch (status) {\n case 401:\n throw new ScellAuthenticationError(message, body);\n case 402:\n throw new ScellInsufficientBalanceError(message, body);\n case 403:\n throw new ScellAuthorizationError(message, body);\n case 404:\n throw new ScellNotFoundError(message, body);\n case 422:\n throw new ScellValidationError(message, errors, body);\n case 429: {\n const retryAfter = headers?.get('Retry-After');\n throw new ScellRateLimitError(\n message,\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n body\n );\n }\n default:\n if (status >= 500) {\n throw new ScellServerError(message, status, body);\n }\n throw new ScellError(message, status, code, body);\n }\n}\n","/**\n * Scell HTTP Client\n *\n * @packageDocumentation\n */\n\nimport {\n parseApiError,\n ScellNetworkError,\n ScellTimeoutError,\n} from './errors.js';\nimport { withRetry, type RetryOptions } from './utils/retry.js';\n\n/**\n * Authentication mode\n */\nexport type AuthMode = 'bearer' | 'api-key';\n\n/**\n * Client configuration options\n */\nexport interface ClientConfig {\n /** Base URL for the API (default: https://api.scell.io/api/v1) */\n baseUrl?: string | undefined;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number | undefined;\n /** Retry configuration */\n retry?: RetryOptions | undefined;\n /** Enable automatic retries (default: true) */\n enableRetry?: boolean | undefined;\n /** Custom fetch implementation */\n fetch?: typeof fetch | undefined;\n}\n\n/**\n * Request options for individual requests\n */\nexport interface RequestOptions {\n /** Override timeout for this request */\n timeout?: number | undefined;\n /** Skip retry for this request */\n skipRetry?: boolean | undefined;\n /** Additional headers */\n headers?: Record<string, string> | undefined;\n /** Abort signal */\n signal?: AbortSignal | undefined;\n}\n\n/**\n * Internal request configuration\n */\ninterface InternalRequestConfig extends RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\n/**\n * HTTP client for Scell API\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly retryOptions: RetryOptions;\n private readonly enableRetry: boolean;\n private readonly fetchFn: typeof fetch;\n private readonly authMode: AuthMode;\n private readonly authToken: string;\n\n constructor(\n authMode: AuthMode,\n authToken: string,\n config: ClientConfig = {}\n ) {\n this.authMode = authMode;\n this.authToken = authToken;\n this.baseUrl = config.baseUrl ?? 'https://api.scell.io/api/v1';\n this.timeout = config.timeout ?? 30000;\n this.retryOptions = config.retry ?? {};\n this.enableRetry = config.enableRetry ?? true;\n this.fetchFn = config.fetch ?? fetch;\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): string {\n const url = new URL(path, this.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Build headers for request\n */\n private buildHeaders(\n additionalHeaders?: Record<string, string>\n ): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...additionalHeaders,\n };\n\n if (this.authMode === 'bearer') {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n } else {\n headers['X-API-Key'] = this.authToken;\n }\n\n return headers;\n }\n\n /**\n * Execute HTTP request\n */\n private async executeRequest<T>(config: InternalRequestConfig): Promise<T> {\n const { method, path, body, query, headers, timeout, signal } = config;\n\n const url = this.buildUrl(path, query);\n const requestHeaders = this.buildHeaders(headers);\n const requestTimeout = timeout ?? this.timeout;\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n // Combine signals if provided\n const combinedSignal = signal\n ? new AbortController().signal\n : controller.signal;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers: requestHeaders,\n signal: combinedSignal,\n };\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await this.fetchFn(url, fetchOptions);\n\n clearTimeout(timeoutId);\n\n // Parse response body\n const contentType = response.headers.get('Content-Type') ?? '';\n let responseBody: unknown;\n\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n // Handle errors\n if (!response.ok) {\n parseApiError(response.status, responseBody, response.headers);\n }\n\n return responseBody as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n // Handle abort/timeout\n if (error.name === 'AbortError') {\n throw new ScellTimeoutError(\n `Request timed out after ${requestTimeout}ms`\n );\n }\n\n // Handle network errors\n if (\n error.name === 'TypeError' &&\n error.message.includes('fetch')\n ) {\n throw new ScellNetworkError('Network request failed', error);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Execute request with optional retry\n */\n private async request<T>(config: InternalRequestConfig): Promise<T> {\n const shouldRetry = this.enableRetry && !config.skipRetry;\n\n if (shouldRetry) {\n return withRetry(\n () => this.executeRequest<T>(config),\n this.retryOptions\n );\n }\n\n return this.executeRequest<T>(config);\n }\n\n /**\n * GET request\n */\n async get<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n const config: InternalRequestConfig = {\n method: 'GET',\n path,\n ...options,\n };\n if (query !== undefined) {\n config.query = query;\n }\n return this.request<T>(config);\n }\n\n /**\n * POST request\n */\n async post<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n path,\n body,\n ...options,\n });\n }\n\n /**\n * PUT request\n */\n async put<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n path,\n body,\n ...options,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n path,\n body,\n ...options,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n path,\n ...options,\n });\n }\n\n /**\n * GET request that returns raw binary data as ArrayBuffer\n *\n * Use this for downloading files (PDF, XML, etc.)\n *\n * @param path - API endpoint path\n * @param query - Query parameters\n * @param options - Request options\n * @returns ArrayBuffer containing the file content\n */\n async getRaw(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<ArrayBuffer> {\n const url = this.buildUrl(path, query);\n const requestHeaders = this.buildHeaders(options?.headers);\n const requestTimeout = options?.timeout ?? this.timeout;\n\n // Remove JSON content-type for raw requests\n delete requestHeaders['Content-Type'];\n requestHeaders['Accept'] = '*/*';\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n if (options?.signal) {\n options.signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const response = await this.fetchFn(url, {\n method: 'GET',\n headers: requestHeaders,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // Try to parse error as JSON\n const contentType = response.headers.get('Content-Type') ?? '';\n let responseBody: unknown;\n\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n parseApiError(response.status, responseBody, response.headers);\n }\n\n return response.arrayBuffer();\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new ScellTimeoutError(\n `Request timed out after ${requestTimeout}ms`\n );\n }\n\n if (\n error.name === 'TypeError' &&\n error.message.includes('fetch')\n ) {\n throw new ScellNetworkError('Network request failed', error);\n }\n }\n\n throw error;\n }\n }\n}\n","/**\n * Retry utility with exponential backoff and jitter\n *\n * @packageDocumentation\n */\n\nimport { ScellRateLimitError, ScellServerError } from '../errors.js';\n\n/**\n * Retry configuration options\n */\nexport interface RetryOptions {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries?: number | undefined;\n /** Base delay in milliseconds (default: 1000) */\n baseDelay?: number | undefined;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelay?: number | undefined;\n /** Jitter factor (0-1, default: 0.1) */\n jitterFactor?: number | undefined;\n /** Custom function to determine if error is retryable */\n isRetryable?: ((error: unknown) => boolean) | undefined;\n}\n\n/**\n * Default retry options\n */\nconst DEFAULT_RETRY_OPTIONS: Required<Omit<RetryOptions, 'isRetryable'>> = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n jitterFactor: 0.1,\n};\n\n/**\n * Check if an error is retryable (429 or 5xx)\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof ScellRateLimitError) {\n return true;\n }\n if (error instanceof ScellServerError) {\n return true;\n }\n // Network errors are also retryable\n if (error instanceof Error && error.name === 'ScellNetworkError') {\n return true;\n }\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n *\n * @param attempt - Current attempt number (0-indexed)\n * @param baseDelay - Base delay in milliseconds\n * @param maxDelay - Maximum delay in milliseconds\n * @param jitterFactor - Jitter factor (0-1)\n * @param retryAfter - Optional retry-after header value in seconds\n * @returns Delay in milliseconds\n */\nexport function calculateDelay(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n jitterFactor: number,\n retryAfter?: number\n): number {\n // If we have a retry-after header, use it\n if (retryAfter !== undefined && retryAfter > 0) {\n return retryAfter * 1000;\n }\n\n // Exponential backoff: baseDelay * 2^attempt\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n\n // Cap at maxDelay\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n\n // Add jitter: delay * (1 +/- jitterFactor * random)\n const jitter = cappedDelay * jitterFactor * (Math.random() * 2 - 1);\n\n return Math.floor(cappedDelay + jitter);\n}\n\n/**\n * Sleep for a specified duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Execute a function with retry logic\n *\n * @param fn - Async function to execute\n * @param options - Retry options\n * @returns Result of the function\n *\n * @example\n * ```typescript\n * const result = await withRetry(\n * () => client.invoices.create(data),\n * { maxRetries: 5 }\n * );\n * ```\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const maxRetries = options.maxRetries ?? DEFAULT_RETRY_OPTIONS.maxRetries;\n const baseDelay = options.baseDelay ?? DEFAULT_RETRY_OPTIONS.baseDelay;\n const maxDelay = options.maxDelay ?? DEFAULT_RETRY_OPTIONS.maxDelay;\n const jitterFactor = options.jitterFactor ?? DEFAULT_RETRY_OPTIONS.jitterFactor;\n const isRetryable = options.isRetryable ?? isRetryableError;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if we should retry\n if (attempt >= maxRetries || !isRetryable(error)) {\n throw error;\n }\n\n // Get retry-after header if available\n const retryAfter: number | undefined =\n error instanceof ScellRateLimitError ? error.retryAfter : undefined;\n\n // Calculate delay\n const delay = calculateDelay(\n attempt,\n baseDelay,\n maxDelay,\n jitterFactor,\n retryAfter\n );\n\n // Wait before retrying\n await sleep(delay);\n }\n }\n\n // This should never be reached, but TypeScript needs it\n throw lastError;\n}\n\n/**\n * Create a retry wrapper with pre-configured options\n *\n * @example\n * ```typescript\n * const retry = createRetryWrapper({ maxRetries: 5 });\n * const result = await retry(() => client.invoices.create(data));\n * ```\n */\nexport function createRetryWrapper(\n defaultOptions: RetryOptions = {}\n): <T>(fn: () => Promise<T>, options?: RetryOptions) => Promise<T> {\n return <T>(fn: () => Promise<T>, options: RetryOptions = {}) =>\n withRetry(fn, { ...defaultOptions, ...options });\n}\n","/**\n * API Keys Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyInput,\n} from '../types/api-keys.js';\n\n/**\n * API Keys resource\n *\n * @example\n * ```typescript\n * // Create an API key for a company\n * const apiKey = await client.apiKeys.create({\n * name: 'Production Key',\n * company_id: 'company-uuid',\n * environment: 'production'\n * });\n *\n * // Store the key securely!\n * console.log('API Key:', apiKey.key);\n * ```\n */\nexport class ApiKeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all API keys\n *\n * @param requestOptions - Request options\n * @returns List of API keys (without secrets)\n *\n * @example\n * ```typescript\n * const { data: keys } = await client.apiKeys.list();\n * keys.forEach(key => {\n * console.log(`${key.name}: ${key.key_prefix}...`);\n * });\n * ```\n */\n async list(requestOptions?: RequestOptions): Promise<{ data: ApiKey[] }> {\n return this.http.get<{ data: ApiKey[] }>(\n '/api-keys',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get a specific API key\n *\n * @param id - API Key UUID\n * @param requestOptions - Request options\n * @returns API key details (without secret)\n *\n * @example\n * ```typescript\n * const { data: key } = await client.apiKeys.get('key-uuid');\n * console.log(`Last used: ${key.last_used_at}`);\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<ApiKey>> {\n return this.http.get<SingleResponse<ApiKey>>(\n `/api-keys/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new API key\n *\n * Important: The full key is only returned once during creation.\n * Store it securely - you won't be able to retrieve it again.\n *\n * @param input - API key configuration\n * @param requestOptions - Request options\n * @returns Created API key with full key value\n *\n * @example\n * ```typescript\n * const { data: apiKey } = await client.apiKeys.create({\n * name: 'Production Integration',\n * company_id: 'company-uuid',\n * environment: 'production',\n * permissions: ['invoices:write', 'signatures:write']\n * });\n *\n * // IMPORTANT: Store this key securely!\n * // You won't be able to see it again.\n * console.log('Save this key:', apiKey.key);\n * ```\n */\n async create(\n input: CreateApiKeyInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<ApiKeyWithSecret>> {\n return this.http.post<MessageWithDataResponse<ApiKeyWithSecret>>(\n '/api-keys',\n input,\n requestOptions\n );\n }\n\n /**\n * Delete an API key\n *\n * Warning: This will immediately revoke the key and all\n * requests using it will fail.\n *\n * @param id - API Key UUID\n * @param requestOptions - Request options\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.apiKeys.delete('key-uuid');\n * console.log('API key revoked');\n * ```\n */\n async delete(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.delete<MessageResponse>(`/api-keys/${id}`, requestOptions);\n }\n}\n","/**\n * Auth Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type { MessageResponse, SingleResponse } from '../types/common.js';\nimport type {\n AuthResponse,\n ForgotPasswordInput,\n LoginCredentials,\n RegisterInput,\n ResetPasswordInput,\n User,\n} from '../types/auth.js';\n\n/**\n * Auth API resource\n *\n * Note: Most auth endpoints are only used during initial setup.\n * After login, use the returned token to create a ScellClient.\n *\n * @example\n * ```typescript\n * // Login and get token\n * const auth = await ScellAuth.login({\n * email: 'user@example.com',\n * password: 'password'\n * });\n *\n * // Create client with token\n * const client = new ScellClient(auth.token);\n *\n * // Get current user\n * const user = await client.auth.me();\n * ```\n */\nexport class AuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current authenticated user\n *\n * @param requestOptions - Request options\n * @returns Current user details\n *\n * @example\n * ```typescript\n * const { data: user } = await client.auth.me();\n * console.log(`Logged in as: ${user.name} (${user.email})`);\n * ```\n */\n async me(requestOptions?: RequestOptions): Promise<SingleResponse<User>> {\n return this.http.get<SingleResponse<User>>(\n '/auth/me',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Logout (revoke current token)\n *\n * @param requestOptions - Request options\n * @returns Logout confirmation\n *\n * @example\n * ```typescript\n * await client.auth.logout();\n * // Token is now invalid\n * ```\n */\n async logout(requestOptions?: RequestOptions): Promise<MessageResponse> {\n return this.http.post<MessageResponse>(\n '/auth/logout',\n undefined,\n requestOptions\n );\n }\n}\n\n/**\n * Static auth methods (don't require authentication)\n *\n * @example\n * ```typescript\n * import { ScellAuth } from '@scell/sdk';\n *\n * // Register new user\n * const auth = await ScellAuth.register({\n * name: 'John Doe',\n * email: 'john@example.com',\n * password: 'securepassword123',\n * password_confirmation: 'securepassword123'\n * });\n *\n * // Login existing user\n * const auth = await ScellAuth.login({\n * email: 'john@example.com',\n * password: 'securepassword123'\n * });\n *\n * // Use the token\n * const client = new ScellClient(auth.token);\n * ```\n */\nexport const ScellAuth = {\n /**\n * Default base URL for auth requests\n */\n baseUrl: 'https://api.scell.io/api/v1',\n\n /**\n * Register a new user\n *\n * @param input - Registration data\n * @param baseUrl - Optional base URL override\n * @returns Auth response with token\n *\n * @example\n * ```typescript\n * const auth = await ScellAuth.register({\n * name: 'Jane Doe',\n * email: 'jane@example.com',\n * password: 'MySecurePassword123!',\n * password_confirmation: 'MySecurePassword123!'\n * });\n *\n * console.log('Welcome,', auth.user.name);\n * const client = new ScellClient(auth.token);\n * ```\n */\n async register(\n input: RegisterInput,\n baseUrl?: string\n ): Promise<AuthResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/register`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(input),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as AuthResponse;\n },\n\n /**\n * Login an existing user\n *\n * @param credentials - Login credentials\n * @param baseUrl - Optional base URL override\n * @returns Auth response with token\n *\n * @example\n * ```typescript\n * const auth = await ScellAuth.login({\n * email: 'user@example.com',\n * password: 'password'\n * });\n *\n * // Store the token securely\n * localStorage.setItem('scell_token', auth.token);\n *\n * // Create client\n * const client = new ScellClient(auth.token);\n * ```\n */\n async login(\n credentials: LoginCredentials,\n baseUrl?: string\n ): Promise<AuthResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/login`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(credentials),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as AuthResponse;\n },\n\n /**\n * Request password reset email\n *\n * @param input - Email address\n * @param baseUrl - Optional base URL override\n * @returns Confirmation message\n *\n * @example\n * ```typescript\n * await ScellAuth.forgotPassword({\n * email: 'user@example.com'\n * });\n * console.log('Check your email for reset link');\n * ```\n */\n async forgotPassword(\n input: ForgotPasswordInput,\n baseUrl?: string\n ): Promise<MessageResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/forgot-password`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(input),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as MessageResponse;\n },\n\n /**\n * Reset password with token from email\n *\n * @param input - Reset password data\n * @param baseUrl - Optional base URL override\n * @returns Confirmation message\n *\n * @example\n * ```typescript\n * await ScellAuth.resetPassword({\n * email: 'user@example.com',\n * token: 'reset-token-from-email',\n * password: 'NewSecurePassword123!',\n * password_confirmation: 'NewSecurePassword123!'\n * });\n * ```\n */\n async resetPassword(\n input: ResetPasswordInput,\n baseUrl?: string\n ): Promise<MessageResponse> {\n const url = `${baseUrl ?? this.baseUrl}/auth/reset-password`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(input),\n });\n\n const body = await response.json();\n\n if (!response.ok) {\n const { parseApiError } = await import('../errors.js');\n parseApiError(response.status, body, response.headers);\n }\n\n return body as MessageResponse;\n },\n};\n","/**\n * Balance Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageWithDataResponse,\n PaginatedResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n Balance,\n ReloadBalanceInput,\n ReloadBalanceResponse,\n Transaction,\n TransactionListOptions,\n UpdateBalanceSettingsInput,\n} from '../types/balance.js';\n\n/**\n * Balance API resource\n *\n * @example\n * ```typescript\n * // Check balance\n * const balance = await client.balance.get();\n * console.log(`Current balance: ${balance.amount} ${balance.currency}`);\n *\n * // Reload balance\n * await client.balance.reload({ amount: 100 });\n *\n * // View transactions\n * const transactions = await client.balance.transactions({\n * type: 'debit',\n * service: 'invoice'\n * });\n * ```\n */\nexport class BalanceResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current balance and settings\n *\n * @param requestOptions - Request options\n * @returns Current balance details\n *\n * @example\n * ```typescript\n * const { data: balance } = await client.balance.get();\n * console.log(`Balance: ${balance.amount} ${balance.currency}`);\n *\n * if (balance.amount < balance.low_balance_alert_threshold) {\n * console.log('Warning: Low balance!');\n * }\n * ```\n */\n async get(requestOptions?: RequestOptions): Promise<SingleResponse<Balance>> {\n return this.http.get<SingleResponse<Balance>>(\n '/balance',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Reload balance\n *\n * Note: This is a simulation endpoint. In production, use Stripe integration.\n *\n * @param input - Reload amount (10-10000 EUR)\n * @param requestOptions - Request options\n * @returns Reload transaction details\n *\n * @example\n * ```typescript\n * const { transaction } = await client.balance.reload({ amount: 100 });\n * console.log(`New balance: ${transaction.balance_after}`);\n * ```\n */\n async reload(\n input: ReloadBalanceInput,\n requestOptions?: RequestOptions\n ): Promise<ReloadBalanceResponse> {\n return this.http.post<ReloadBalanceResponse>(\n '/balance/reload',\n input,\n requestOptions\n );\n }\n\n /**\n * Update balance settings\n *\n * Configure auto-reload and alert thresholds.\n *\n * @param input - Settings to update\n * @param requestOptions - Request options\n * @returns Updated settings\n *\n * @example\n * ```typescript\n * await client.balance.updateSettings({\n * auto_reload_enabled: true,\n * auto_reload_threshold: 50,\n * auto_reload_amount: 200,\n * low_balance_alert_threshold: 100,\n * critical_balance_alert_threshold: 25\n * });\n * ```\n */\n async updateSettings(\n input: UpdateBalanceSettingsInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Partial<Balance>>> {\n return this.http.put<MessageWithDataResponse<Partial<Balance>>>(\n '/balance/settings',\n input,\n requestOptions\n );\n }\n\n /**\n * List balance transactions\n *\n * @param options - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of transactions\n *\n * @example\n * ```typescript\n * // List all invoice debits\n * const { data, meta } = await client.balance.transactions({\n * type: 'debit',\n * service: 'invoice',\n * from: '2024-01-01',\n * to: '2024-01-31'\n * });\n *\n * data.forEach(tx => {\n * console.log(`${tx.description}: -${tx.amount} EUR`);\n * });\n * ```\n */\n async transactions(\n options: TransactionListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Transaction>> {\n return this.http.get<PaginatedResponse<Transaction>>(\n '/balance/transactions',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n}\n","/**\n * Companies Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n Company,\n CreateCompanyInput,\n KycInitiateResponse,\n KycStatusResponse,\n UpdateCompanyInput,\n} from '../types/companies.js';\n\n/**\n * Companies API resource\n *\n * @example\n * ```typescript\n * // Create a company\n * const company = await client.companies.create({\n * name: 'My Company',\n * siret: '12345678901234',\n * address_line1: '1 Rue de la Paix',\n * postal_code: '75001',\n * city: 'Paris'\n * });\n *\n * // Initiate KYC\n * const kyc = await client.companies.initiateKyc(company.id);\n * console.log('KYC URL:', kyc.redirect_url);\n * ```\n */\nexport class CompaniesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all companies for the authenticated user\n *\n * @param requestOptions - Request options\n * @returns List of companies\n *\n * @example\n * ```typescript\n * const { data: companies } = await client.companies.list();\n * companies.forEach(c => console.log(c.name, c.status));\n * ```\n */\n async list(\n requestOptions?: RequestOptions\n ): Promise<{ data: Company[] }> {\n return this.http.get<{ data: Company[] }>(\n '/companies',\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get a specific company by ID\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns Company details\n *\n * @example\n * ```typescript\n * const { data: company } = await client.companies.get('uuid');\n * console.log(company.name, company.siret);\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Company>> {\n return this.http.get<SingleResponse<Company>>(\n `/companies/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new company\n *\n * @param input - Company creation data\n * @param requestOptions - Request options\n * @returns Created company\n *\n * @example\n * ```typescript\n * const { data: company } = await client.companies.create({\n * name: 'Acme Corp',\n * siret: '12345678901234',\n * vat_number: 'FR12345678901',\n * legal_form: 'SAS',\n * address_line1: '123 Business Street',\n * postal_code: '75001',\n * city: 'Paris',\n * country: 'FR',\n * email: 'contact@acme.com',\n * phone: '+33 1 23 45 67 89'\n * });\n * ```\n */\n async create(\n input: CreateCompanyInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Company>> {\n return this.http.post<MessageWithDataResponse<Company>>(\n '/companies',\n input,\n requestOptions\n );\n }\n\n /**\n * Update a company\n *\n * @param id - Company UUID\n * @param input - Fields to update\n * @param requestOptions - Request options\n * @returns Updated company\n *\n * @example\n * ```typescript\n * const { data: company } = await client.companies.update('uuid', {\n * email: 'new-email@acme.com',\n * phone: '+33 1 98 76 54 32'\n * });\n * ```\n */\n async update(\n id: string,\n input: UpdateCompanyInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Company>> {\n return this.http.put<MessageWithDataResponse<Company>>(\n `/companies/${id}`,\n input,\n requestOptions\n );\n }\n\n /**\n * Delete a company\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.companies.delete('company-uuid');\n * ```\n */\n async delete(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.delete<MessageResponse>(\n `/companies/${id}`,\n requestOptions\n );\n }\n\n /**\n * Initiate KYC verification for a company\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns KYC reference and redirect URL\n *\n * @example\n * ```typescript\n * const { kyc_reference, redirect_url } = await client.companies.initiateKyc(\n * 'company-uuid'\n * );\n * // Redirect user to redirect_url for KYC verification\n * ```\n */\n async initiateKyc(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<KycInitiateResponse> {\n return this.http.post<KycInitiateResponse>(\n `/companies/${id}/kyc`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get KYC verification status\n *\n * @param id - Company UUID\n * @param requestOptions - Request options\n * @returns Current KYC status\n *\n * @example\n * ```typescript\n * const status = await client.companies.kycStatus('company-uuid');\n * if (status.status === 'active') {\n * console.log('KYC completed at:', status.kyc_completed_at);\n * }\n * ```\n */\n async kycStatus(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<KycStatusResponse> {\n return this.http.get<KycStatusResponse>(\n `/companies/${id}/kyc/status`,\n undefined,\n requestOptions\n );\n }\n}\n","/**\n * Invoices Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageWithDataResponse,\n PaginatedResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n AcceptInvoiceInput,\n AuditTrailResponse,\n ConvertInvoiceInput,\n CreateInvoiceInput,\n DisputeInvoiceInput,\n IncomingInvoiceParams,\n Invoice,\n InvoiceDownloadResponse,\n InvoiceDownloadType,\n InvoiceFileFormat,\n InvoiceListOptions,\n MarkPaidInput,\n RejectInvoiceInput,\n} from '../types/invoices.js';\n\n/**\n * Invoices API resource\n *\n * @example\n * ```typescript\n * // List invoices\n * const invoices = await client.invoices.list({\n * direction: 'outgoing',\n * status: 'validated'\n * });\n *\n * // Create an invoice\n * const invoice = await client.invoices.create({\n * invoice_number: 'FACT-2024-001',\n * direction: 'outgoing',\n * output_format: 'facturx',\n * // ...\n * });\n *\n * // Download invoice\n * const download = await client.invoices.download(invoice.id, 'pdf');\n * console.log('Download URL:', download.url);\n * ```\n */\nexport class InvoicesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List invoices with optional filtering\n *\n * @param options - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of invoices\n *\n * @example\n * ```typescript\n * // List all outgoing invoices\n * const { data, meta } = await client.invoices.list({\n * direction: 'outgoing',\n * per_page: 50\n * });\n * console.log(`Found ${meta.total} invoices`);\n * ```\n */\n async list(\n options: InvoiceListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Invoice>> {\n return this.http.get<PaginatedResponse<Invoice>>(\n '/invoices',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Get a specific invoice by ID\n *\n * @param id - Invoice UUID\n * @param requestOptions - Request options\n * @returns Invoice details\n *\n * @example\n * ```typescript\n * const { data: invoice } = await client.invoices.get('uuid-here');\n * console.log('Invoice number:', invoice.invoice_number);\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Invoice>> {\n return this.http.get<SingleResponse<Invoice>>(\n `/invoices/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new invoice\n *\n * Note: This endpoint requires API key authentication.\n * Creating an invoice in production mode will debit your balance.\n *\n * @param input - Invoice creation data\n * @param requestOptions - Request options\n * @returns Created invoice\n *\n * @example\n * ```typescript\n * const { data: invoice } = await client.invoices.create({\n * invoice_number: 'FACT-2024-001',\n * direction: 'outgoing',\n * output_format: 'facturx',\n * issue_date: '2024-01-15',\n * total_ht: 100.00,\n * total_tax: 20.00,\n * total_ttc: 120.00,\n * seller_siret: '12345678901234',\n * seller_name: 'My Company',\n * seller_address: {\n * line1: '1 Rue Example',\n * postal_code: '75001',\n * city: 'Paris',\n * country: 'FR'\n * },\n * buyer_siret: '98765432109876',\n * buyer_name: 'Client Company',\n * buyer_address: {\n * line1: '2 Avenue Test',\n * postal_code: '75002',\n * city: 'Paris',\n * country: 'FR'\n * },\n * lines: [{\n * description: 'Service prestation',\n * quantity: 1,\n * unit_price: 100.00,\n * tax_rate: 20.00,\n * total_ht: 100.00,\n * total_tax: 20.00,\n * total_ttc: 120.00\n * }]\n * });\n * ```\n */\n async create(\n input: CreateInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Invoice>> {\n return this.http.post<MessageWithDataResponse<Invoice>>(\n '/invoices',\n input,\n requestOptions\n );\n }\n\n /**\n * Download invoice file\n *\n * @param id - Invoice UUID\n * @param type - File type to download\n * @param requestOptions - Request options\n * @returns Temporary download URL\n *\n * @example\n * ```typescript\n * // Download PDF version\n * const { url, expires_at } = await client.invoices.download(\n * 'invoice-uuid',\n * 'pdf'\n * );\n * console.log('Download before:', expires_at);\n * ```\n */\n async download(\n id: string,\n type: InvoiceDownloadType,\n requestOptions?: RequestOptions\n ): Promise<InvoiceDownloadResponse> {\n return this.http.get<InvoiceDownloadResponse>(\n `/invoices/${id}/download/${type}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get invoice audit trail (Piste d'Audit Fiable)\n *\n * @param id - Invoice UUID\n * @param requestOptions - Request options\n * @returns Audit trail entries with integrity validation\n *\n * @example\n * ```typescript\n * const { data: entries, integrity_valid } = await client.invoices.auditTrail(\n * 'invoice-uuid'\n * );\n *\n * if (integrity_valid) {\n * console.log('Audit trail is valid');\n * entries.forEach(e => console.log(e.action, e.created_at));\n * }\n * ```\n */\n async auditTrail(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<AuditTrailResponse> {\n return this.http.get<AuditTrailResponse>(\n `/invoices/${id}/audit-trail`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Convert invoice to another format\n *\n * @param input - Conversion parameters\n * @param requestOptions - Request options\n * @returns Conversion status\n *\n * @example\n * ```typescript\n * await client.invoices.convert({\n * invoice_id: 'invoice-uuid',\n * target_format: 'ubl'\n * });\n * ```\n */\n async convert(\n input: ConvertInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<{ message: string; invoice_id: string; target_format: string }> {\n return this.http.post<{\n message: string;\n invoice_id: string;\n target_format: string;\n }>('/invoices/convert', input, requestOptions);\n }\n\n /**\n * List incoming invoices (from suppliers)\n *\n * Returns invoices where your company is the buyer.\n *\n * @param params - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of incoming invoices\n *\n * @example\n * ```typescript\n * // List all incoming invoices\n * const { data, meta } = await client.invoices.incoming({\n * status: 'pending',\n * per_page: 50\n * });\n * console.log(`Found ${meta.total} incoming invoices`);\n *\n * // Filter by seller\n * const fromSupplier = await client.invoices.incoming({\n * seller_siret: '12345678901234'\n * });\n * ```\n */\n async incoming(\n params: IncomingInvoiceParams = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Invoice>> {\n return this.http.get<PaginatedResponse<Invoice>>(\n '/invoices/incoming',\n params as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Accept an incoming invoice\n *\n * Mark an incoming invoice as accepted, optionally specifying a payment date.\n *\n * @param id - Invoice UUID\n * @param data - Optional acceptance data\n * @param requestOptions - Request options\n * @returns Updated invoice\n *\n * @example\n * ```typescript\n * // Accept with payment date\n * const { data: invoice } = await client.invoices.accept('invoice-uuid', {\n * payment_date: '2024-02-15',\n * note: 'Approved by accounting'\n * });\n *\n * // Simple acceptance\n * await client.invoices.accept('invoice-uuid');\n * ```\n */\n async accept(\n id: string,\n data?: AcceptInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Invoice>> {\n return this.http.post<SingleResponse<Invoice>>(\n `/invoices/${id}/accept`,\n data,\n requestOptions\n );\n }\n\n /**\n * Reject an incoming invoice\n *\n * Mark an incoming invoice as rejected with a reason.\n *\n * @param id - Invoice UUID\n * @param data - Rejection details\n * @param requestOptions - Request options\n * @returns Updated invoice\n *\n * @example\n * ```typescript\n * const { data: invoice } = await client.invoices.reject('invoice-uuid', {\n * reason: 'Invoice amount does not match purchase order',\n * reason_code: 'incorrect_amount'\n * });\n * ```\n */\n async reject(\n id: string,\n data: RejectInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Invoice>> {\n return this.http.post<SingleResponse<Invoice>>(\n `/invoices/${id}/reject`,\n data,\n requestOptions\n );\n }\n\n /**\n * Dispute an incoming invoice\n *\n * Open a dispute on an incoming invoice for resolution.\n *\n * @param id - Invoice UUID\n * @param data - Dispute details\n * @param requestOptions - Request options\n * @returns Updated invoice\n *\n * @example\n * ```typescript\n * const { data: invoice } = await client.invoices.dispute('invoice-uuid', {\n * reason: 'Billed amount exceeds agreed price',\n * dispute_type: 'amount_dispute',\n * expected_amount: 950.00\n * });\n * ```\n */\n async dispute(\n id: string,\n data: DisputeInvoiceInput,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Invoice>> {\n return this.http.post<SingleResponse<Invoice>>(\n `/invoices/${id}/dispute`,\n data,\n requestOptions\n );\n }\n\n /**\n * Mark an incoming invoice as paid\n *\n * This is a mandatory step in the French e-invoicing lifecycle for incoming invoices.\n * Once marked as paid, the invoice status changes to 'paid' and payment details are recorded.\n *\n * @param id - Invoice UUID\n * @param data - Optional payment details (reference, date, note)\n * @param requestOptions - Request options\n * @returns Updated invoice with payment information\n *\n * @example\n * ```typescript\n * // Mark as paid with payment details\n * const { data: invoice } = await client.invoices.markPaid('invoice-uuid', {\n * payment_reference: 'VIR-2026-0124',\n * paid_at: '2026-01-24T10:30:00Z',\n * note: 'Payment received via bank transfer'\n * });\n *\n * // Simple mark as paid (uses current date/time)\n * await client.invoices.markPaid('invoice-uuid');\n * ```\n */\n async markPaid(\n id: string,\n data?: MarkPaidInput,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Invoice>> {\n return this.http.post<SingleResponse<Invoice>>(\n `/invoices/${id}/mark-paid`,\n data,\n requestOptions\n );\n }\n\n /**\n * Download invoice source file as binary content\n *\n * Downloads the original invoice file (PDF with embedded XML for Factur-X,\n * or standalone XML for UBL/CII formats).\n *\n * @param id - Invoice UUID\n * @param format - File format to download: 'pdf' (default) or 'xml'\n * @param requestOptions - Request options\n * @returns ArrayBuffer containing the file content\n *\n * @example\n * ```typescript\n * // Download invoice as PDF (Factur-X)\n * const pdfBuffer = await client.invoices.downloadFile('invoice-uuid');\n *\n * // In Node.js, save to file:\n * import { writeFileSync } from 'fs';\n * writeFileSync('invoice.pdf', Buffer.from(pdfBuffer));\n *\n * // Download XML version (UBL/CII)\n * const xmlBuffer = await client.invoices.downloadFile('invoice-uuid', 'xml');\n * writeFileSync('invoice.xml', Buffer.from(xmlBuffer));\n *\n * // In browser, trigger download:\n * const blob = new Blob([pdfBuffer], { type: 'application/pdf' });\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'invoice.pdf';\n * a.click();\n * ```\n */\n async downloadFile(\n id: string,\n format: InvoiceFileFormat = 'pdf',\n requestOptions?: RequestOptions\n ): Promise<ArrayBuffer> {\n return this.http.getRaw(\n `/invoices/${id}/download`,\n { format },\n requestOptions\n );\n }\n}\n","/**\n * Signatures Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n PaginatedResponse,\n SingleResponse,\n} from '../types/common.js';\nimport type {\n CreateSignatureInput,\n Signature,\n SignatureDownloadResponse,\n SignatureDownloadType,\n SignatureListOptions,\n SignatureRemindResponse,\n} from '../types/signatures.js';\n\n/**\n * Signatures API resource\n *\n * @example\n * ```typescript\n * // Create a signature request\n * const signature = await client.signatures.create({\n * title: 'Employment Contract',\n * document: btoa(pdfContent), // Base64 encoded\n * document_name: 'contract.pdf',\n * signers: [{\n * first_name: 'John',\n * last_name: 'Doe',\n * email: 'john@example.com',\n * auth_method: 'email'\n * }]\n * });\n *\n * // Send reminder\n * await client.signatures.remind(signature.id);\n * ```\n */\nexport class SignaturesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List signature requests with optional filtering\n *\n * @param options - Filter and pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of signatures\n *\n * @example\n * ```typescript\n * const { data, meta } = await client.signatures.list({\n * status: 'pending',\n * per_page: 25\n * });\n * console.log(`${meta.total} pending signatures`);\n * ```\n */\n async list(\n options: SignatureListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<Signature>> {\n return this.http.get<PaginatedResponse<Signature>>(\n '/signatures',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Get a specific signature by ID\n *\n * @param id - Signature UUID\n * @param requestOptions - Request options\n * @returns Signature details with signers\n *\n * @example\n * ```typescript\n * const { data: signature } = await client.signatures.get('uuid-here');\n * signature.signers?.forEach(signer => {\n * console.log(`${signer.full_name}: ${signer.status}`);\n * });\n * ```\n */\n async get(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SingleResponse<Signature>> {\n return this.http.get<SingleResponse<Signature>>(\n `/signatures/${id}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Create a new signature request\n *\n * Note: This endpoint requires API key authentication.\n * Creating a signature in production mode will debit your balance.\n *\n * @param input - Signature creation data\n * @param requestOptions - Request options\n * @returns Created signature\n *\n * @example\n * ```typescript\n * import { readFileSync } from 'fs';\n *\n * const pdfContent = readFileSync('contract.pdf');\n * const { data: signature } = await client.signatures.create({\n * title: 'Service Agreement',\n * description: 'Annual service contract',\n * document: pdfContent.toString('base64'),\n * document_name: 'contract.pdf',\n * signers: [\n * {\n * first_name: 'Alice',\n * last_name: 'Smith',\n * email: 'alice@example.com',\n * auth_method: 'email'\n * },\n * {\n * first_name: 'Bob',\n * last_name: 'Jones',\n * phone: '+33612345678',\n * auth_method: 'sms'\n * }\n * ],\n * ui_config: {\n * logo_url: 'https://mycompany.com/logo.png',\n * primary_color: '#3b82f6',\n * company_name: 'My Company'\n * },\n * redirect_complete_url: 'https://myapp.com/signed',\n * redirect_cancel_url: 'https://myapp.com/cancelled'\n * });\n *\n * // Send signing URLs to signers\n * signature.signers?.forEach(signer => {\n * console.log(`${signer.email}: ${signer.signing_url}`);\n * });\n * ```\n */\n async create(\n input: CreateSignatureInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Signature>> {\n return this.http.post<MessageWithDataResponse<Signature>>(\n '/signatures',\n input,\n requestOptions\n );\n }\n\n /**\n * Download signature files\n *\n * @param id - Signature UUID\n * @param type - File type to download\n * @param requestOptions - Request options\n * @returns Temporary download URL\n *\n * @example\n * ```typescript\n * // Download signed document\n * const { url } = await client.signatures.download(\n * 'signature-uuid',\n * 'signed'\n * );\n *\n * // Download audit trail (proof file)\n * const { url: auditUrl } = await client.signatures.download(\n * 'signature-uuid',\n * 'audit_trail'\n * );\n * ```\n */\n async download(\n id: string,\n type: SignatureDownloadType,\n requestOptions?: RequestOptions\n ): Promise<SignatureDownloadResponse> {\n return this.http.get<SignatureDownloadResponse>(\n `/signatures/${id}/download/${type}`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Send reminder to pending signers\n *\n * @param id - Signature UUID\n * @param requestOptions - Request options\n * @returns Number of signers reminded\n *\n * @example\n * ```typescript\n * const { signers_reminded } = await client.signatures.remind('uuid');\n * console.log(`Reminded ${signers_reminded} signers`);\n * ```\n */\n async remind(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<SignatureRemindResponse> {\n return this.http.post<SignatureRemindResponse>(\n `/signatures/${id}/remind`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Cancel a signature request\n *\n * Note: Cannot cancel completed signatures.\n *\n * @param id - Signature UUID\n * @param requestOptions - Request options\n * @returns Cancellation confirmation\n *\n * @example\n * ```typescript\n * await client.signatures.cancel('signature-uuid');\n * console.log('Signature cancelled');\n * ```\n */\n async cancel(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.post<MessageResponse>(\n `/signatures/${id}/cancel`,\n undefined,\n requestOptions\n );\n }\n}\n","/**\n * Webhooks Resource\n *\n * @packageDocumentation\n */\n\nimport type { HttpClient, RequestOptions } from '../client.js';\nimport type {\n MessageResponse,\n MessageWithDataResponse,\n PaginatedResponse,\n} from '../types/common.js';\nimport type {\n CreateWebhookInput,\n UpdateWebhookInput,\n Webhook,\n WebhookListOptions,\n WebhookLog,\n WebhookTestResponse,\n WebhookWithSecret,\n} from '../types/webhooks.js';\n\n/**\n * Webhooks API resource\n *\n * @example\n * ```typescript\n * // Create a webhook\n * const webhook = await client.webhooks.create({\n * url: 'https://myapp.com/webhooks/scell',\n * events: ['invoice.validated', 'signature.completed'],\n * environment: 'production'\n * });\n *\n * // Store the secret securely!\n * console.log('Webhook secret:', webhook.secret);\n *\n * // Test the webhook\n * const test = await client.webhooks.test(webhook.id);\n * console.log('Test success:', test.success);\n * ```\n */\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all webhooks\n *\n * @param options - Filter options\n * @param requestOptions - Request options\n * @returns List of webhooks\n *\n * @example\n * ```typescript\n * const { data: webhooks } = await client.webhooks.list();\n * webhooks.forEach(wh => {\n * console.log(`${wh.url}: ${wh.is_active ? 'active' : 'inactive'}`);\n * });\n * ```\n */\n async list(\n options: WebhookListOptions = {},\n requestOptions?: RequestOptions\n ): Promise<{ data: Webhook[] }> {\n return this.http.get<{ data: Webhook[] }>(\n '/webhooks',\n options as Record<string, string | number | boolean | undefined>,\n requestOptions\n );\n }\n\n /**\n * Create a new webhook\n *\n * Important: The secret is only returned once during creation.\n * Store it securely - you'll need it to verify webhook signatures.\n *\n * @param input - Webhook configuration\n * @param requestOptions - Request options\n * @returns Created webhook with secret\n *\n * @example\n * ```typescript\n * const { data: webhook } = await client.webhooks.create({\n * url: 'https://myapp.com/webhooks/scell',\n * events: [\n * 'invoice.created',\n * 'invoice.validated',\n * 'signature.completed',\n * 'balance.low'\n * ],\n * environment: 'production',\n * headers: {\n * 'X-Custom-Auth': 'my-secret-token'\n * },\n * retry_count: 5,\n * timeout_seconds: 30\n * });\n *\n * // IMPORTANT: Store this secret securely!\n * await saveWebhookSecret(webhook.id, webhook.secret);\n * ```\n */\n async create(\n input: CreateWebhookInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<WebhookWithSecret>> {\n return this.http.post<MessageWithDataResponse<WebhookWithSecret>>(\n '/webhooks',\n input,\n requestOptions\n );\n }\n\n /**\n * Update a webhook\n *\n * @param id - Webhook UUID\n * @param input - Fields to update\n * @param requestOptions - Request options\n * @returns Updated webhook\n *\n * @example\n * ```typescript\n * // Disable a webhook temporarily\n * await client.webhooks.update('webhook-uuid', {\n * is_active: false\n * });\n *\n * // Update events\n * await client.webhooks.update('webhook-uuid', {\n * events: ['invoice.validated', 'signature.completed']\n * });\n * ```\n */\n async update(\n id: string,\n input: UpdateWebhookInput,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<Webhook>> {\n return this.http.put<MessageWithDataResponse<Webhook>>(\n `/webhooks/${id}`,\n input,\n requestOptions\n );\n }\n\n /**\n * Delete a webhook\n *\n * @param id - Webhook UUID\n * @param requestOptions - Request options\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.webhooks.delete('webhook-uuid');\n * ```\n */\n async delete(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageResponse> {\n return this.http.delete<MessageResponse>(`/webhooks/${id}`, requestOptions);\n }\n\n /**\n * Regenerate webhook secret\n *\n * Use this if your secret has been compromised.\n * The old secret will immediately stop working.\n *\n * @param id - Webhook UUID\n * @param requestOptions - Request options\n * @returns Webhook with new secret\n *\n * @example\n * ```typescript\n * const { data: webhook } = await client.webhooks.regenerateSecret(\n * 'webhook-uuid'\n * );\n *\n * // Update your stored secret\n * await updateWebhookSecret(webhook.id, webhook.secret);\n * ```\n */\n async regenerateSecret(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<MessageWithDataResponse<WebhookWithSecret>> {\n return this.http.post<MessageWithDataResponse<WebhookWithSecret>>(\n `/webhooks/${id}/regenerate-secret`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Test webhook by sending a test event\n *\n * @param id - Webhook UUID\n * @param requestOptions - Request options\n * @returns Test result\n *\n * @example\n * ```typescript\n * const result = await client.webhooks.test('webhook-uuid');\n *\n * if (result.success) {\n * console.log(`Success! Response time: ${result.response_time_ms}ms`);\n * } else {\n * console.log(`Failed: ${result.error}`);\n * }\n * ```\n */\n async test(\n id: string,\n requestOptions?: RequestOptions\n ): Promise<WebhookTestResponse> {\n return this.http.post<WebhookTestResponse>(\n `/webhooks/${id}/test`,\n undefined,\n requestOptions\n );\n }\n\n /**\n * Get webhook delivery logs\n *\n * @param id - Webhook UUID\n * @param options - Pagination options\n * @param requestOptions - Request options\n * @returns Paginated list of logs\n *\n * @example\n * ```typescript\n * const { data: logs } = await client.webhooks.logs('webhook-uuid', {\n * per_page: 50\n * });\n *\n * logs.forEach(log => {\n * const status = log.success ? 'OK' : 'FAILED';\n * console.log(`${log.event} - ${status} (${log.response_time_ms}ms)`);\n * });\n * ```\n */\n async logs(\n id: string,\n options: { per_page?: number } = {},\n requestOptions?: RequestOptions\n ): Promise<PaginatedResponse<WebhookLog>> {\n return this.http.get<PaginatedResponse<WebhookLog>>(\n `/webhooks/${id}/logs`,\n options,\n requestOptions\n );\n }\n}\n","/**\n * Webhook signature verification utility\n *\n * @packageDocumentation\n */\n\nimport type { WebhookPayload } from '../types/webhooks.js';\n\n/**\n * Signature verification options\n */\nexport interface VerifySignatureOptions {\n /** Tolerance in seconds for timestamp validation (default: 300 = 5 minutes) */\n tolerance?: number | undefined;\n}\n\n/**\n * Parse the X-Scell-Signature header\n *\n * @param header - The signature header value (format: \"t=timestamp,v1=signature\")\n * @returns Parsed timestamp and signature\n */\nfunction parseSignatureHeader(header: string): {\n timestamp: number;\n signature: string;\n} | null {\n const parts = header.split(',');\n let timestamp: number | undefined;\n let signature: string | undefined;\n\n for (const part of parts) {\n const splitIndex = part.indexOf('=');\n if (splitIndex === -1) continue;\n\n const key = part.substring(0, splitIndex);\n const value = part.substring(splitIndex + 1);\n\n if (key === 't') {\n timestamp = parseInt(value, 10);\n } else if (key === 'v1') {\n signature = value;\n }\n }\n\n if (timestamp === undefined || signature === undefined) {\n return null;\n }\n\n return { timestamp, signature };\n}\n\n/**\n * Compute HMAC-SHA256 signature\n *\n * @param payload - The payload string\n * @param timestamp - The timestamp\n * @param secret - The webhook secret\n * @returns Hex-encoded signature\n */\nasync function computeSignature(\n payload: string,\n timestamp: number,\n secret: string\n): Promise<string> {\n const signedPayload = `${timestamp}.${payload}`;\n\n // Use Web Crypto API (works in Node.js 18+ and browsers)\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n const messageData = encoder.encode(signedPayload);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signatureBuffer = await crypto.subtle.sign(\n 'HMAC',\n cryptoKey,\n messageData\n );\n\n // Convert to hex string\n return Array.from(new Uint8Array(signatureBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks\n */\nfunction secureCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n\n return result === 0;\n}\n\n/**\n * Scell Webhook signature verification utilities\n *\n * @example\n * ```typescript\n * import { ScellWebhooks } from '@scell/sdk';\n *\n * // In your webhook endpoint\n * app.post('/webhooks/scell', async (req, res) => {\n * const signature = req.headers['x-scell-signature'];\n * const payload = JSON.stringify(req.body);\n *\n * const isValid = await ScellWebhooks.verifySignature(\n * payload,\n * signature,\n * process.env.WEBHOOK_SECRET\n * );\n *\n * if (!isValid) {\n * return res.status(401).send('Invalid signature');\n * }\n *\n * // Process the webhook\n * const event = ScellWebhooks.parsePayload(payload);\n * console.log('Received event:', event.event);\n * });\n * ```\n */\nexport const ScellWebhooks = {\n /**\n * Verify webhook signature\n *\n * @param payload - Raw request body as string\n * @param signature - Value of X-Scell-Signature header\n * @param secret - Your webhook secret (whsec_...)\n * @param options - Verification options\n * @returns True if signature is valid\n *\n * @example\n * ```typescript\n * const isValid = await ScellWebhooks.verifySignature(\n * rawBody,\n * req.headers['x-scell-signature'],\n * 'whsec_abc123...'\n * );\n * ```\n */\n async verifySignature(\n payload: string,\n signature: string,\n secret: string,\n options: VerifySignatureOptions = {}\n ): Promise<boolean> {\n const { tolerance = 300 } = options;\n\n // Parse the signature header\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n return false;\n }\n\n const { timestamp, signature: providedSignature } = parsed;\n\n // Check timestamp tolerance\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - timestamp) > tolerance) {\n return false;\n }\n\n // Compute expected signature\n const expectedSignature = await computeSignature(payload, timestamp, secret);\n\n // Constant-time comparison\n return secureCompare(expectedSignature, providedSignature);\n },\n\n /**\n * Verify webhook signature synchronously using Node.js crypto\n * (Only works in Node.js environment)\n *\n * @param payload - Raw request body as string\n * @param signature - Value of X-Scell-Signature header\n * @param secret - Your webhook secret (whsec_...)\n * @param options - Verification options\n * @returns True if signature is valid\n */\n verifySignatureSync(\n payload: string,\n signature: string,\n secret: string,\n options: VerifySignatureOptions = {}\n ): boolean {\n const { tolerance = 300 } = options;\n\n // Parse the signature header\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n return false;\n }\n\n const { timestamp, signature: providedSignature } = parsed;\n\n // Check timestamp tolerance\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - timestamp) > tolerance) {\n return false;\n }\n\n // Use Node.js crypto for sync operation\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const crypto = require('crypto') as typeof import('crypto');\n const signedPayload = `${timestamp}.${payload}`;\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(signedPayload)\n .digest('hex');\n\n // Use Node.js timingSafeEqual\n try {\n return crypto.timingSafeEqual(\n Buffer.from(expectedSignature),\n Buffer.from(providedSignature)\n );\n } catch {\n return false;\n }\n },\n\n /**\n * Parse webhook payload\n *\n * @param payload - Raw request body as string\n * @returns Parsed webhook payload\n *\n * @example\n * ```typescript\n * const event = ScellWebhooks.parsePayload<InvoiceWebhookData>(rawBody);\n * if (event.event === 'invoice.validated') {\n * console.log('Invoice validated:', event.data.invoice_number);\n * }\n * ```\n */\n parsePayload<T = unknown>(payload: string): WebhookPayload<T> {\n return JSON.parse(payload) as WebhookPayload<T>;\n },\n\n /**\n * Construct a test webhook event for local testing\n *\n * @param event - Event type\n * @param data - Event data\n * @param secret - Webhook secret for signing\n * @returns Object with payload and headers for testing\n */\n async constructTestEvent<T>(\n event: string,\n data: T,\n secret: string\n ): Promise<{\n payload: string;\n headers: Record<string, string>;\n }> {\n const timestamp = Math.floor(Date.now() / 1000);\n const webhookPayload: WebhookPayload<T> = {\n event: event as WebhookPayload<T>['event'],\n timestamp: new Date().toISOString(),\n data,\n };\n\n const payload = JSON.stringify(webhookPayload);\n const signature = await computeSignature(payload, timestamp, secret);\n\n return {\n payload,\n headers: {\n 'X-Scell-Signature': `t=${timestamp},v1=${signature}`,\n 'X-Scell-Event': event,\n 'X-Scell-Delivery': crypto.randomUUID(),\n 'Content-Type': 'application/json',\n },\n };\n },\n};\n","/**\n * Scell.io Official TypeScript SDK\n *\n * @packageDocumentation\n *\n * @example\n * ```typescript\n * import { ScellClient, ScellApiClient, ScellAuth, ScellWebhooks } from '@scell/sdk';\n *\n * // Dashboard client (Bearer token)\n * const auth = await ScellAuth.login({ email, password });\n * const client = new ScellClient(auth.token);\n *\n * // API client (X-API-Key)\n * const apiClient = new ScellApiClient('your-api-key');\n *\n * // Create invoice\n * const invoice = await apiClient.invoices.create({...});\n *\n * // Verify webhook\n * const isValid = await ScellWebhooks.verifySignature(payload, signature, secret);\n * ```\n */\n\n// Client\nimport { HttpClient, type ClientConfig } from './client.js';\n\n// Resources\nimport { ApiKeysResource } from './resources/api-keys.js';\nimport { AuthResource, ScellAuth } from './resources/auth.js';\nimport { BalanceResource } from './resources/balance.js';\nimport { CompaniesResource } from './resources/companies.js';\nimport { InvoicesResource } from './resources/invoices.js';\nimport { SignaturesResource } from './resources/signatures.js';\nimport { WebhooksResource } from './resources/webhooks.js';\n\n// Utilities\nimport { ScellWebhooks } from './utils/webhook-verify.js';\nimport { withRetry, createRetryWrapper } from './utils/retry.js';\n\n/**\n * Scell Dashboard Client\n *\n * Use this client for dashboard/user operations with Bearer token authentication.\n *\n * @example\n * ```typescript\n * import { ScellClient, ScellAuth } from '@scell/sdk';\n *\n * // Login first\n * const auth = await ScellAuth.login({\n * email: 'user@example.com',\n * password: 'password'\n * });\n *\n * // Create client\n * const client = new ScellClient(auth.token);\n *\n * // Use the client\n * const companies = await client.companies.list();\n * const balance = await client.balance.get();\n * ```\n */\nexport class ScellClient {\n private readonly http: HttpClient;\n\n /** Authentication operations */\n public readonly auth: AuthResource;\n /** Company management */\n public readonly companies: CompaniesResource;\n /** API key management */\n public readonly apiKeys: ApiKeysResource;\n /** Balance and transactions */\n public readonly balance: BalanceResource;\n /** Webhook management */\n public readonly webhooks: WebhooksResource;\n /** Invoice listing (read-only via dashboard) */\n public readonly invoices: InvoicesResource;\n /** Signature listing (read-only via dashboard) */\n public readonly signatures: SignaturesResource;\n\n /**\n * Create a new Scell Dashboard Client\n *\n * @param token - Bearer token from login\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * const client = new ScellClient('your-bearer-token', {\n * baseUrl: 'https://api.scell.io/api/v1',\n * timeout: 30000,\n * retry: { maxRetries: 3 }\n * });\n * ```\n */\n constructor(token: string, config: ClientConfig = {}) {\n this.http = new HttpClient('bearer', token, config);\n\n this.auth = new AuthResource(this.http);\n this.companies = new CompaniesResource(this.http);\n this.apiKeys = new ApiKeysResource(this.http);\n this.balance = new BalanceResource(this.http);\n this.webhooks = new WebhooksResource(this.http);\n this.invoices = new InvoicesResource(this.http);\n this.signatures = new SignaturesResource(this.http);\n }\n}\n\n/**\n * Scell API Client\n *\n * Use this client for external API operations with X-API-Key authentication.\n * This is the client you'll use for creating invoices and signatures.\n *\n * @example\n * ```typescript\n * import { ScellApiClient } from '@scell/sdk';\n *\n * const client = new ScellApiClient('your-api-key');\n *\n * // Create an invoice\n * const invoice = await client.invoices.create({\n * invoice_number: 'FACT-2024-001',\n * direction: 'outgoing',\n * output_format: 'facturx',\n * // ...\n * });\n *\n * // Create a signature request\n * const signature = await client.signatures.create({\n * title: 'Contract',\n * document: btoa(pdfContent),\n * document_name: 'contract.pdf',\n * signers: [{...}]\n * });\n * ```\n */\nexport class ScellApiClient {\n private readonly http: HttpClient;\n\n /** Invoice operations (create, download, convert) */\n public readonly invoices: InvoicesResource;\n /** Signature operations (create, download, remind, cancel) */\n public readonly signatures: SignaturesResource;\n\n /**\n * Create a new Scell API Client\n *\n * @param apiKey - Your API key (from dashboard)\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * // Production client\n * const client = new ScellApiClient('sk_live_xxx');\n *\n * // Sandbox client\n * const sandboxClient = new ScellApiClient('sk_test_xxx', {\n * baseUrl: 'https://api.scell.io/api/v1/sandbox'\n * });\n * ```\n */\n constructor(apiKey: string, config: ClientConfig = {}) {\n this.http = new HttpClient('api-key', apiKey, config);\n\n this.invoices = new InvoicesResource(this.http);\n this.signatures = new SignaturesResource(this.http);\n }\n}\n\n// Re-export utilities\nexport { ScellAuth, ScellWebhooks, withRetry, createRetryWrapper };\n\n// Re-export types\nexport type { ClientConfig } from './client.js';\nexport type { RetryOptions } from './utils/retry.js';\nexport type { VerifySignatureOptions } from './utils/webhook-verify.js';\n\n// Re-export errors\nexport {\n ScellError,\n ScellAuthenticationError,\n ScellAuthorizationError,\n ScellValidationError,\n ScellRateLimitError,\n ScellNotFoundError,\n ScellServerError,\n ScellInsufficientBalanceError,\n ScellNetworkError,\n ScellTimeoutError,\n} from './errors.js';\n\n// Re-export all types\nexport * from './types/index.js';\n"]}