@sdg.la/wishlist-stack-sdk 0.13.0 → 0.14.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/README.md +92 -19
- package/dist/index.cjs +196 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +122 -21
- package/dist/index.d.ts +122 -21
- package/dist/index.js +194 -35
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/client/query.ts","../src/client/errors.ts","../src/client/request.ts","../src/resources/lists/index.ts","../src/resources/groups/index.ts","../src/resources/shared/index.ts","../src/client/createWishlistStackClient.ts","../src/WishlistStackClient.ts","../src/types/pagination.ts","../src/types/query-options.ts"],"names":[],"mappings":";;;;;;;AAAO,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,QAAA,GAAW,8BAAA;;;ACSjB,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AACnC,QAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC9B;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,OAAO,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAA;AACzB;;;AClBA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,mBAAmB,KAAA,EAA2C;AACrE,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,SAAA,IAAa,KAAA;AACzC;AAEA,SAAS,iBAAiB,IAAA,EAAuE;AAC/F,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,MAAA;AAC5B,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,MAAA;AACnC,EAAA,MAAM,MAAkD,EAAC;AACzD,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,kBAAA,CAAmB,CAAC,CAAA,EAAG;AAC5B,IAAA,MAAM,MAAM,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,MAAA;AACxD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,QAAQ,OAAQ,CAAA,CAAU,KAAA,KAAU,QAAA,GAAY,EAAU,KAAA,GAAQ,MAAA;AACxE,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,EAAE,OAAA,EAAS,GAAA,EAAK,OAAM,GAAI,EAAE,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,GAAA,CAAI,SAAS,GAAA,GAAM,MAAA;AAC5B;AAEO,IAAM,qBAAA,GAAN,cAAqD,KAAA,CAAM;AAAA,EAQhE,WAAA,CAAY,SAAiB,OAAA,EAA8C;AACzE,IAAA,KAAA,CAAM,OAAO,CAAA;AARf,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,EAAO,uBAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,WAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAIP,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AACnB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAA,GAAoE;AACtE,IAAA,OAAO,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAA,GAAyC;AAC3C,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,IAAA,OAAO,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,EACnC;AACF;AAKO,SAAS,wBAAwB,KAAA,EAAyD;AAC/F,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OACG,KAAA,CAAc,IAAA,KAAS,uBAAA,IACxB,OAAQ,KAAA,CAAc,MAAA,KAAW,QAAA,IACjC,OAAQ,KAAA,CAAc,GAAA,KAAQ,QAAA,IAC9B,OAAQ,MAAc,MAAA,KAAW,QAAA;AAErC;;;ACpDA,eAAe,cAAc,GAAA,EAA6C;AACxE,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AACvD,EAAA,IAAI,CAAC,WAAA,CAAY,WAAA,GAAc,QAAA,CAAS,kBAAkB,GAAG,OAAO,MAAA;AACpE,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEO,SAAS,cAAc,GAAA,EAAqB;AACjD,EAAA,OAAO,eAAe,QACpB,IAAA,EACoB;AACpB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,aAAA,CAAc,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAElE,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,4BAA4B,GAAA,CAAI,MAAA;AAAA,MAChC,GAAI,IAAA,CAAK,OAAA,IAAW;AAAC,KACvB;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,MAAA,MAAM,QAAQ,GAAA,CAAI,mBAAA;AAGlB,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,iCAAiC,CAAA,GAAI,KAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAE3B,MAAA,OAAA,CAAA,cAAA,CAAA,KAAA,OAAA,CAAA,cAAA,CAAA,GAA4B,kBAAA,CAAA;AAC5B,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAgB,GAAI,MAAA;AAC5D,IAAA,MAAM,OAAA,GACJ,IAAA,CAAK,SAAA,IAAa,UAAA,GACd,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,EAAM,EAAG,IAAA,CAAK,SAAS,CAAA,GACnD,MAAA;AAEN,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAChB,KAAK,MAAA,GACL,UAAA,GACE,WAAW,MAAA,GACX,MAAA;AAEN,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK;AAAA,MAC/B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,OAAA,eAAsB,OAAO,CAAA;AAEjC,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAA,GAAW,MAAM,aAAA,CAAc,GAAG,CAAA;AACxC,MAAA,MAAM,SAAA,GACJ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,gBAAgB,KAChC,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAC9B,MAAA;AACF,MAAA,MAAM,IAAI,qBAAA,CAAkD,CAAA,mCAAA,EAAsC,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA,EAAK;AAAA,QAC/G,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,GAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAE/B,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,GAAG,CAAA;AAEtC,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;;;AC5EO,SAAS,oBAAoB,OAAA,EAAoB;AACtD,EAAA,OAAO;AAAA;AAAA,IAEL,MAAA,EAAQ,CAAC,KAAA,KACP,OAAA,CAA0B;AAAA,MACxB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,OAAA,EAAS,CAAC,MAAA,EAAgB,KAAA,KACxB,OAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MAC9C,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,MAAA,EAAQ,CAAC,IAAA,KACP,OAAA,CAA4C;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,MAAA,EAAQ,CAAC,MAAA,EAAgB,IAAA,KACvB,OAAA,CAAmD;AAAA,MACjD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MAC9C,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,MAAA,EAAQ,CAAC,MAAA,KACP,OAAA,CAA4B;AAAA,MAC1B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MAC9C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQH,SAAA,EAAW,CAAC,MAAA,EAAgB,IAAA,KAC1B,OAAA,CAAkD;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,UAAA,CAAA;AAAA,MAC9C,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,QAAA,EAAU,CAAC,MAAA,EAAgB,IAAA,KACzB,OAAA,CAAoD;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,IAAA,CAAA;AAAA,MAC9C,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,UAAA,EAAY,CAAC,MAAA,EAAgB,MAAA,EAAgB,SAC3C,OAAA,CAAoD;AAAA,MAClD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MAClF,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,UAAA,EAAY,CAAC,MAAA,EAAgB,MAAA,KAC3B,OAAA,CAAoC;AAAA,MAClC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,cAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MAClF,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA,IAGH,YAAA,EAAc,CAAC,MAAA,EAAgB,IAAA,KAC7B,OAAA,CAAwD;AAAA,MACtD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,QAAA,CAAA;AAAA,MAC9C,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,KAAA,EAAO,CAAC,MAAA,KACN,OAAA,CAAgC;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,MAAA,CAAA;AAAA,MAC9C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA,IAGH,OAAA,EAAS,CAAC,MAAA,KACR,OAAA,CAAkC;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,MAAA,CAAA;AAAA,MAC9C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMH,cAAA,EAAgB,CAAC,EAAA,EAAY,IAAA,KAC3B,OAAA,CAAoD;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,IAAA,CAAA;AAAA,MAC9C,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD;AAAA,GACL;AACF;;;AC/HA,SAAS,wBAAwB,KAAA,EAAoD;AACnF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,EAAE,YAAA,EAAc,GAAG,IAAA,EAAK,GAAI,KAAA;AAClC,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,CAAA,EAAE;AAAA,EACpC;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO,MAAA;AAC/C;AAEO,SAAS,qBAAqB,OAAA,EAAoB;AACvD,EAAA,OAAO;AAAA;AAAA,IAEL,MAAA,EAAQ,CAAC,KAAA,KACP,OAAA,CAA2B;AAAA,MACzB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO,wBAAwB,KAAK;AAAA,KACrC,CAAA;AAAA;AAAA,IAGH,OAAA,EAAS,CAAC,OAAA,EAAiB,KAAA,KACzB,OAAA,CAA0B;AAAA,MACxB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,MAAA,EAAQ,CAAC,IAAA,KACP,OAAA,CAA8C;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,MAAA,EAAQ,CAAC,OAAA,EAAiB,IAAA,KACxB,OAAA,CAAqD;AAAA,MACnD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,MAAA,EAAQ,CAAC,OAAA,KACP,OAAA,CAA6B;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMH,SAAA,EAAW,CAAC,OAAA,KACV,OAAA,CAAgC;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,UAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA,IAGH,OAAA,EAAS,CAAC,OAAA,EAAiB,IAAA,KACzB,OAAA,CAAgD;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,QAAA,CAAA;AAAA,MAChD,IAAA,EAAM,eAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,KAAA,EAAO,CAAC,OAAA,KACN,OAAA,CAAiC;AAAA,MAC/B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,MAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA,IAGH,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAmC;AAAA,MACjC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,YAAA,EAAe,kBAAA,CAAmB,OAAO,CAAC,CAAA,MAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP;AAAA,GACL;AACF;;;AC5GO,SAAS,qBAAqB,OAAA,EAAoB;AACvD,EAAA,OAAO;AAAA;AAAA,IAEL,aAAA,EAAe,CAAC,MAAA,EAAgB,KAAA,KAC9B,OAAA,CAA+B;AAAA,MAC7B,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MACpD,IAAA,EAAM,UAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA;AAAA,IAGH,cAAA,EAAgB,CAAC,OAAA,EAAiB,KAAA,KAChC,OAAA,CAAgC;AAAA,MAC9B,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,MACtD,IAAA,EAAM,UAAA;AAAA,MACN;AAAA,KACD;AAAA,GACL;AACF;;;ACZO,SAAS,0BAA0B,IAAA,EAA6D;AACrG,EAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAKA,EAAA,MAAM,SAAA,GACJ,IAAA,CAAK,KAAA,KACJ,OAAO,WAAW,KAAA,KAAU,UAAA,IACxB,CAAC,KAAA,EAAO,IAAA,KAAS,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,IAAI,CAAA,IAC9C,MAAA,CAAA;AAEN,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,UAAU,aAAA,CAAc;AAAA,IAC5B,OAAA,EAAS,KAAK,OAAA,IAAW,QAAA;AAAA,IACzB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,oBAAoB,OAAO,CAAA;AAAA,IAClC,MAAA,EAAQ,qBAAqB,OAAO,CAAA;AAAA,IACpC,MAAA,EAAQ,qBAAqB,OAAO;AAAA,GACtC;AACF;;;AC/CO,IAAM,sBAAN,MAA0D;AAAA,EAK/D,YAAY,IAAA,EAAwC;AAJpD,IAAA,aAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AAGP,IAAA,MAAM,MAAA,GAAS,0BAA0B,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA,EAGA,SAAA,GAAY;AACV,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAO;AAAA,EAC5B;AAAA;AAAA,EAGA,aAAa,OAAA,EAAiB;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,QAAA,GAAW;AACT,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,EAAO;AAAA,EAC3B;AACF;;;ACxBO,IAAM,YAAA,GAAe;AACrB,IAAM,iBAAA,GAAoB;;;ACN1B,IAAM,WAAA,GAAc,CAAC,UAAA,EAAY,WAAA,EAAa,WAAW;AACzD,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAO,MAAM;AA0BtC,SAAS,cAAA,CACd,OACA,UAAA,EACoC;AACpC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,UAAA,EAAY,OAAO,MAAA;AAClC,EAAA,OAAO,EAAE,GAAI,KAAA,IAAS,IAAK,GAAI,UAAA,IAAc,EAAC,EAAG;AACnD;AAKO,SAAS,QAAA,CACd,OACA,IAAA,EACmC;AACnC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM,OAAO,MAAA;AAC5B,EAAA,OAAO,EAAE,GAAI,KAAA,IAAS,IAAK,GAAI,IAAA,IAAQ,EAAC,EAAG;AAC7C","file":"index.cjs","sourcesContent":["export const MAX_PAGINATION_SIZE = 25 as const;\nexport const BASE_URL = \"https://wishlist.devteam.run\" as const;\n\n","export type QueryValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Array<string | number | boolean | null | undefined>;\n\nexport type Query = Record<string, QueryValue>;\n\nexport function toQueryString(query?: Query): string {\n if (!query) return \"\";\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v === undefined || v === null) continue;\n params.append(key, String(v));\n }\n continue;\n }\n params.set(key, String(value));\n }\n\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\n","export type WishlistStackApiErrorDetails<TBody = unknown> = {\n status: number;\n url: string;\n method: string;\n requestId?: string;\n body?: TBody;\n};\n\ntype ApiErrorItemLike = { message?: unknown; field?: unknown };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isApiErrorItemLike(value: unknown): value is ApiErrorItemLike {\n return isRecord(value) && \"message\" in value;\n}\n\nfunction extractApiErrors(body: unknown): Array<{ message: string; field?: string }> | undefined {\n if (!isRecord(body)) return undefined;\n const errors = body.errors;\n if (!Array.isArray(errors)) return undefined;\n const out: Array<{ message: string; field?: string }> = [];\n for (const e of errors) {\n if (!isApiErrorItemLike(e)) continue;\n const msg = typeof e.message === \"string\" ? e.message : undefined;\n if (!msg) continue;\n const field = typeof (e as any).field === \"string\" ? (e as any).field : undefined;\n out.push(field ? { message: msg, field } : { message: msg });\n }\n return out.length ? out : undefined;\n}\n\nexport class WishlistStackApiError<TBody = unknown> extends Error {\n readonly name = \"WishlistStackApiError\";\n readonly status: number;\n readonly url: string;\n readonly method: string;\n readonly requestId?: string;\n readonly body?: TBody;\n\n constructor(message: string, details: WishlistStackApiErrorDetails<TBody>) {\n super(message);\n this.status = details.status;\n this.url = details.url;\n this.method = details.method;\n this.requestId = details.requestId;\n this.body = details.body;\n }\n\n /**\n * Best-effort extraction of API error items from the response body.\n * Useful for UI/logging without needing to know the exact response shape.\n */\n get apiErrors(): Array<{ message: string; field?: string }> | undefined {\n return extractApiErrors(this.body);\n }\n\n /**\n * Convenience: extracted error messages (if present).\n */\n get apiErrorMessages(): string[] | undefined {\n const errs = this.apiErrors;\n return errs?.map((e) => e.message);\n }\n}\n\n/**\n * Bundler-safe type guard (prefer this over `instanceof WishlistStackApiError`).\n */\nexport function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown> {\n if (!isRecord(value)) return false;\n return (\n (value as any).name === \"WishlistStackApiError\" &&\n typeof (value as any).status === \"number\" &&\n typeof (value as any).url === \"string\" &&\n typeof (value as any).method === \"string\"\n );\n}\n\n","import { toQueryString, type Query } from \"./query\";\nimport { WishlistStackApiError } from \"./errors\";\nimport type { ApiErrorResponse } from \"../types/common\";\n\nexport type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport type AuthMode = \"authenticated\" | \"merchant\";\n\nexport type RequestContext = {\n baseUrl: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch: FetchLike;\n};\n\nexport type RequestArgs<TBody> = {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthMode;\n query?: Query;\n body?: TBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeoutMs?: number;\n};\n\nasync function safeParseJson(res: Response): Promise<unknown | undefined> {\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.toLowerCase().includes(\"application/json\")) return undefined;\n try {\n return await res.json();\n } catch {\n return undefined;\n }\n}\n\nexport function createRequest(ctx: RequestContext) {\n return async function request<TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n ): Promise<TResponse> {\n const url = `${ctx.baseUrl}${args.path}${toQueryString(args.query)}`;\n\n const headers: Record<string, string> = {\n \"X-Wishlist-Stack-Api-Key\": ctx.apiKey,\n ...(args.headers ?? {}),\n };\n\n if (args.auth === \"authenticated\") {\n const token = ctx.customerAccessToken;\n // If token is missing, still perform the request and let the API return the appropriate\n // error response (which we will surface as a WishlistStackApiError based on the HTTP response).\n if (token) headers[\"X-Shopify-Customer-Access-Token\"] = token;\n }\n\n let body: BodyInit | undefined;\n if (args.body !== undefined) {\n // Only JSON bodies are supported for this SDK.\n headers[\"content-type\"] ??= \"application/json\";\n body = JSON.stringify(args.body);\n }\n\n const controller = args.timeoutMs ? new AbortController() : undefined;\n const timeout =\n args.timeoutMs && controller\n ? setTimeout(() => controller.abort(), args.timeoutMs)\n : undefined;\n\n const signal = args.signal\n ? args.signal\n : controller\n ? controller.signal\n : undefined;\n\n const res = await ctx.fetch(url, {\n method: args.method,\n headers,\n body,\n signal,\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!res.ok) {\n const errBody = (await safeParseJson(res)) as ApiErrorResponse | unknown;\n const requestId =\n res.headers.get(\"fly-request-id\") ??\n res.headers.get(\"x-request-id\") ??\n undefined;\n throw new WishlistStackApiError<ApiErrorResponse | unknown>(`Wishlist Stack API request failed (${res.status})`, {\n status: res.status,\n url,\n method: args.method,\n requestId,\n body: errBody,\n });\n }\n\n if (res.status === 204) return undefined as TResponse;\n\n const parsed = await safeParseJson(res);\n // If server didn't return JSON, return the raw text as unknown.\n if (parsed === undefined) {\n const text = await res.text().catch(() => \"\");\n return text as unknown as TResponse;\n }\n\n return parsed as TResponse;\n };\n}\n\n","import type { RequestArgs } from \"../../client/request\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n AddItemsToListBody,\n CreateListBody,\n DuplicateListBody,\n ReorderListItemsBody,\n UpdateListBody,\n UpdateListItemBody,\n} from \"../../types/requests/lists\";\nimport type {\n AddItemsToListResponse,\n CreateListResponse,\n DuplicateListResponse,\n GetListResponse,\n GetListsResponse,\n MarkListSharedResponse,\n RemoveItemFromListResponse,\n RemoveListResponse,\n ReorderListItemsResponse,\n RevokeListSharedResponse,\n UpdateListDetailsResponse,\n UpdateListItemResponse,\n} from \"../../types/responses/lists\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetListsQuery = PaginatedQuery;\nexport type GetListQuery = Omit<PaginatedQuery, \"query\">;\n\nexport function createListsResource(request: RequestFn) {\n return {\n /** Returns all lists for the authenticated customer under the current merchant. */\n getAll: (query?: GetListsQuery) =>\n request<GetListsResponse>({\n method: \"GET\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n query,\n }),\n\n /** Fetch list details by id. */\n getById: (listId: string, query?: GetListQuery) =>\n request<GetListResponse>({\n method: \"GET\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n query,\n }),\n\n /** Create a new list. */\n create: (body: CreateListBody) =>\n request<CreateListResponse, CreateListBody>({\n method: \"POST\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update list name/description. */\n update: (listId: string, body: UpdateListBody) =>\n request<UpdateListDetailsResponse, UpdateListBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a list. */\n remove: (listId: string) =>\n request<RemoveListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a list (including all items) in a single call.\n * By default the copy stays in the same group as the source. Pass `groupId`\n * to place it in another group, or `groupId: null` to leave it ungrouped.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (listId: string, body?: DuplicateListBody) =>\n request<DuplicateListResponse, DuplicateListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Add one or more items to a list. */\n addItems: (listId: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/add`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Update an item on a list. */\n updateItem: (listId: string, itemId: string, body: UpdateListItemBody) =>\n request<UpdateListItemResponse, UpdateListItemBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove an item from a list. */\n removeItem: (listId: string, itemId: string) =>\n request<RemoveItemFromListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n }),\n\n /** Reorder all items in a list. */\n reorderItems: (listId: string, body: ReorderListItemsBody) =>\n request<ReorderListItemsResponse, ReorderListItemsBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/reorder`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark list as shared (public read-only). */\n share: (listId: string) =>\n request<MarkListSharedResponse>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke list sharing. */\n unshare: (listId: string) =>\n request<RevokeListSharedResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /**\n * Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).\n * Prefer `addItems(listId, body)` unless your server only supports the legacy route.\n */\n addItemsLegacy: (id: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/wishlists/${encodeURIComponent(id)}/add`,\n auth: \"authenticated\",\n body,\n }),\n };\n}\n\n","import type { RequestArgs } from \"../../client/request\";\nimport type { CreateGroupBody, ReorderGroupBody, UpdateGroupBody } from \"../../types/requests/groups\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n CreateGroupResponse,\n DuplicateGroupResponse,\n GetGroupResponse,\n GetGroupsResponse,\n MarkGroupSharedResponse,\n RemoveGroupResponse,\n ReorderGroupResponse,\n RevokeGroupSharedResponse,\n UpdateGroupDetailsResponse,\n} from \"../../types/responses/groups\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetGroupsQuery = PaginatedQuery<{\n /**\n * When truthy (`true`, `1`, or `\"1\"`), each group includes its full `lists`\n * array with hydrated items. Sent to the API as `includeLists=1`.\n */\n includeLists?: boolean | 1 | \"1\";\n}>;\nexport type GetGroupQuery = PaginatedQuery;\n\nfunction normalizeGetGroupsQuery(query?: GetGroupsQuery): GetGroupsQuery | undefined {\n if (!query) return undefined;\n const { includeLists, ...rest } = query;\n if (includeLists) {\n return { ...rest, includeLists: 1 };\n }\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nexport function createGroupsResource(request: RequestFn) {\n return {\n /** Fetch groups for the authenticated customer. */\n getAll: (query?: GetGroupsQuery) =>\n request<GetGroupsResponse>({\n method: \"GET\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n query: normalizeGetGroupsQuery(query),\n }),\n\n /** Fetch group details by id. */\n getById: (groupId: string, query?: GetGroupQuery) =>\n request<GetGroupResponse>({\n method: \"GET\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n query,\n }),\n\n /** Create a new group. */\n create: (body: CreateGroupBody) =>\n request<CreateGroupResponse, CreateGroupBody>({\n method: \"POST\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update group name/description. */\n update: (groupId: string, body: UpdateGroupBody) =>\n request<UpdateGroupDetailsResponse, UpdateGroupBody>({\n method: \"PATCH\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a group. */\n remove: (groupId: string) =>\n request<RemoveGroupResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a group (including all lists and items) in a single call.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (groupId: string) =>\n request<DuplicateGroupResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/duplicate`,\n auth: \"authenticated\",\n }),\n\n /** Reorder a group (spec uses listIds payload). */\n reorder: (groupId: string, body: ReorderGroupBody) =>\n request<ReorderGroupResponse, ReorderGroupBody>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/reorder`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark group as shared (public read-only). */\n share: (groupId: string) =>\n request<MarkGroupSharedResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke group sharing. */\n unshare: (groupId: string) =>\n request<RevokeGroupSharedResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n };\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetSharedListQuery = Omit<PaginatedQuery, \"query\">;\nexport type GetSharedGroupQuery = PaginatedQuery;\n\nexport function createSharedResource(request: RequestFn) {\n return {\n /** Public read-only view of a shared list. Requires only merchant apiKey. */\n getSharedList: (listId: string, query?: GetSharedListQuery) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n query,\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string, query?: GetSharedGroupQuery) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\n query,\n }),\n };\n}\n\n","import { BASE_URL } from \"../constants\";\nimport { createRequest, type FetchLike } from \"./request\";\nimport { createListsResource } from \"../resources/lists\";\nimport { createGroupsResource } from \"../resources/groups\";\nimport { createSharedResource } from \"../resources/shared\";\n\nexport type CreateWishlistStackClientOptions = {\n baseUrl?: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch?: FetchLike;\n};\n\nexport type WishlistStackClient = {\n lists: ReturnType<typeof createListsResource>;\n groups: ReturnType<typeof createGroupsResource>;\n shared: ReturnType<typeof createSharedResource>;\n};\n\nexport function createWishlistStackClient(opts: CreateWishlistStackClientOptions): WishlistStackClient {\n if (!opts.apiKey) {\n throw new Error(\n \"merchant api key is required. Pass it to createWishlistStackClient({ apiKey })\",\n );\n }\n\n // Cloudflare Workers (and some other runtimes) can throw \"Illegal invocation\" if you\n // capture `globalThis.fetch` and call it later without the correct `this` binding.\n // So: default to a wrapper that calls `globalThis.fetch(...)` directly.\n const fetchImpl: FetchLike | undefined =\n opts.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? ((input, init) => globalThis.fetch(input, init)) // keep correct invocation context\n : undefined);\n\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation found. Provide one via createWishlistStackClient({ fetch }) or use Node 18+ / modern browsers.\",\n );\n }\n\n const request = createRequest({\n baseUrl: opts.baseUrl ?? BASE_URL,\n apiKey: opts.apiKey,\n customerAccessToken: opts.customerAccessToken,\n fetch: fetchImpl,\n });\n\n return {\n lists: createListsResource(request),\n groups: createGroupsResource(request),\n shared: createSharedResource(request),\n };\n}\n","import { createWishlistStackClient, type CreateWishlistStackClientOptions, type WishlistStackClient as IWishlistStackClient } from \"./client/createWishlistStackClient\";\n\n/**\n * Class wrapper around `createWishlistStackClient()` for users who prefer `new`.\n * Exposes `lists`, `groups`, and `shared` resources.\n */\nexport class WishlistStackClient implements IWishlistStackClient {\n readonly lists: IWishlistStackClient[\"lists\"];\n readonly groups: IWishlistStackClient[\"groups\"];\n readonly shared: IWishlistStackClient[\"shared\"];\n\n constructor(opts: CreateWishlistStackClientOptions) {\n const client = createWishlistStackClient(opts);\n this.lists = client.lists;\n this.groups = client.groups;\n this.shared = client.shared;\n }\n\n /** Back-compat alias: `client.groups.getAll()` */\n getGroups() {\n return this.groups.getAll();\n }\n\n /** Back-compat alias: `client.groups.getById(groupId)` */\n getGroupById(groupId: string) {\n return this.groups.getById(groupId);\n }\n\n /** Back-compat alias: `client.lists.getAll()` */\n getLists() {\n return this.lists.getAll();\n }\n}\n","import { MAX_PAGINATION_SIZE } from \"../constants\";\n\nexport type PaginationParams = {\n page?: number;\n pageSize?: number;\n query?: string;\n};\n\nexport const DEFAULT_PAGE = 1 as const;\nexport const DEFAULT_PAGE_SIZE = MAX_PAGINATION_SIZE;\n\n","import type { Query } from \"../client/query\";\nimport type { PaginationParams } from \"./pagination\";\n\nexport const SORT_FIELDS = [\"position\", \"createdAt\", \"updatedAt\"] as const;\nexport const SORT_DIRECTIONS = [\"asc\", \"desc\"] as const;\n\nexport type SortField = (typeof SORT_FIELDS)[number];\nexport type SortDirection = (typeof SORT_DIRECTIONS)[number];\n\n/**\n * Collection sort options for multi-resource GET endpoints.\n * Defaults on the API are `sortBy=position` and `sortDirection=asc`.\n */\nexport type SortParams = {\n sortBy?: SortField;\n sortDirection?: SortDirection;\n};\n\n/**\n * Shared query option building blocks for list/group endpoints.\n *\n * Keep this extendable: as we add filters/sorts, we can add additional helpers/types here\n * and reuse them across endpoints without duplicating logic.\n */\nexport type PaginatedQuery<TExtra extends Query = Query> = PaginationParams & SortParams & TExtra;\n\n/**\n * Merge a base query with pagination parameters.\n * (Useful when an endpoint also gains filter/sort params over time.)\n */\nexport function withPagination<TExtra extends Query>(\n query?: TExtra,\n pagination?: PaginationParams,\n): PaginatedQuery<TExtra> | undefined {\n if (!query && !pagination) return undefined;\n return { ...(query ?? {}), ...(pagination ?? {}) } as PaginatedQuery<TExtra>;\n}\n\n/**\n * Merge a base query with sort parameters.\n */\nexport function withSort<TExtra extends Query>(\n query?: TExtra,\n sort?: SortParams,\n): (TExtra & SortParams) | undefined {\n if (!query && !sort) return undefined;\n return { ...(query ?? {}), ...(sort ?? {}) } as TExtra & SortParams;\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/client/query.ts","../src/client/errors.ts","../src/client/request.ts","../src/helpers/pagination.ts","../src/resources/lists/index.ts","../src/resources/groups/index.ts","../src/resources/shared/index.ts","../src/client/createWishlistStackClient.ts","../src/WishlistStackClient.ts","../src/types/pagination.ts","../src/types/query-options.ts","../src/types/guards.ts"],"names":["isRecord"],"mappings":"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","file":"index.cjs","sourcesContent":["export const MAX_PAGINATION_SIZE = 25 as const;\nexport const BASE_URL = \"https://wishlist.devteam.run\" as const;\n\n","export type QueryValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Array<string | number | boolean | null | undefined>;\n\nexport type Query = Record<string, QueryValue>;\n\nexport function toQueryString(query?: Query): string {\n if (!query) return \"\";\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v === undefined || v === null) continue;\n params.append(key, String(v));\n }\n continue;\n }\n params.set(key, String(value));\n }\n\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\n","export type WishlistStackApiErrorDetails<TBody = unknown> = {\n status: number;\n url: string;\n method: string;\n requestId?: string;\n body?: TBody;\n /** Value of the `Retry-After` response header when present (seconds or HTTP-date). */\n retryAfter?: string;\n /** Selected rate-limit response headers when present. */\n rateLimit?: {\n limit?: string;\n remaining?: string;\n reset?: string;\n };\n};\n\ntype ApiErrorItemLike = { message?: unknown; field?: unknown };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isApiErrorItemLike(value: unknown): value is ApiErrorItemLike {\n return isRecord(value) && \"message\" in value;\n}\n\nfunction extractApiErrors(body: unknown): Array<{ message: string; field?: string }> | undefined {\n if (!isRecord(body)) return undefined;\n const errors = body.errors;\n if (!Array.isArray(errors)) return undefined;\n const out: Array<{ message: string; field?: string }> = [];\n for (const e of errors) {\n if (!isApiErrorItemLike(e)) continue;\n const msg = typeof e.message === \"string\" ? e.message : undefined;\n if (!msg) continue;\n const field = typeof (e as any).field === \"string\" ? (e as any).field : undefined;\n out.push(field ? { message: msg, field } : { message: msg });\n }\n return out.length ? out : undefined;\n}\n\nexport class WishlistStackApiError<TBody = unknown> extends Error {\n readonly name = \"WishlistStackApiError\";\n readonly status: number;\n readonly url: string;\n readonly method: string;\n readonly requestId?: string;\n readonly body?: TBody;\n readonly retryAfter?: string;\n readonly rateLimit?: WishlistStackApiErrorDetails[\"rateLimit\"];\n\n constructor(message: string, details: WishlistStackApiErrorDetails<TBody>) {\n super(message);\n this.status = details.status;\n this.url = details.url;\n this.method = details.method;\n this.requestId = details.requestId;\n this.body = details.body;\n this.retryAfter = details.retryAfter;\n this.rateLimit = details.rateLimit;\n }\n\n /**\n * Best-effort extraction of API error items from the response body.\n * Useful for UI/logging without needing to know the exact response shape.\n */\n get apiErrors(): Array<{ message: string; field?: string }> | undefined {\n return extractApiErrors(this.body);\n }\n\n /**\n * Convenience: extracted error messages (if present).\n */\n get apiErrorMessages(): string[] | undefined {\n const errs = this.apiErrors;\n return errs?.map((e) => e.message);\n }\n}\n\n/**\n * Bundler-safe type guard (prefer this over `instanceof WishlistStackApiError`).\n */\nexport function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown> {\n if (!isRecord(value)) return false;\n return (\n (value as any).name === \"WishlistStackApiError\" &&\n typeof (value as any).status === \"number\" &&\n typeof (value as any).url === \"string\" &&\n typeof (value as any).method === \"string\"\n );\n}\n","import { toQueryString, type Query } from \"./query\";\nimport { WishlistStackApiError } from \"./errors\";\nimport type { ApiErrorResponse } from \"../types/common\";\n\nexport type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport type AuthMode = \"authenticated\" | \"merchant\";\n\nexport type RequestContext = {\n baseUrl: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch: FetchLike;\n /** Applied when a call does not pass `timeoutMs`. */\n defaultTimeoutMs?: number;\n /** When true, retry a single time on HTTP 429 with jittered delay. */\n retryOnRateLimit?: boolean;\n};\n\nexport type RequestArgs<TBody> = {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthMode;\n query?: Query;\n body?: TBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeoutMs?: number;\n};\n\nasync function safeParseJson(res: Response): Promise<unknown | undefined> {\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.toLowerCase().includes(\"application/json\")) return undefined;\n try {\n return await res.json();\n } catch {\n return undefined;\n }\n}\n\nfunction pickRequestId(res: Response): string | undefined {\n return (\n res.headers.get(\"fly-request-id\") ??\n res.headers.get(\"x-request-id\") ??\n res.headers.get(\"x-nf-request-id\") ??\n res.headers.get(\"x-netlify-request-id\") ??\n undefined\n );\n}\n\nfunction pickRateLimit(res: Response): { limit?: string; remaining?: string; reset?: string } | undefined {\n const limit = res.headers.get(\"x-ratelimit-limit\") ?? undefined;\n const remaining = res.headers.get(\"x-ratelimit-remaining\") ?? undefined;\n const reset = res.headers.get(\"x-ratelimit-reset\") ?? undefined;\n if (!limit && !remaining && !reset) return undefined;\n return { limit, remaining, reset };\n}\n\nfunction errorMessageFor(status: number, path: string): string {\n if (status === 503 && path.includes(\"/api/groups\")) {\n return \"Groups API disabled for this merchant\";\n }\n return `Wishlist Stack API request failed (${status})`;\n}\n\nfunction parseRetryAfterMs(retryAfter: string | undefined): number {\n if (!retryAfter) return 0;\n const asSeconds = Number(retryAfter);\n if (Number.isFinite(asSeconds) && asSeconds >= 0) {\n return Math.min(asSeconds * 1000, 30_000);\n }\n const asDate = Date.parse(retryAfter);\n if (!Number.isNaN(asDate)) {\n return Math.min(Math.max(0, asDate - Date.now()), 30_000);\n }\n return 0;\n}\n\nfunction jitterDelayMs(baseMs: number): number {\n const base = Math.max(100, baseMs || 500);\n const jitter = Math.floor(Math.random() * 250);\n return Math.min(base + jitter, 30_000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createRequest(ctx: RequestContext) {\n return async function request<TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n ): Promise<TResponse> {\n const url = `${ctx.baseUrl}${args.path}${toQueryString(args.query)}`;\n\n const headers: Record<string, string> = {\n \"X-Wishlist-Stack-Api-Key\": ctx.apiKey,\n ...(args.headers ?? {}),\n };\n\n if (args.auth === \"authenticated\") {\n const token = ctx.customerAccessToken;\n // If token is missing, still perform the request and let the API return the appropriate\n // error response (which we will surface as a WishlistStackApiError based on the HTTP response).\n if (token) headers[\"X-Shopify-Customer-Access-Token\"] = token;\n }\n\n let body: BodyInit | undefined;\n if (args.body !== undefined) {\n // Only JSON bodies are supported for this SDK.\n headers[\"content-type\"] ??= \"application/json\";\n body = JSON.stringify(args.body);\n }\n\n const timeoutMs = args.timeoutMs ?? ctx.defaultTimeoutMs;\n\n const doFetch = async (): Promise<Response> => {\n const controller = timeoutMs ? new AbortController() : undefined;\n const timeout =\n timeoutMs && controller\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined;\n\n const signal = args.signal\n ? args.signal\n : controller\n ? controller.signal\n : undefined;\n\n try {\n return await ctx.fetch(url, {\n method: args.method,\n headers,\n body,\n signal,\n });\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n };\n\n let res = await doFetch();\n\n if (!res.ok && res.status === 429 && ctx.retryOnRateLimit) {\n const retryAfter = res.headers.get(\"retry-after\") ?? undefined;\n await sleep(jitterDelayMs(parseRetryAfterMs(retryAfter)));\n res = await doFetch();\n }\n\n if (!res.ok) {\n const errBody = (await safeParseJson(res)) as ApiErrorResponse | unknown;\n const retryAfter = res.headers.get(\"retry-after\") ?? undefined;\n throw new WishlistStackApiError<ApiErrorResponse | unknown>(errorMessageFor(res.status, args.path), {\n status: res.status,\n url,\n method: args.method,\n requestId: pickRequestId(res),\n body: errBody,\n retryAfter,\n rateLimit: pickRateLimit(res),\n });\n }\n\n if (res.status === 204) return undefined as TResponse;\n\n const parsed = await safeParseJson(res);\n // If server didn't return JSON, return the raw text as unknown.\n if (parsed === undefined) {\n const text = await res.text().catch(() => \"\");\n return text as unknown as TResponse;\n }\n\n return parsed as TResponse;\n };\n}\n","import { MAX_PAGINATION_SIZE } from \"../constants\";\n\n/**\n * Clamp a page size to the API-allowed range (1–25) so requests\n * do not send invalid `pageSize` values.\n */\nexport function clampPageSize(n: number): number {\n if (!Number.isFinite(n)) return MAX_PAGINATION_SIZE;\n return Math.min(MAX_PAGINATION_SIZE, Math.max(1, Math.trunc(n)));\n}\n\n/**\n * Clamp a 1-based page index to at least 1.\n */\nexport function clampPage(n: number): number {\n if (!Number.isFinite(n)) return 1;\n return Math.max(1, Math.trunc(n));\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport { MAX_PAGINATION_SIZE } from \"../../constants\";\nimport { clampPage, clampPageSize } from \"../../helpers/pagination\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n AddItemsToListBody,\n CreateListBody,\n DuplicateListBody,\n ReorderListItemsBody,\n UpdateListBody,\n UpdateListItemBody,\n} from \"../../types/requests/lists\";\nimport type {\n AddItemsToListResponse,\n CreateListResponse,\n DuplicateListResponse,\n GetListResponse,\n GetListsResponse,\n HydratedWishlistItem,\n MarkListSharedResponse,\n RemoveItemFromListResponse,\n RemoveListResponse,\n ReorderListItemsResponse,\n RevokeListSharedResponse,\n UpdateListDetailsResponse,\n UpdateListItemResponse,\n} from \"../../types/responses/lists\";\nimport type { Pagination } from \"../../types/responses/common\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetListsQuery = PaginatedQuery;\nexport type GetListQuery = Omit<PaginatedQuery, \"query\">;\n\nexport type AddItemsBatchedOptions = {\n /** Max items per POST (API hard max is 25). */\n batchSize?: number;\n};\n\nexport type GetByIdAllItemsOptions = {\n pageSize?: number;\n sortBy?: GetListQuery[\"sortBy\"];\n sortDirection?: GetListQuery[\"sortDirection\"];\n};\n\nfunction chunkItems<T>(items: T[], batchSize: number): T[][] {\n const size = Math.max(1, Math.min(MAX_PAGINATION_SIZE, Math.trunc(batchSize) || MAX_PAGINATION_SIZE));\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks.length ? chunks : [[]];\n}\n\nexport function createListsResource(request: RequestFn) {\n const getById = (listId: string, query?: GetListQuery) =>\n request<GetListResponse>({\n method: \"GET\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n query,\n });\n\n const addItems = (listId: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/add`,\n auth: \"authenticated\",\n body,\n });\n\n return {\n /** Returns all lists for the authenticated customer under the current merchant. */\n getAll: (query?: GetListsQuery) =>\n request<GetListsResponse>({\n method: \"GET\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n query,\n }),\n\n /** Fetch list details by id. */\n getById,\n\n /**\n * Fetch every item on a list by walking pages (list detail is paginated;\n * max pageSize 25).\n */\n getByIdAllItems: async (listId: string, opts?: GetByIdAllItemsOptions): Promise<GetListResponse> => {\n const pageSize = clampPageSize(opts?.pageSize ?? MAX_PAGINATION_SIZE);\n const sortBy = opts?.sortBy;\n const sortDirection = opts?.sortDirection;\n\n const first = await getById(listId, {\n page: 1,\n pageSize,\n ...(sortBy ? { sortBy } : {}),\n ...(sortDirection ? { sortDirection } : {}),\n });\n\n const totalPages = first.pagination.totalPages;\n const allItems: HydratedWishlistItem[] = [...(first.items ?? [])];\n\n for (let page = 2; page <= totalPages; page++) {\n const next = await getById(listId, {\n page: clampPage(page),\n pageSize,\n ...(sortBy ? { sortBy } : {}),\n ...(sortDirection ? { sortDirection } : {}),\n });\n allItems.push(...(next.items ?? []));\n }\n\n const pagination: Pagination = {\n ...first.pagination,\n page: 1,\n pageSize,\n };\n\n return {\n ...first,\n items: allItems,\n pagination,\n };\n },\n\n /**\n * Create a new list. Do not send `variantIds` — add items via `addItems`\n * or `addItemsBatched` after create.\n */\n create: (body: CreateListBody) =>\n request<CreateListResponse, CreateListBody>({\n method: \"POST\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update list name/description. */\n update: (listId: string, body: UpdateListBody) =>\n request<UpdateListDetailsResponse, UpdateListBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a list. */\n remove: (listId: string) =>\n request<RemoveListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a list (including all items) in a single call.\n * By default the copy stays in the same group as the source. Pass `groupId`\n * to place it in another group, or `groupId: null` to leave it ungrouped.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (listId: string, body?: DuplicateListBody) =>\n request<DuplicateListResponse, DuplicateListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,\n auth: \"authenticated\",\n body,\n }),\n\n /**\n * Add one or more items to a list.\n * Returns `{ listId, addedItems, addedCount }`. Prefer `addItemsBatched`\n * when sending more than 25 items.\n */\n addItems,\n\n /**\n * Add items in sequential batches of ≤25 (API hard max).\n * Merges `{ addedItems, addedCount }` across batches.\n */\n addItemsBatched: async (\n listId: string,\n body: AddItemsToListBody,\n opts?: AddItemsBatchedOptions,\n ): Promise<AddItemsToListResponse> => {\n const items = body.items ?? [];\n const batchSize = opts?.batchSize ?? MAX_PAGINATION_SIZE;\n const chunks = chunkItems(items, batchSize);\n\n const merged: AddItemsToListResponse = {\n listId,\n addedItems: [],\n addedCount: 0,\n };\n\n for (const chunk of chunks) {\n const res = await addItems(listId, { items: chunk });\n merged.listId = res.listId;\n merged.addedItems.push(...res.addedItems);\n merged.addedCount += res.addedCount;\n }\n\n return merged;\n },\n\n /** Update an item on a list. */\n updateItem: (listId: string, itemId: string, body: UpdateListItemBody) =>\n request<UpdateListItemResponse, UpdateListItemBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove an item from a list. */\n removeItem: (listId: string, itemId: string) =>\n request<RemoveItemFromListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n }),\n\n /** Reorder all items in a list. */\n reorderItems: (listId: string, body: ReorderListItemsBody) =>\n request<ReorderListItemsResponse, ReorderListItemsBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/reorder`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark list as shared (public read-only). */\n share: (listId: string) =>\n request<MarkListSharedResponse>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke list sharing. */\n unshare: (listId: string) =>\n request<RevokeListSharedResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /**\n * Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).\n * Prefer `addItems(listId, body)` unless your server only supports the legacy route.\n */\n addItemsLegacy: (id: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/wishlists/${encodeURIComponent(id)}/add`,\n auth: \"authenticated\",\n body,\n }),\n };\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport type { CreateGroupBody, ReorderGroupsBody, UpdateGroupBody } from \"../../types/requests/groups\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n CreateGroupResponse,\n DuplicateGroupResponse,\n GetGroupResponse,\n GetGroupsResponse,\n MarkGroupSharedResponse,\n RemoveGroupResponse,\n ReorderGroupsResponse,\n RevokeGroupSharedResponse,\n UpdateGroupDetailsResponse,\n} from \"../../types/responses/groups\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetGroupsQuery = PaginatedQuery<{\n /**\n * When truthy (`true`, `1`, or `\"1\"`), each group includes embedded `lists`\n * with hydrated items (`includeLists=1`).\n *\n * Expect at most **10 lists × 25 items** per group. For full data use\n * `groups.getById` plus `lists.getById` / `lists.getByIdAllItems`. Groups\n * endpoints may return **503** until the Groups API is enabled for the merchant.\n */\n includeLists?: boolean | 1 | \"1\";\n}>;\nexport type GetGroupQuery = PaginatedQuery;\n\nfunction normalizeGetGroupsQuery(query?: GetGroupsQuery): GetGroupsQuery | undefined {\n if (!query) return undefined;\n const { includeLists, ...rest } = query;\n if (includeLists) {\n return { ...rest, includeLists: 1 };\n }\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nexport function createGroupsResource(request: RequestFn) {\n return {\n /**\n * Fetch groups for the authenticated customer.\n * May return **503** when the Groups API is disabled for this merchant.\n */\n getAll: (query?: GetGroupsQuery) =>\n request<GetGroupsResponse>({\n method: \"GET\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n query: normalizeGetGroupsQuery(query),\n }),\n\n /**\n * Fetch group details by id.\n * May return **503** when the Groups API is disabled for this merchant.\n */\n getById: (groupId: string, query?: GetGroupQuery) =>\n request<GetGroupResponse>({\n method: \"GET\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n query,\n }),\n\n /** Create a new group. */\n create: (body: CreateGroupBody) =>\n request<CreateGroupResponse, CreateGroupBody>({\n method: \"POST\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update group name/description. */\n update: (groupId: string, body: UpdateGroupBody) =>\n request<UpdateGroupDetailsResponse, UpdateGroupBody>({\n method: \"PATCH\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a group. */\n remove: (groupId: string) =>\n request<RemoveGroupResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a group (including all lists and items) in a single call.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (groupId: string) =>\n request<DuplicateGroupResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/duplicate`,\n auth: \"authenticated\",\n }),\n\n /**\n * Reorder the customer's groups (`POST /api/groups/reorder`).\n * Body must include `groupIds` in the desired order — not list IDs, and\n * not a per-group path.\n */\n reorder: (body: ReorderGroupsBody) =>\n request<ReorderGroupsResponse, ReorderGroupsBody>({\n method: \"POST\",\n path: \"/api/groups/reorder\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark group as shared (public read-only). */\n share: (groupId: string) =>\n request<MarkGroupSharedResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke group sharing. */\n unshare: (groupId: string) =>\n request<RevokeGroupSharedResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n };\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetSharedListQuery = Omit<PaginatedQuery, \"query\">;\nexport type GetSharedGroupQuery = PaginatedQuery;\n\nexport function createSharedResource(request: RequestFn) {\n return {\n /** Public read-only view of a shared list. Requires only merchant apiKey. */\n getSharedList: (listId: string, query?: GetSharedListQuery) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n query,\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string, query?: GetSharedGroupQuery) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\n query,\n }),\n };\n}\n\n","import { BASE_URL } from \"../constants\";\nimport { createRequest, type FetchLike } from \"./request\";\nimport { createListsResource } from \"../resources/lists\";\nimport { createGroupsResource } from \"../resources/groups\";\nimport { createSharedResource } from \"../resources/shared\";\n\nexport type CreateWishlistStackClientOptions = {\n baseUrl?: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch?: FetchLike;\n /** Default request timeout in ms when a call does not pass `timeoutMs`. */\n defaultTimeoutMs?: number;\n /** When true, retry once on HTTP 429 with jittered backoff (default: false). */\n retryOnRateLimit?: boolean;\n};\n\nexport type WishlistStackClient = {\n lists: ReturnType<typeof createListsResource>;\n groups: ReturnType<typeof createGroupsResource>;\n shared: ReturnType<typeof createSharedResource>;\n};\n\nexport function createWishlistStackClient(opts: CreateWishlistStackClientOptions): WishlistStackClient {\n if (!opts.apiKey) {\n throw new Error(\n \"merchant api key is required. Pass it to createWishlistStackClient({ apiKey })\",\n );\n }\n\n // Cloudflare Workers (and some other runtimes) can throw \"Illegal invocation\" if you\n // capture `globalThis.fetch` and call it later without the correct `this` binding.\n // So: default to a wrapper that calls `globalThis.fetch(...)` directly.\n const fetchImpl: FetchLike | undefined =\n opts.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? ((input, init) => globalThis.fetch(input, init)) // keep correct invocation context\n : undefined);\n\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation found. Provide one via createWishlistStackClient({ fetch }) or use Node 18+ / modern browsers.\",\n );\n }\n\n const request = createRequest({\n baseUrl: opts.baseUrl ?? BASE_URL,\n apiKey: opts.apiKey,\n customerAccessToken: opts.customerAccessToken,\n fetch: fetchImpl,\n defaultTimeoutMs: opts.defaultTimeoutMs,\n retryOnRateLimit: opts.retryOnRateLimit,\n });\n\n return {\n lists: createListsResource(request),\n groups: createGroupsResource(request),\n shared: createSharedResource(request),\n };\n}\n","import { createWishlistStackClient, type CreateWishlistStackClientOptions, type WishlistStackClient as IWishlistStackClient } from \"./client/createWishlistStackClient\";\n\n/**\n * Class wrapper around `createWishlistStackClient()` for users who prefer `new`.\n * Exposes `lists`, `groups`, and `shared` resources.\n */\nexport class WishlistStackClient implements IWishlistStackClient {\n readonly lists: IWishlistStackClient[\"lists\"];\n readonly groups: IWishlistStackClient[\"groups\"];\n readonly shared: IWishlistStackClient[\"shared\"];\n\n constructor(opts: CreateWishlistStackClientOptions) {\n const client = createWishlistStackClient(opts);\n this.lists = client.lists;\n this.groups = client.groups;\n this.shared = client.shared;\n }\n\n /** Back-compat alias: `client.groups.getAll()` */\n getGroups() {\n return this.groups.getAll();\n }\n\n /** Back-compat alias: `client.groups.getById(groupId)` */\n getGroupById(groupId: string) {\n return this.groups.getById(groupId);\n }\n\n /** Back-compat alias: `client.lists.getAll()` */\n getLists() {\n return this.lists.getAll();\n }\n}\n","import { MAX_PAGINATION_SIZE } from \"../constants\";\n\nexport type PaginationParams = {\n page?: number;\n pageSize?: number;\n query?: string;\n};\n\nexport const DEFAULT_PAGE = 1 as const;\nexport const DEFAULT_PAGE_SIZE = MAX_PAGINATION_SIZE;\n\n","import type { Query } from \"../client/query\";\nimport type { PaginationParams } from \"./pagination\";\n\nexport const SORT_FIELDS = [\"position\", \"createdAt\", \"updatedAt\"] as const;\nexport const SORT_DIRECTIONS = [\"asc\", \"desc\"] as const;\n\nexport type SortField = (typeof SORT_FIELDS)[number];\nexport type SortDirection = (typeof SORT_DIRECTIONS)[number];\n\n/**\n * Collection sort options for multi-resource GET endpoints.\n * Defaults on the API are `sortBy=position` and `sortDirection=asc`.\n */\nexport type SortParams = {\n sortBy?: SortField;\n sortDirection?: SortDirection;\n};\n\n/**\n * Shared query option building blocks for list/group endpoints.\n *\n * Keep this extendable: as we add filters/sorts, we can add additional helpers/types here\n * and reuse them across endpoints without duplicating logic.\n */\nexport type PaginatedQuery<TExtra extends Query = Query> = PaginationParams & SortParams & TExtra;\n\n/**\n * Merge a base query with pagination parameters.\n * (Useful when an endpoint also gains filter/sort params over time.)\n */\nexport function withPagination<TExtra extends Query>(\n query?: TExtra,\n pagination?: PaginationParams,\n): PaginatedQuery<TExtra> | undefined {\n if (!query && !pagination) return undefined;\n return { ...(query ?? {}), ...(pagination ?? {}) } as PaginatedQuery<TExtra>;\n}\n\n/**\n * Merge a base query with sort parameters.\n */\nexport function withSort<TExtra extends Query>(\n query?: TExtra,\n sort?: SortParams,\n): (TExtra & SortParams) | undefined {\n if (!query && !sort) return undefined;\n return { ...(query ?? {}), ...(sort ?? {}) } as TExtra & SortParams;\n}\n\n","import type { AddItemsToListResponse } from \"./responses/lists\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * True when the value matches the add-items response shape\n * (`{ listId, addedItems, addedCount }`).\n */\nexport function isAddItemsDeltaResponse(\n value: AddItemsToListResponse | unknown,\n): value is AddItemsToListResponse {\n if (!isRecord(value)) return false;\n return (\n typeof value.listId === \"string\" &&\n Array.isArray(value.addedItems) &&\n typeof value.addedCount === \"number\"\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -51,6 +51,10 @@ declare function withPagination<TExtra extends Query>(query?: TExtra, pagination
|
|
|
51
51
|
*/
|
|
52
52
|
declare function withSort<TExtra extends Query>(query?: TExtra, sort?: SortParams): (TExtra & SortParams) | undefined;
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Create a new list. Do **not** send `variantIds` — the API may reject them.
|
|
56
|
+
* Create the list, then call `lists.addItems` or `lists.addItemsBatched`.
|
|
57
|
+
*/
|
|
54
58
|
type CreateListBody = {
|
|
55
59
|
name?: string;
|
|
56
60
|
description?: string;
|
|
@@ -64,6 +68,7 @@ type UpdateListBody = {
|
|
|
64
68
|
type AddItemsToListBody = {
|
|
65
69
|
items?: Array<{
|
|
66
70
|
variantId?: string;
|
|
71
|
+
/** Quantity for the item (1–999). */
|
|
67
72
|
quantity?: number;
|
|
68
73
|
note?: string;
|
|
69
74
|
properties?: Record<string, unknown> | null;
|
|
@@ -174,14 +179,23 @@ type GetListsResponse = {
|
|
|
174
179
|
lists: ListSummary[];
|
|
175
180
|
pagination: Pagination;
|
|
176
181
|
};
|
|
177
|
-
/** GET `/api/lists/:listId` */
|
|
178
|
-
type GetListResponse = ListDetail
|
|
182
|
+
/** GET `/api/lists/:listId` — items are paginated (max pageSize 25). */
|
|
183
|
+
type GetListResponse = ListDetail & {
|
|
184
|
+
pagination: Pagination;
|
|
185
|
+
};
|
|
179
186
|
type ListMutationResponse = Omit<ListSummary, "featuredProducts">;
|
|
180
187
|
type CreateListResponse = ListMutationResponse;
|
|
181
188
|
type DuplicateListResponse = ListMutationResponse;
|
|
182
189
|
type UpdateListDetailsResponse = ListMutationResponse;
|
|
183
190
|
type RemoveListResponse = OkResponse;
|
|
184
|
-
|
|
191
|
+
/** POST `/api/lists/:listId/add` — newly added items only. */
|
|
192
|
+
type AddItemsToListResponse = {
|
|
193
|
+
listId: string;
|
|
194
|
+
addedItems: HydratedWishlistItem[];
|
|
195
|
+
addedCount: number;
|
|
196
|
+
};
|
|
197
|
+
/** @deprecated Use `AddItemsToListResponse`. */
|
|
198
|
+
type AddItemsToListDeltaResponse = AddItemsToListResponse;
|
|
185
199
|
type UpdateListItemResponse = unknown;
|
|
186
200
|
type RemoveItemFromListResponse = OkResponse;
|
|
187
201
|
type ReorderListItemsResponse = {
|
|
@@ -196,12 +210,29 @@ type RevokeListSharedResponse = ListMutationResponse;
|
|
|
196
210
|
type RequestFn$2 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
197
211
|
type GetListsQuery = PaginatedQuery;
|
|
198
212
|
type GetListQuery = Omit<PaginatedQuery, "query">;
|
|
213
|
+
type AddItemsBatchedOptions = {
|
|
214
|
+
/** Max items per POST (API hard max is 25). */
|
|
215
|
+
batchSize?: number;
|
|
216
|
+
};
|
|
217
|
+
type GetByIdAllItemsOptions = {
|
|
218
|
+
pageSize?: number;
|
|
219
|
+
sortBy?: GetListQuery["sortBy"];
|
|
220
|
+
sortDirection?: GetListQuery["sortDirection"];
|
|
221
|
+
};
|
|
199
222
|
declare function createListsResource(request: RequestFn$2): {
|
|
200
223
|
/** Returns all lists for the authenticated customer under the current merchant. */
|
|
201
224
|
getAll: (query?: GetListsQuery) => Promise<GetListsResponse>;
|
|
202
225
|
/** Fetch list details by id. */
|
|
203
|
-
getById: (listId: string, query?: GetListQuery) => Promise<
|
|
204
|
-
/**
|
|
226
|
+
getById: (listId: string, query?: GetListQuery) => Promise<GetListResponse>;
|
|
227
|
+
/**
|
|
228
|
+
* Fetch every item on a list by walking pages (list detail is paginated;
|
|
229
|
+
* max pageSize 25).
|
|
230
|
+
*/
|
|
231
|
+
getByIdAllItems: (listId: string, opts?: GetByIdAllItemsOptions) => Promise<GetListResponse>;
|
|
232
|
+
/**
|
|
233
|
+
* Create a new list. Do not send `variantIds` — add items via `addItems`
|
|
234
|
+
* or `addItemsBatched` after create.
|
|
235
|
+
*/
|
|
205
236
|
create: (body: CreateListBody) => Promise<ListMutationResponse>;
|
|
206
237
|
/** Update list name/description. */
|
|
207
238
|
update: (listId: string, body: UpdateListBody) => Promise<ListMutationResponse>;
|
|
@@ -214,8 +245,17 @@ declare function createListsResource(request: RequestFn$2): {
|
|
|
214
245
|
* The copy is named `Copy of {original name}` and is not shared.
|
|
215
246
|
*/
|
|
216
247
|
duplicate: (listId: string, body?: DuplicateListBody) => Promise<ListMutationResponse>;
|
|
217
|
-
/**
|
|
218
|
-
|
|
248
|
+
/**
|
|
249
|
+
* Add one or more items to a list.
|
|
250
|
+
* Returns `{ listId, addedItems, addedCount }`. Prefer `addItemsBatched`
|
|
251
|
+
* when sending more than 25 items.
|
|
252
|
+
*/
|
|
253
|
+
addItems: (listId: string, body: AddItemsToListBody) => Promise<AddItemsToListResponse>;
|
|
254
|
+
/**
|
|
255
|
+
* Add items in sequential batches of ≤25 (API hard max).
|
|
256
|
+
* Merges `{ addedItems, addedCount }` across batches.
|
|
257
|
+
*/
|
|
258
|
+
addItemsBatched: (listId: string, body: AddItemsToListBody, opts?: AddItemsBatchedOptions) => Promise<AddItemsToListResponse>;
|
|
219
259
|
/** Update an item on a list. */
|
|
220
260
|
updateItem: (listId: string, itemId: string, body: UpdateListItemBody) => Promise<unknown>;
|
|
221
261
|
/** Remove an item from a list. */
|
|
@@ -230,7 +270,7 @@ declare function createListsResource(request: RequestFn$2): {
|
|
|
230
270
|
* Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).
|
|
231
271
|
* Prefer `addItems(listId, body)` unless your server only supports the legacy route.
|
|
232
272
|
*/
|
|
233
|
-
addItemsLegacy: (id: string, body: AddItemsToListBody) => Promise<
|
|
273
|
+
addItemsLegacy: (id: string, body: AddItemsToListBody) => Promise<AddItemsToListResponse>;
|
|
234
274
|
};
|
|
235
275
|
|
|
236
276
|
type CreateGroupBody = {
|
|
@@ -241,13 +281,20 @@ type UpdateGroupBody = {
|
|
|
241
281
|
name?: string;
|
|
242
282
|
description?: string;
|
|
243
283
|
};
|
|
244
|
-
|
|
245
|
-
|
|
284
|
+
/**
|
|
285
|
+
* Body for `POST /api/groups/reorder` — reorder the customer's groups.
|
|
286
|
+
* `groupIds` must list every group CUID in the desired order.
|
|
287
|
+
*/
|
|
288
|
+
type ReorderGroupsBody = {
|
|
289
|
+
groupIds: string[];
|
|
246
290
|
};
|
|
291
|
+
/** @deprecated Use `ReorderGroupsBody` (`groupIds` on `POST /api/groups/reorder`). */
|
|
292
|
+
type ReorderGroupBody = ReorderGroupsBody;
|
|
247
293
|
|
|
248
294
|
/**
|
|
249
295
|
* List embedded on a group when `includeLists=1` is passed to `groups.getAll()`.
|
|
250
|
-
* Items are
|
|
296
|
+
* Items are hydrated (same shape as `lists.getById` items).
|
|
297
|
+
* Expect at most **10 lists × 25 items** per group.
|
|
251
298
|
*/
|
|
252
299
|
type GroupSummaryList = {
|
|
253
300
|
id: string;
|
|
@@ -267,7 +314,10 @@ type GroupSummary = {
|
|
|
267
314
|
position: number;
|
|
268
315
|
shared: boolean;
|
|
269
316
|
listCount: number;
|
|
270
|
-
/**
|
|
317
|
+
/**
|
|
318
|
+
* Empty unless `includeLists=1` was requested.
|
|
319
|
+
* Cap: 10 lists × 25 items each.
|
|
320
|
+
*/
|
|
271
321
|
lists: GroupSummaryList[];
|
|
272
322
|
featuredItems: FeaturedItem[];
|
|
273
323
|
createdAt: string;
|
|
@@ -317,23 +367,40 @@ type CreateGroupResponse = GroupMutationResponse;
|
|
|
317
367
|
type DuplicateGroupResponse = GroupMutationResponse;
|
|
318
368
|
type UpdateGroupDetailsResponse = GroupMutationResponse;
|
|
319
369
|
type RemoveGroupResponse = OkResponse;
|
|
320
|
-
type
|
|
370
|
+
type ReorderGroupsResponse = {
|
|
371
|
+
updated: Array<{
|
|
372
|
+
id: string;
|
|
373
|
+
position: number;
|
|
374
|
+
}>;
|
|
375
|
+
};
|
|
376
|
+
/** @deprecated Prefer `ReorderGroupsResponse`. */
|
|
377
|
+
type ReorderGroupResponse = ReorderGroupsResponse;
|
|
321
378
|
type MarkGroupSharedResponse = GroupMutationResponse;
|
|
322
379
|
type RevokeGroupSharedResponse = GroupMutationResponse;
|
|
323
380
|
|
|
324
381
|
type RequestFn$1 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
325
382
|
type GetGroupsQuery = PaginatedQuery<{
|
|
326
383
|
/**
|
|
327
|
-
* When truthy (`true`, `1`, or `"1"`), each group includes
|
|
328
|
-
*
|
|
384
|
+
* When truthy (`true`, `1`, or `"1"`), each group includes embedded `lists`
|
|
385
|
+
* with hydrated items (`includeLists=1`).
|
|
386
|
+
*
|
|
387
|
+
* Expect at most **10 lists × 25 items** per group. For full data use
|
|
388
|
+
* `groups.getById` plus `lists.getById` / `lists.getByIdAllItems`. Groups
|
|
389
|
+
* endpoints may return **503** until the Groups API is enabled for the merchant.
|
|
329
390
|
*/
|
|
330
391
|
includeLists?: boolean | 1 | "1";
|
|
331
392
|
}>;
|
|
332
393
|
type GetGroupQuery = PaginatedQuery;
|
|
333
394
|
declare function createGroupsResource(request: RequestFn$1): {
|
|
334
|
-
/**
|
|
395
|
+
/**
|
|
396
|
+
* Fetch groups for the authenticated customer.
|
|
397
|
+
* May return **503** when the Groups API is disabled for this merchant.
|
|
398
|
+
*/
|
|
335
399
|
getAll: (query?: GetGroupsQuery) => Promise<GetGroupsResponse>;
|
|
336
|
-
/**
|
|
400
|
+
/**
|
|
401
|
+
* Fetch group details by id.
|
|
402
|
+
* May return **503** when the Groups API is disabled for this merchant.
|
|
403
|
+
*/
|
|
337
404
|
getById: (groupId: string, query?: GetGroupQuery) => Promise<GroupDetail>;
|
|
338
405
|
/** Create a new group. */
|
|
339
406
|
create: (body: CreateGroupBody) => Promise<GroupMutationResponse>;
|
|
@@ -346,8 +413,12 @@ declare function createGroupsResource(request: RequestFn$1): {
|
|
|
346
413
|
* The copy is named `Copy of {original name}` and is not shared.
|
|
347
414
|
*/
|
|
348
415
|
duplicate: (groupId: string) => Promise<GroupMutationResponse>;
|
|
349
|
-
/**
|
|
350
|
-
|
|
416
|
+
/**
|
|
417
|
+
* Reorder the customer's groups (`POST /api/groups/reorder`).
|
|
418
|
+
* Body must include `groupIds` in the desired order — not list IDs, and
|
|
419
|
+
* not a per-group path.
|
|
420
|
+
*/
|
|
421
|
+
reorder: (body: ReorderGroupsBody) => Promise<ReorderGroupsResponse>;
|
|
351
422
|
/** Mark group as shared (public read-only). */
|
|
352
423
|
share: (groupId: string) => Promise<GroupMutationResponse>;
|
|
353
424
|
/** Revoke group sharing. */
|
|
@@ -359,7 +430,7 @@ type GetSharedListQuery = Omit<PaginatedQuery, "query">;
|
|
|
359
430
|
type GetSharedGroupQuery = PaginatedQuery;
|
|
360
431
|
declare function createSharedResource(request: RequestFn): {
|
|
361
432
|
/** Public read-only view of a shared list. Requires only merchant apiKey. */
|
|
362
|
-
getSharedList: (listId: string, query?: GetSharedListQuery) => Promise<
|
|
433
|
+
getSharedList: (listId: string, query?: GetSharedListQuery) => Promise<GetListResponse>;
|
|
363
434
|
/** Public read-only view of a shared group. Requires only merchant apiKey. */
|
|
364
435
|
getSharedGroup: (groupId: string, query?: GetSharedGroupQuery) => Promise<GroupDetail>;
|
|
365
436
|
};
|
|
@@ -369,6 +440,10 @@ type CreateWishlistStackClientOptions = {
|
|
|
369
440
|
apiKey: string;
|
|
370
441
|
customerAccessToken?: string;
|
|
371
442
|
fetch?: FetchLike;
|
|
443
|
+
/** Default request timeout in ms when a call does not pass `timeoutMs`. */
|
|
444
|
+
defaultTimeoutMs?: number;
|
|
445
|
+
/** When true, retry once on HTTP 429 with jittered backoff (default: false). */
|
|
446
|
+
retryOnRateLimit?: boolean;
|
|
372
447
|
};
|
|
373
448
|
type WishlistStackClient$1 = {
|
|
374
449
|
lists: ReturnType<typeof createListsResource>;
|
|
@@ -389,6 +464,12 @@ type ApiErrorResponse = {
|
|
|
389
464
|
type GetSharedListResponse = GetListResponse;
|
|
390
465
|
type GetSharedGroupResponse = GetGroupResponse;
|
|
391
466
|
|
|
467
|
+
/**
|
|
468
|
+
* True when the value matches the add-items response shape
|
|
469
|
+
* (`{ listId, addedItems, addedCount }`).
|
|
470
|
+
*/
|
|
471
|
+
declare function isAddItemsDeltaResponse(value: AddItemsToListResponse | unknown): value is AddItemsToListResponse;
|
|
472
|
+
|
|
392
473
|
/**
|
|
393
474
|
* Class wrapper around `createWishlistStackClient()` for users who prefer `new`.
|
|
394
475
|
* Exposes `lists`, `groups`, and `shared` resources.
|
|
@@ -412,6 +493,14 @@ type WishlistStackApiErrorDetails<TBody = unknown> = {
|
|
|
412
493
|
method: string;
|
|
413
494
|
requestId?: string;
|
|
414
495
|
body?: TBody;
|
|
496
|
+
/** Value of the `Retry-After` response header when present (seconds or HTTP-date). */
|
|
497
|
+
retryAfter?: string;
|
|
498
|
+
/** Selected rate-limit response headers when present. */
|
|
499
|
+
rateLimit?: {
|
|
500
|
+
limit?: string;
|
|
501
|
+
remaining?: string;
|
|
502
|
+
reset?: string;
|
|
503
|
+
};
|
|
415
504
|
};
|
|
416
505
|
declare class WishlistStackApiError<TBody = unknown> extends Error {
|
|
417
506
|
readonly name = "WishlistStackApiError";
|
|
@@ -420,6 +509,8 @@ declare class WishlistStackApiError<TBody = unknown> extends Error {
|
|
|
420
509
|
readonly method: string;
|
|
421
510
|
readonly requestId?: string;
|
|
422
511
|
readonly body?: TBody;
|
|
512
|
+
readonly retryAfter?: string;
|
|
513
|
+
readonly rateLimit?: WishlistStackApiErrorDetails["rateLimit"];
|
|
423
514
|
constructor(message: string, details: WishlistStackApiErrorDetails<TBody>);
|
|
424
515
|
/**
|
|
425
516
|
* Best-effort extraction of API error items from the response body.
|
|
@@ -439,4 +530,14 @@ declare class WishlistStackApiError<TBody = unknown> extends Error {
|
|
|
439
530
|
*/
|
|
440
531
|
declare function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown>;
|
|
441
532
|
|
|
442
|
-
|
|
533
|
+
/**
|
|
534
|
+
* Clamp a page size to the API-allowed range (1–25) so requests
|
|
535
|
+
* do not send invalid `pageSize` values.
|
|
536
|
+
*/
|
|
537
|
+
declare function clampPageSize(n: number): number;
|
|
538
|
+
/**
|
|
539
|
+
* Clamp a 1-based page index to at least 1.
|
|
540
|
+
*/
|
|
541
|
+
declare function clampPage(n: number): number;
|
|
542
|
+
|
|
543
|
+
export { type AddItemsToListBody, type AddItemsToListDeltaResponse, type AddItemsToListResponse, type ApiErrorItem, type ApiErrorResponse, type CreateGroupBody, type CreateGroupResponse, type CreateListBody, type CreateListResponse, type CreateWishlistStackClientOptions, DEFAULT_PAGE, DEFAULT_PAGE_SIZE, type DuplicateGroupResponse, type DuplicateListBody, type DuplicateListResponse, type FeaturedItem, type GetGroupResponse, type GetGroupsResponse, type GetListResponse, type GetListsResponse, type GetSharedGroupResponse, type GetSharedListResponse, type GroupDetail, type GroupDetailList, type GroupMutationResponse, type GroupSummary, type GroupSummaryList, type HydratedProduct, type HydratedVariant, type HydratedWishlistItem, type Id, type Image, type ListDetail, type ListMutationResponse, type ListSummary, type MarkGroupSharedResponse, type MarkListSharedResponse, type Metafield, type Money, type OkResponse, type PaginatedQuery, type Pagination, type PaginationParams, type RemoveGroupResponse, type RemoveItemFromListResponse, type RemoveListResponse, type ReorderGroupBody, type ReorderGroupResponse, type ReorderGroupsBody, type ReorderGroupsResponse, type ReorderListItemsBody, type ReorderListItemsResponse, type RevokeGroupSharedResponse, type RevokeListSharedResponse, SORT_DIRECTIONS, SORT_FIELDS, type SelectedOption, type SortDirection, type SortField, type SortParams, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, clampPage, clampPageSize, createWishlistStackClient, isAddItemsDeltaResponse, isWishlistStackApiError, withPagination, withSort };
|