dyno-table 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/expression.ts","../../src/utils/debug-expression.ts","../../src/utils/debug-transaction.ts","../../src/builders/transaction-builder.ts"],"names":[],"mappings":";;;AAEO,IAAM,qBAAA,GAAwB,CAAC,MAAA,EAA0B,IAAA,KAAyB;AAEvF,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAElC,MAAA,IAAI,WAAA;AACJ,MAAA,KAAA,MAAW,CAAC,cAAc,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,wBAAwB,CAAA,EAAG;AAC1F,QAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,UAAA,WAAA,GAAc,YAAA;AACd,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,WAAA,GAAc,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,wBAAwB,EAAE,MAAM,CAAA,CAAA;AACrE,QAAA,MAAA,CAAO,wBAAA,CAAyB,WAAW,CAAA,GAAI,OAAA;AAAA,MACjD;AAEA,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,EAC9B;AAIA,EAAA,KAAA,MAAW,CAAC,cAAc,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,wBAAwB,CAAA,EAAG;AAC1F,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,MAAA,CAAO,wBAAwB,EAAE,MAAM,CAAA,CAAA;AACxE,EAAA,MAAA,CAAO,wBAAA,CAAyB,QAAQ,CAAA,GAAI,IAAA;AAC5C,EAAA,OAAO,QAAA;AACT,CAAA;AAEO,IAAM,iBAAA,GAAoB,CAAC,MAAA,EAA0B,KAAA,KAA2B;AACrF,EAAA,MAAM,SAAA,GAAY,CAAA,CAAA,EAAI,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,CAAA,CAAA;AACjD,EAAA,MAAA,CAAO,yBAAA,CAA0B,SAAS,CAAA,GAAI,KAAA;AAC9C,EAAA,OAAO,SAAA;AACT,CAAA;AAEA,IAAM,oBAAoB,CAAC,SAAA,EAAsB,YAAA,GAAe,IAAA,EAAM,gBAAgB,IAAA,KAAe;AACnG,EAAA,IAAI,YAAA,IAAgB,CAAC,SAAA,CAAU,IAAA,EAAM;AACnC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,aAAA,IAAiB,SAAA,CAAU,KAAA,KAAU,MAAA,EAAW;AAClD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACrE;AACF,CAAA;AAEA,IAAM,yBAAA,GAA4B,CAAC,SAAA,EAAsB,QAAA,EAAkB,MAAA,KAAqC;AAC9G,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAE3B,EAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,EAAQ,SAAA,CAAU,KAAK,CAAA;AAE3D,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,SAAS,CAAA,CAAA;AAC7C,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAAC,SAAA,EAAsB,MAAA,KAAqC;AACzF,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAE3B,EAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACnE,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAC7D,EAAA,MAAM,YAAY,iBAAA,CAAkB,MAAA,EAAQ,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,YAAY,iBAAA,CAAkB,MAAA,EAAQ,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA;AAE9D,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,SAAA,EAAY,SAAS,QAAQ,SAAS,CAAA,CAAA;AAC1D,CAAA;AAEA,IAAM,iBAAA,GAAoB,CAAC,SAAA,EAAsB,MAAA,KAAqC;AACpF,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAE3B,EAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACnE,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK;AAChC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAa,UAAU,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,KAAU,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAElF,EAAA,OAAO,GAAG,QAAQ,CAAA,KAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AACjD,CAAA;AAEA,IAAM,uBAAA,GAA0B,CAAC,YAAA,EAAsB,SAAA,EAAsB,MAAA,KAAqC;AAChH,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAE3B,EAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,EAAQ,SAAA,CAAU,KAAK,CAAA;AAE3D,EAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,KAAK,SAAS,CAAA,CAAA,CAAA;AAClD,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAAC,YAAA,EAAsB,SAAA,EAAsB,MAAA,KAAqC;AAC/G,EAAA,iBAAA,CAAkB,SAAA,EAAW,MAAM,KAAK,CAAA;AAExC,EAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA;AAC7D,EAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA;AACpC,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAAC,QAAA,EAAkB,UAAA,EAAyB,MAAA,KAAqC;AAC9G,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,QAAQ,CAAA,WAAA,CAAa,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,WAAA,GAAc,WAAW,GAAA,CAAI,CAAC,MAAM,eAAA,CAAgB,CAAA,EAAG,MAAM,CAAC,CAAA;AACpE,EAAA,OAAO,IAAI,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAC,CAAA,CAAA,CAAA;AAC9C,CAAA;AAEO,IAAM,eAAA,GAAkB,CAAC,SAAA,EAAsB,MAAA,KAAqC;AACzF,EAAA,IAAI,CAAC,WAAW,OAAO,EAAA;AAEvB,EAAA,IAAI;AAEF,IAAA,MAAM,kBAAA,GAAiF;AAAA,MACrF,EAAA,EAAI,MAAM,yBAAA,CAA0B,SAAA,EAAW,KAAK,MAAM,CAAA;AAAA,MAC1D,EAAA,EAAI,MAAM,yBAAA,CAA0B,SAAA,EAAW,MAAM,MAAM,CAAA;AAAA,MAC3D,EAAA,EAAI,MAAM,yBAAA,CAA0B,SAAA,EAAW,KAAK,MAAM,CAAA;AAAA,MAC1D,GAAA,EAAK,MAAM,yBAAA,CAA0B,SAAA,EAAW,MAAM,MAAM,CAAA;AAAA,MAC5D,EAAA,EAAI,MAAM,yBAAA,CAA0B,SAAA,EAAW,KAAK,MAAM,CAAA;AAAA,MAC1D,GAAA,EAAK,MAAM,yBAAA,CAA0B,SAAA,EAAW,MAAM,MAAM,CAAA;AAAA,MAC5D,OAAA,EAAS,MAAM,sBAAA,CAAuB,SAAA,EAAW,MAAM,CAAA;AAAA,MACvD,EAAA,EAAI,MAAM,iBAAA,CAAkB,SAAA,EAAW,MAAM,CAAA;AAAA,MAC7C,UAAA,EAAY,MAAM,uBAAA,CAAwB,aAAA,EAAe,WAAW,MAAM,CAAA;AAAA,MAC1E,QAAA,EAAU,MAAM,uBAAA,CAAwB,UAAA,EAAY,WAAW,MAAM,CAAA;AAAA,MACrE,eAAA,EAAiB,MAAM,sBAAA,CAAuB,kBAAA,EAAoB,WAAW,MAAM,CAAA;AAAA,MACnF,kBAAA,EAAoB,MAAM,sBAAA,CAAuB,sBAAA,EAAwB,WAAW,MAAM,CAAA;AAAA,MAC1F,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AACzB,UAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,QACjE;AACA,QAAA,OAAO,sBAAA,CAAuB,KAAA,EAAO,SAAA,CAAU,UAAA,EAAY,MAAM,CAAA;AAAA,MACnE,CAAA;AAAA,MACA,IAAI,MAAM;AACR,QAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AACzB,UAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,QAChE;AACA,QAAA,OAAO,sBAAA,CAAuB,IAAA,EAAM,SAAA,CAAU,UAAA,EAAY,MAAM,CAAA;AAAA,MAClE,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,UAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,QAC1D;AACA,QAAA,OAAO,CAAA,KAAA,EAAQ,eAAA,CAAgB,SAAA,CAAU,SAAA,EAAW,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7D;AAAA,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,SAAA,CAAU,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,OAAA,EAAQ;AAAA,EACjB,SAAS,KAAA,EAAgB;AACvB,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAA,CAAQ,MAAM,CAAA,6CAAA,EAAgD,SAAA,CAAU,IAAI,CAAA,CAAA,CAAA,EAAK,MAAM,OAAO,CAAA;AAAA,IAChG,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6CAAA,EAAgD,SAAA,CAAU,IAAI,KAAK,KAAK,CAAA;AAAA,IACxF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;AAEO,IAAM,uBAAA,GAA0B,CACrC,SAAA,KAKG;AACH,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AAExB,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,0BAA0B,EAAC;AAAA,IAC3B,2BAA2B,EAAC;AAAA,IAC5B,YAAA,EAAc,EAAE,KAAA,EAAO,CAAA;AAAE,GAC3B;AAEA,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,SAAA,EAAW,MAAM,CAAA;AAEpD,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,KAAA,EAAO,OAAO,IAAA,CAAK,MAAA,CAAO,wBAAwB,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,wBAAA,GAA2B,MAAA;AAAA,IACnG,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA,CAAO,yBAAyB,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,yBAAA,GAA4B;AAAA,GACxG;AACF,CAAA;;;AChMO,SAAS,aACd,OAAA,EAIA;AAEA,EAAA,MAAM,SAAgC,EAAC;AAEvC,EAAA,SAAS,eAAe,gBAAA,EAA0B;AAChD,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,IAAI,cAAA,GAAiB,gBAAA;AACrB,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,wBAAA,EAA0B;AACpD,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,wBAAA,CAAyB,KAAK,CAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA,EAAO,GAAG,CAAA;AAEnC,MAAA,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,aAAuB,CAAA;AAAA,IACxE;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,yBAAA,EAA2B;AACrD,MAAA,IAAI,cAAA,GAAiB,OAAA,CAAQ,yBAAA,CAA0B,KAAK,CAAA;AAG5D,MAAA,IAAI,0BAA0B,GAAA,EAAK;AACjC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AACvC,QAAA,cAAA,GAAiB,CAAA,IAAA,EAAO,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACzF,CAAA,MAAO;AAEL,QAAA,cAAA,GAAiB,IAAA,CAAK,UAAU,cAAc,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA,EAAO,GAAG,CAAA;AACnC,MAAA,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,cAAwB,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,IAAA,MAAA,CAAO,gBAAA,GAAmB,cAAA,CAAe,OAAA,CAAQ,gBAAgB,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,IAAA,MAAA,CAAO,mBAAA,GAAsB,cAAA,CAAe,OAAA,CAAQ,mBAAmB,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,IAAA,MAAA,CAAO,gBAAA,GAAmB,cAAA,CAAe,OAAA,CAAQ,gBAAgB,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,IAAA,MAAA,CAAO,sBAAA,GAAyB,cAAA,CAAe,OAAA,CAAQ,sBAAsB,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,IAAA,MAAA,CAAO,oBAAA,GAAuB,cAAA,CAAe,OAAA,CAAQ,oBAAoB,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,OAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACZ;AACF;;;AChFO,SAAS,qBAAqB,IAAA,EAAgD;AACnF,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,GACzB;AAGA,EAAA,IAAI,KAAA,IAAS,KAAK,MAAA,EAAQ;AACxB,IAAA,MAAA,CAAO,GAAA,GAAM,KAAK,MAAA,CAAO,GAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,MAAA,CAAO,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EAC5B;AAGA,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,KAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,MAAA,CAAO,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,CAAE,QAAA;AAC5C,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,MAAA,CAAO,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,CAAE,QAAA;AAC5C,MAAA;AAAA;AAGJ,EAAA,OAAO,MAAA;AACT;AASO,SAAS,iBAAiB,KAAA,EAAqD;AACpF,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,oBAAA,CAAqB,IAAI,CAAC,CAAA;AACvD;;;ACyCO,IAAM,qBAAN,MAAyB;AAAA,EACtB,QAA2B,EAAC;AAAA,EAC5B,UAA8B,EAAC;AAAA,EAC/B,WAAA;AAAA,EACS,QAAA;AAAA,EAEjB,WAAA,CAAY,UAA+B,WAAA,EAA0B;AACnE,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,CAAsB,WAAmB,OAAA,EAA2B;AAC1E,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,CAAY,YAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,OAAA,IAAW,EAAA;AAG3C,IAAA,MAAM,OAAA,GAAU,QAAQ,MAAM,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAA,GAAS,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAE3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AAE9C,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,aAAA;AAEJ,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,KAAA;AACH,UAAA,aAAA,GAAgB,KAAK,MAAA,CAAO,SAAA;AAE5B,UAAA,OAAA,GAAU,KAAK,MAAA,CAAO,IAAA;AACtB,UAAA;AAAA,QACF,KAAK,QAAA;AAAA,QACL,KAAK,QAAA;AAAA,QACL,KAAK,gBAAA;AACH,UAAA,aAAA,GAAgB,KAAK,MAAA,CAAO,SAAA;AAC5B,UAAA,OAAA,GAAU,KAAK,MAAA,CAAO,GAAA;AACtB,UAAA;AAAA;AAIJ,MAAA,IAAI,aAAA,KAAkB,aAAa,OAAA,EAAS;AAC1C,QAAA,MAAM,WAAA,GAAc,QAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,WAAA,GAAc,MAAA,GAAS,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAG/C,QAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,UAAA,IAAI,OAAA,KAAY,MAAA,IAAa,WAAA,KAAgB,MAAA,EAAW;AACtD,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,IAAI,OAAA,KAAY,MAAA,IAAa,WAAA,KAAgB,MAAA,IAAa,YAAY,WAAA,EAAa;AACjF,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,iDAAiD,SAAS,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,MAAM,IAAI,OAAA,KAAY,MAAA,GAAY,MAAA,CAAO,OAAO,IAAI,WAAW,CAAA,0EAAA;AAAA,OAC9J;AAAA,IACF;AAAA,EACF;AAAA,EAEA,yBAAyB,GAAA,EAAkC;AAEzD,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,CAAC,IAAA,CAAK,WAAA,CAAY,YAAY,GAAG,GAAA,CAAI;AAAA,KACvC;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,OAAA,EAAS;AAC5B,MAAA,IAAI,GAAA,CAAI,OAAO,MAAA,EAAW;AACxB,QAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,MAC7D;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,GAAI,GAAA,CAAI,EAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;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,EAyCA,GAAA,CAA0B,SAAA,EAAmB,IAAA,EAAS,SAAA,EAA6B;AAEjF,IAAA,IAAA,CAAK,qBAAA,CAAsB,WAAW,IAAI,CAAA;AAE1C,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO,GAAI,wBAAwB,SAAS,CAAA;AACvE,MAAA,eAAA,CAAgB,OAAO,mBAAA,GAAsB,UAAA;AAC7C,MAAA,eAAA,CAAgB,OAAO,wBAAA,GAA2B,KAAA;AAClD,MAAA,eAAA,CAAgB,OAAO,yBAAA,GAA4B,MAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,eAAe,OAAA,EAA+C;AAE5D,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAE1D,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,EAwCA,MAAA,CAAO,SAAA,EAAmB,GAAA,EAAkC,SAAA,EAA2C;AACrG,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,wBAAA,CAAyB,GAAG,CAAA;AAGtD,IAAA,IAAA,CAAK,qBAAA,CAAsB,WAAW,YAAY,CAAA;AAElD,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,SAAA;AAAA,QACA,GAAA,EAAK;AAAA;AACP,KACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO,GAAI,wBAAwB,SAAS,CAAA;AACvE,MAAA,eAAA,CAAgB,OAAO,mBAAA,GAAsB,UAAA;AAC7C,MAAA,eAAA,CAAgB,OAAO,wBAAA,GAA2B,KAAA;AAClD,MAAA,eAAA,CAAgB,OAAO,yBAAA,GAA4B,MAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,EA2BA,kBAAkB,OAAA,EAAoC;AAIpD,IAAA,IAAI,oBAAA;AACJ,IAAA,IAAI,iBAAA;AAGJ,IAAA,IAAI,OAAO,QAAQ,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,KAAQ,IAAA,IAAQ,IAAA,IAAQ,OAAA,CAAQ,GAAA,EAAK;AAElF,MAAA,iBAAA,GAAoB,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,GAAkC,CAAA;AAC5F,MAAA,oBAAA,GAAuB,iBAAA;AAAA,IACzB,CAAA,MAAO;AAEL,MAAA,iBAAA,GAAoB,OAAA,CAAQ,GAAA;AAC5B,MAAA,oBAAA,GAAuB,OAAA,CAAQ,GAAA;AAAA,IACjC;AAGA,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,SAAA,EAAW,oBAAoB,CAAA;AAElE,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,GAAG,OAAA;AAAA,QACH,GAAA,EAAK;AAAA;AACP,KACF;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,OACE,SAAA,EACA,GAAA,EACA,gBAAA,EACA,wBAAA,EACA,2BACA,SAAA,EACM;AACN,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,wBAAA,CAAyB,GAAG,CAAA;AAGtD,IAAA,IAAA,CAAK,qBAAA,CAAsB,WAAW,YAAY,CAAA;AAElD,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,SAAA;AAAA,QACA,GAAA,EAAK,YAAA;AAAA,QACL,gBAAA;AAAA,QACA,wBAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO,GAAI,wBAAwB,SAAS,CAAA;AACvE,MAAA,eAAA,CAAgB,OAAO,mBAAA,GAAsB,UAAA;AAG7C,MAAA,eAAA,CAAgB,OAAO,wBAAA,GAA2B;AAAA,QAChD,GAAG,gBAAgB,MAAA,CAAO,wBAAA;AAAA,QAC1B,GAAG;AAAA,OACL;AAEA,MAAA,eAAA,CAAgB,OAAO,yBAAA,GAA4B;AAAA,QACjD,GAAG,gBAAgB,MAAA,CAAO,yBAAA;AAAA,QAC1B,GAAG;AAAA,OACL;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,EA8BA,kBAAkB,OAAA,EAAkD;AAIlE,IAAA,IAAI,oBAAA;AACJ,IAAA,IAAI,iBAAA;AAGJ,IAAA,IAAI,OAAO,QAAQ,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,KAAQ,IAAA,IAAQ,IAAA,IAAQ,OAAA,CAAQ,GAAA,EAAK;AAElF,MAAA,iBAAA,GAAoB,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,GAAkC,CAAA;AAC5F,MAAA,oBAAA,GAAuB,iBAAA;AAAA,IACzB,CAAA,MAAO;AAEL,MAAA,iBAAA,GAAoB,OAAA,CAAQ,GAAA;AAC5B,MAAA,oBAAA,GAAuB,OAAA,CAAQ,GAAA;AAAA,IACjC;AAGA,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,SAAA,EAAW,oBAAoB,CAAA;AAElE,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,GAAG,OAAA;AAAA,QACH,GAAA,EAAK;AAAA;AACP,KACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,EAgDA,cAAA,CAAe,SAAA,EAAmB,GAAA,EAAkC,SAAA,EAA0C;AAC5G,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,wBAAA,CAAyB,GAAG,CAAA;AAGtD,IAAA,IAAA,CAAK,qBAAA,CAAsB,WAAW,YAAY,CAAA;AAElD,IAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO,GAAI,wBAAwB,SAAS,CAAA;AAEvE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,gBAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,SAAA;AAAA,QACA,GAAA,EAAK,YAAA;AAAA,QACL,mBAAA,EAAqB,UAAA;AAAA,QACrB,wBAAA,EAA0B,KAAA;AAAA,QAC1B,yBAAA,EAA2B;AAAA;AAC7B,KACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,EA4BA,0BAA0B,OAAA,EAA0D;AAIlF,IAAA,IAAI,oBAAA;AACJ,IAAA,IAAI,iBAAA;AAGJ,IAAA,IAAI,OAAO,QAAQ,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,KAAQ,IAAA,IAAQ,IAAA,IAAQ,OAAA,CAAQ,GAAA,EAAK;AAElF,MAAA,iBAAA,GAAoB,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,GAAkC,CAAA;AAC5F,MAAA,oBAAA,GAAuB,iBAAA;AAAA,IACzB,CAAA,MAAO;AAEL,MAAA,iBAAA,GAAoB,OAAA,CAAQ,GAAA;AAC5B,MAAA,oBAAA,GAAuB,OAAA,CAAQ,GAAA;AAAA,IACjC;AAGA,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,SAAA,EAAW,oBAAoB,CAAA;AAElE,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,gBAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,GAAG,OAAA;AAAA,QACH,GAAA,EAAK;AAAA;AACP,KACF;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,eAAe,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;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,YAAY,OAAA,EAAiD;AAC3D,IAAA,IAAA,CAAK,UAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,OAAA,EAAQ;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;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,EA2BA,KAAA,GAAQ;AACN,IAAA,OAAO,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,EACpC;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,EAqCA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC7C,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,KAAA;AACH,UAAA,OAAO;AAAA,YACL,GAAA,EAAK;AAAA,cACH,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,cACvB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,cAClB,mBAAA,EAAqB,KAAK,MAAA,CAAO,mBAAA;AAAA,cACjC,wBAAA,EAA0B,KAAK,MAAA,CAAO,wBAAA;AAAA,cACtC,yBAAA,EAA2B,KAAK,MAAA,CAAO;AAAA;AACzC,WACF;AAAA,QACF,KAAK,QAAA;AACH,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ;AAAA,cACN,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,cACvB,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,cACjB,mBAAA,EAAqB,KAAK,MAAA,CAAO,mBAAA;AAAA,cACjC,wBAAA,EAA0B,KAAK,MAAA,CAAO,wBAAA;AAAA,cACtC,yBAAA,EAA2B,KAAK,MAAA,CAAO;AAAA;AACzC,WACF;AAAA,QACF,KAAK,QAAA;AACH,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ;AAAA,cACN,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,cACvB,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,cACjB,gBAAA,EAAkB,KAAK,MAAA,CAAO,gBAAA;AAAA,cAC9B,mBAAA,EAAqB,KAAK,MAAA,CAAO,mBAAA;AAAA,cACjC,wBAAA,EAA0B,KAAK,MAAA,CAAO,wBAAA;AAAA,cACtC,yBAAA,EAA2B,KAAK,MAAA,CAAO;AAAA;AACzC,WACF;AAAA,QACF,KAAK,gBAAA;AACH,UAAA,OAAO;AAAA,YACL,cAAA,EAAgB;AAAA,cACd,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,cACvB,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,cACjB,mBAAA,EAAqB,KAAK,MAAA,CAAO,mBAAA;AAAA,cACjC,wBAAA,EAA0B,KAAK,MAAA,CAAO,wBAAA;AAAA,cACtC,yBAAA,EAA2B,KAAK,MAAA,CAAO;AAAA;AACzC,WACF;AAAA,QACF,SAAS;AAEP,UAAA,MAAM,eAAA,GAAyB,IAAA;AAC/B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,MAAA,CAAO,eAAe,CAAC,CAAA,CAAE,CAAA;AAAA,QACjF;AAAA;AACF,IACF,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAoC;AAAA,MACxC,aAAA,EAAe,aAAA;AAAA,MACf,kBAAA,EAAoB,KAAK,OAAA,CAAQ,kBAAA;AAAA,MACjC,sBAAA,EAAwB,KAAK,OAAA,CAAQ,sBAAA;AAAA,MACrC,2BAAA,EAA6B,KAAK,OAAA,CAAQ;AAAA,KAC5C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,CAAA;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF","file":"transaction-builder.cjs","sourcesContent":["import type { ComparisonOperator, Condition, ExpressionParams, LogicalOperator } from \"./conditions\";\n\nexport const generateAttributeName = (params: ExpressionParams, attr: string): string => {\n // Handle nested paths by splitting on dots\n if (attr.includes(\".\")) {\n const pathSegments = attr.split(\".\");\n const segmentNames: string[] = [];\n\n for (const segment of pathSegments) {\n // Check if this segment already exists in expressionAttributeNames\n let segmentName: string | undefined;\n for (const [existingName, existingAttr] of Object.entries(params.expressionAttributeNames)) {\n if (existingAttr === segment) {\n segmentName = existingName;\n break;\n }\n }\n\n // If not found, create a new attribute name for this segment\n if (!segmentName) {\n segmentName = `#${Object.keys(params.expressionAttributeNames).length}`;\n params.expressionAttributeNames[segmentName] = segment;\n }\n\n segmentNames.push(segmentName);\n }\n\n return segmentNames.join(\".\");\n }\n\n // Handle single-level attributes (original logic)\n // Check if the attribute already exists in the expressionAttributeNames\n for (const [existingName, existingAttr] of Object.entries(params.expressionAttributeNames)) {\n if (existingAttr === attr) {\n return existingName;\n }\n }\n\n // If not found, create a new attribute name\n const attrName = `#${Object.keys(params.expressionAttributeNames).length}`;\n params.expressionAttributeNames[attrName] = attr;\n return attrName;\n};\n\nexport const generateValueName = (params: ExpressionParams, value: unknown): string => {\n const valueName = `:${params.valueCounter.count++}`;\n params.expressionAttributeValues[valueName] = value;\n return valueName;\n};\n\nconst validateCondition = (condition: Condition, requiresAttr = true, requiresValue = true): void => {\n if (requiresAttr && !condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n if (requiresValue && condition.value === undefined) {\n throw new Error(`Value is required for ${condition.type} condition`);\n }\n};\n\nconst buildComparisonExpression = (condition: Condition, operator: string, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const valueName = generateValueName(params, condition.value);\n\n return `${attrName} ${operator} ${valueName}`;\n};\n\nconst buildBetweenExpression = (condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n if (!Array.isArray(condition.value) || condition.value.length !== 2) {\n throw new Error(\"Between condition requires an array of two values\");\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const lowerName = generateValueName(params, condition.value[0]);\n const upperName = generateValueName(params, condition.value[1]);\n\n return `${attrName} BETWEEN ${lowerName} AND ${upperName}`;\n};\n\nconst buildInExpression = (condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n throw new Error(\"In condition requires a non-empty array of values\");\n }\n\n if (condition.value.length > 100) {\n throw new Error(\"In condition supports a maximum of 100 values\");\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const valueNames = condition.value.map((value) => generateValueName(params, value));\n\n return `${attrName} IN (${valueNames.join(\", \")})`;\n};\n\nconst buildFunctionExpression = (functionName: string, condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const valueName = generateValueName(params, condition.value);\n\n return `${functionName}(${attrName}, ${valueName})`;\n};\n\nconst buildAttributeFunction = (functionName: string, condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition, true, false);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n return `${functionName}(${attrName})`;\n};\n\nconst buildLogicalExpression = (operator: string, conditions: Condition[], params: ExpressionParams): string => {\n if (!conditions || conditions.length === 0) {\n throw new Error(`At least one condition is required for ${operator} expression`);\n }\n\n const expressions = conditions.map((c) => buildExpression(c, params));\n return `(${expressions.join(` ${operator} `)})`;\n};\n\nexport const buildExpression = (condition: Condition, params: ExpressionParams): string => {\n if (!condition) return \"\";\n\n try {\n // Map of condition types to their expression builders\n const expressionBuilders: Record<ComparisonOperator | LogicalOperator, () => string> = {\n eq: () => buildComparisonExpression(condition, \"=\", params),\n ne: () => buildComparisonExpression(condition, \"<>\", params),\n lt: () => buildComparisonExpression(condition, \"<\", params),\n lte: () => buildComparisonExpression(condition, \"<=\", params),\n gt: () => buildComparisonExpression(condition, \">\", params),\n gte: () => buildComparisonExpression(condition, \">=\", params),\n between: () => buildBetweenExpression(condition, params),\n in: () => buildInExpression(condition, params),\n beginsWith: () => buildFunctionExpression(\"begins_with\", condition, params),\n contains: () => buildFunctionExpression(\"contains\", condition, params),\n attributeExists: () => buildAttributeFunction(\"attribute_exists\", condition, params),\n attributeNotExists: () => buildAttributeFunction(\"attribute_not_exists\", condition, params),\n and: () => {\n if (!condition.conditions) {\n throw new Error(\"Conditions array is required for AND operator\");\n }\n return buildLogicalExpression(\"AND\", condition.conditions, params);\n },\n or: () => {\n if (!condition.conditions) {\n throw new Error(\"Conditions array is required for OR operator\");\n }\n return buildLogicalExpression(\"OR\", condition.conditions, params);\n },\n not: () => {\n if (!condition.condition) {\n throw new Error(\"Condition is required for NOT operator\");\n }\n return `NOT (${buildExpression(condition.condition, params)})`;\n },\n };\n\n const builder = expressionBuilders[condition.type];\n if (!builder) {\n throw new Error(`Unknown condition type: ${condition.type}`);\n }\n\n return builder();\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(`Error building expression for condition type ${condition.type}:`, error.message);\n } else {\n console.error(`Error building expression for condition type ${condition.type}:`, error);\n }\n throw error;\n }\n};\n\nexport const prepareExpressionParams = (\n condition?: Condition,\n): {\n expression?: string;\n names?: Record<string, string>;\n values?: Record<string, unknown>;\n} => {\n if (!condition) return {};\n\n const params: ExpressionParams = {\n expressionAttributeNames: {},\n expressionAttributeValues: {},\n valueCounter: { count: 0 },\n };\n\n const expression = buildExpression(condition, params);\n\n return {\n expression,\n names: Object.keys(params.expressionAttributeNames).length > 0 ? params.expressionAttributeNames : undefined,\n values: Object.keys(params.expressionAttributeValues).length > 0 ? params.expressionAttributeValues : undefined,\n };\n};\n","/**\n * Interface for DynamoDB command objects that can contain expressions\n */\nexport interface DynamoCommandWithExpressions {\n conditionExpression?: string;\n updateExpression?: string;\n filterExpression?: string;\n keyConditionExpression?: string;\n projectionExpression?: string;\n expressionAttributeNames?: Record<string, string>;\n expressionAttributeValues?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ntype ReadableDynamoCommand = {\n conditionExpression?: string;\n updateExpression?: string;\n filterExpression?: string;\n keyConditionExpression?: string;\n projectionExpression?: string;\n};\n\n/**\n * Utility function to debug a DynamoDB command by replacing all placeholders\n * in expressions with their actual values.\n *\n * @param command Any DynamoDB command with expressions and attribute maps\n * @returns An object with the same structure but with readable expressions\n */\nexport function debugCommand<T extends DynamoCommandWithExpressions>(\n command: T,\n): {\n raw: T;\n readable: ReadableDynamoCommand;\n} {\n // Create a copy of the command\n const result: ReadableDynamoCommand = {};\n\n function replaceAliases(expressionString: string) {\n if (!expressionString) {\n return expressionString;\n }\n\n let replacedString = expressionString;\n for (const alias in command.expressionAttributeNames) {\n const attributeName = command.expressionAttributeNames[alias];\n const regex = new RegExp(alias, \"g\");\n\n replacedString = replacedString.replace(regex, attributeName as string);\n }\n\n for (const alias in command.expressionAttributeValues) {\n let attributeValue = command.expressionAttributeValues[alias];\n\n // Handle Set objects for better readability\n if (attributeValue instanceof Set) {\n const array = Array.from(attributeValue);\n attributeValue = `Set(${array.length}){${array.map((v) => JSON.stringify(v)).join(\", \")}}`;\n } else {\n // Stringify other values for display\n attributeValue = JSON.stringify(attributeValue);\n }\n\n const regex = new RegExp(alias, \"g\");\n replacedString = replacedString.replace(regex, attributeValue as string);\n }\n\n return replacedString;\n }\n\n if (command.updateExpression) {\n result.updateExpression = replaceAliases(command.updateExpression);\n }\n if (command.conditionExpression) {\n result.conditionExpression = replaceAliases(command.conditionExpression);\n }\n if (command.filterExpression) {\n result.filterExpression = replaceAliases(command.filterExpression);\n }\n if (command.keyConditionExpression) {\n result.keyConditionExpression = replaceAliases(command.keyConditionExpression);\n }\n if (command.projectionExpression) {\n result.projectionExpression = replaceAliases(command.projectionExpression);\n }\n\n return {\n raw: command,\n readable: result,\n };\n}\n","import type { TransactionItem } from \"../builders/builder-types\";\nimport { debugCommand } from \"./debug-expression\";\n\n/**\n * Utility function to create a human-readable representation of a transaction item\n * by replacing all expression placeholders with their actual values.\n *\n * @param item The transaction item to debug\n * @returns A readable representation of the transaction item\n */\nexport function debugTransactionItem(item: TransactionItem): Record<string, unknown> {\n const result: Record<string, unknown> = {\n type: item.type,\n tableName: item.params.tableName,\n };\n\n // Add key if present\n if (\"key\" in item.params) {\n result.key = item.params.key;\n }\n\n // Add item if present (for Put operations)\n if (item.type === \"Put\") {\n result.item = item.params.item;\n }\n\n // Add readable expressions based on operation type\n switch (item.type) {\n case \"Put\":\n case \"Delete\":\n case \"ConditionCheck\":\n result.readable = debugCommand(item.params).readable;\n break;\n case \"Update\":\n result.readable = debugCommand(item.params).readable;\n break;\n }\n\n return result;\n}\n\n/**\n * Utility function to create a human-readable representation of all transaction items\n * in a transaction by replacing all expression placeholders with their actual values.\n *\n * @param items Array of transaction items to debug\n * @returns An array of readable representations of the transaction items\n */\nexport function debugTransaction(items: TransactionItem[]): Record<string, unknown>[] {\n return items.map((item) => debugTransactionItem(item));\n}\n","import type { TransactWriteCommandInput } from \"@aws-sdk/lib-dynamodb\";\nimport type { Condition, PrimaryKeyWithoutExpression } from \"../conditions\";\nimport { prepareExpressionParams } from \"../expression\";\nimport { debugTransaction } from \"../utils/debug-transaction\";\nimport type {\n ConditionCheckCommandParams,\n DeleteCommandParams,\n PutCommandParams,\n TransactionItem,\n UpdateCommandParams,\n} from \"./builder-types\";\nimport type { DynamoItem } from \"../types\";\n\n/**\n * Configuration options for DynamoDB transactions.\n */\nexport interface TransactionOptions {\n /** Unique identifier for the transaction request (idempotency token) */\n clientRequestToken?: string;\n /** Level of consumed capacity details to return */\n returnConsumedCapacity?: \"INDEXES\" | \"TOTAL\" | \"NONE\";\n /** Whether to return item collection metrics */\n returnItemCollectionMetrics?: \"SIZE\" | \"NONE\";\n}\n\n/**\n * Configuration for table indexes used in duplicate detection.\n * Defines the key structure for checking uniqueness constraints.\n */\ninterface IndexConfig {\n /** The partition key attribute name */\n partitionKey: string;\n /** Optional sort key attribute name */\n sortKey?: string;\n}\n\n/**\n * Function type for executing DynamoDB transaction operations.\n * @param params - The complete transaction command input\n * @returns A promise that resolves when the transaction completes\n */\nexport type TransactionExecutor = (params: TransactWriteCommandInput) => Promise<void>;\n\n/**\n * Builder for creating and executing DynamoDB transactions.\n * Use this builder when you need to:\n * - Perform multiple operations atomically\n * - Ensure data consistency across operations\n * - Implement complex business logic that requires atomic updates\n * - Prevent duplicate items across tables\n *\n * The builder supports:\n * - Put operations (insert/replace items)\n * - Delete operations\n * - Update operations\n * - Condition checks\n * - Duplicate detection\n * - Transaction-wide options\n *\n * @example\n * ```typescript\n * // Create a transaction with multiple operations\n * const transaction = new TransactionBuilder(executor, {\n * partitionKey: 'id',\n * sortKey: 'type'\n * });\n *\n * // Add a new order\n * transaction.put('orders', {\n * orderId: '123',\n * status: 'PENDING'\n * });\n *\n * // Update inventory with condition\n * transaction.update(\n * 'inventory',\n * { productId: 'ABC' },\n * 'set quantity = quantity - :amount',\n * { ':amount': 1 },\n * op => op.gte('quantity', 1)\n * );\n *\n * // Execute the transaction atomically\n * await transaction.execute();\n * ```\n *\n * Note: DynamoDB transactions have some limitations:\n * - Maximum 25 operations per transaction\n * - All operations must be in the same AWS region\n * - Cannot include table scans or queries\n */\nexport class TransactionBuilder {\n private items: TransactionItem[] = [];\n private options: TransactionOptions = {};\n private indexConfig: IndexConfig;\n private readonly executor: TransactionExecutor;\n\n constructor(executor: TransactionExecutor, indexConfig: IndexConfig) {\n this.executor = executor;\n this.indexConfig = indexConfig;\n }\n\n /**\n * Checks if an item with the same primary key already exists in the transaction\n * @private\n */\n private checkForDuplicateItem(tableName: string, newItem: DynamoItem): void {\n const pkName = this.indexConfig.partitionKey;\n const skName = this.indexConfig.sortKey ?? \"\";\n\n // Extract the primary key values from the provided key\n const pkValue = newItem[pkName];\n const skValue = skName ? newItem[skName] : undefined;\n\n if (!pkValue) {\n throw new Error(`Primary key value for '${pkName}' is missing`);\n }\n\n const duplicateItem = this.items.find((item) => {\n // Get the key from the item based on its type\n let itemKey: Record<string, unknown> | undefined;\n let itemTableName: string | undefined;\n\n switch (item.type) {\n case \"Put\":\n itemTableName = item.params.tableName;\n // For Put operations, the key is part of the item\n itemKey = item.params.item;\n break;\n case \"Update\":\n case \"Delete\":\n case \"ConditionCheck\":\n itemTableName = item.params.tableName;\n itemKey = item.params.key;\n break;\n }\n\n // Check if the table name and keys match\n if (itemTableName === tableName && itemKey) {\n const itemPkValue = itemKey[pkName];\n const itemSkValue = skName ? itemKey[skName] : undefined;\n\n // Match if partition keys match and either both sort keys match or both are undefined\n if (itemPkValue === pkValue) {\n if (skValue === undefined && itemSkValue === undefined) {\n return true;\n }\n if (skValue !== undefined && itemSkValue !== undefined && skValue === itemSkValue) {\n return true;\n }\n }\n }\n\n return false;\n });\n\n if (duplicateItem) {\n throw new Error(\n `Duplicate item detected in transaction: Table=${tableName}, ${pkName}=${String(pkValue)}, ${skName}=${skValue !== undefined ? String(skValue) : \"undefined\"}. DynamoDB transactions do not allow multiple operations on the same item.`,\n );\n }\n }\n\n createKeyForPrimaryIndex(key: PrimaryKeyWithoutExpression) {\n // Turn the pk/sk into the key object\n const keyCondition = {\n [this.indexConfig.partitionKey]: key.pk,\n };\n\n if (this.indexConfig.sortKey) {\n if (key.sk === undefined) {\n throw new Error(\"Sort key is required for delete operation\");\n }\n keyCondition[this.indexConfig.sortKey] = key.sk;\n }\n\n return keyCondition;\n }\n\n /**\n * Adds a put operation to the transaction.\n *\n * The method automatically checks for duplicate items within the transaction\n * to prevent multiple operations on the same item.\n *\n * @example\n * ```typescript\n * // Simple put operation\n * transaction.put('orders', {\n * orderId: '123',\n * status: 'PENDING',\n * amount: 100\n * });\n *\n * // Conditional put operation\n * transaction.put(\n * 'inventory',\n * { productId: 'ABC', quantity: 50 },\n * op => op.attributeNotExists('productId')\n * );\n *\n * // Put with complex condition\n * transaction.put(\n * 'users',\n * { userId: '123', status: 'ACTIVE' },\n * op => op.and([\n * op.attributeNotExists('userId'),\n * op.beginsWith('status', 'ACTIVE')\n * ])\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param item - The item to put into the table\n * @param condition - Optional condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n */\n put<T extends DynamoItem>(tableName: string, item: T, condition?: Condition): this {\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, item);\n\n const transactionItem: TransactionItem = {\n type: \"Put\",\n params: {\n tableName,\n item,\n },\n };\n\n if (condition) {\n const { expression, names, values } = prepareExpressionParams(condition);\n transactionItem.params.conditionExpression = expression;\n transactionItem.params.expressionAttributeNames = names;\n transactionItem.params.expressionAttributeValues = values;\n }\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured put operation to the transaction.\n *\n * This method is particularly useful when working with PutBuilder\n * to maintain consistency in put operations across your application.\n *\n * @example\n * ```typescript\n * // Create a put command with PutBuilder\n * const putCommand = new PutBuilder(executor, newItem, 'users')\n * .condition(op => op.attributeNotExists('userId'))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.putWithCommand(putCommand);\n * ```\n *\n * @param command - The complete put command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see PutBuilder for creating put commands\n */\n putWithCommand(command: PutCommandParams): TransactionBuilder {\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, command.item);\n\n const transactionItem: TransactionItem = {\n type: \"Put\",\n params: command,\n };\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a delete operation to the transaction.\n *\n * The method automatically checks for duplicate items within the transaction\n * to prevent multiple operations on the same item.\n *\n * @example\n * ```typescript\n * // Simple delete operation\n * transaction.delete('orders', {\n * pk: 'ORDER#123',\n * sk: 'METADATA'\n * });\n *\n * // Conditional delete operation\n * transaction.delete(\n * 'users',\n * { pk: 'USER#123' },\n * op => op.eq('status', 'INACTIVE')\n * );\n *\n * // Delete with complex condition\n * transaction.delete(\n * 'products',\n * { pk: 'PROD#ABC' },\n * op => op.and([\n * op.eq('status', 'DRAFT'),\n * op.lt('version', 5)\n * ])\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param key - The primary key of the item to delete\n * @param condition - Optional condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n */\n delete(tableName: string, key: PrimaryKeyWithoutExpression, condition?: Condition): TransactionBuilder {\n const keyCondition = this.createKeyForPrimaryIndex(key);\n\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, keyCondition);\n\n const transactionItem: TransactionItem = {\n type: \"Delete\",\n params: {\n tableName,\n key: keyCondition,\n },\n };\n\n if (condition) {\n const { expression, names, values } = prepareExpressionParams(condition);\n transactionItem.params.conditionExpression = expression;\n transactionItem.params.expressionAttributeNames = names;\n transactionItem.params.expressionAttributeValues = values;\n }\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured delete operation to the transaction.\n *\n * This method is particularly useful when working with DeleteBuilder\n * to maintain consistency in delete operations across your application.\n *\n * @example\n * ```typescript\n * // Create a delete command with DeleteBuilder\n * const deleteCommand = new DeleteBuilder(executor, 'users', { pk: 'USER#123' })\n * .condition(op => op.and([\n * op.attributeExists('pk'),\n * op.eq('status', 'INACTIVE')\n * ]))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.deleteWithCommand(deleteCommand);\n * ```\n *\n * @param command - The complete delete command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see DeleteBuilder for creating delete commands\n */\n deleteWithCommand(command: DeleteCommandParams): this {\n // The command.key from DeleteBuilder.toDynamoCommand() is in PrimaryKeyWithoutExpression format\n // but DeleteCommandParams expects it to be in the table's actual key format\n // We need to check if it's already converted or needs conversion\n let keyForDuplicateCheck: Record<string, unknown>;\n let keyForTransaction: Record<string, unknown>;\n\n // Check if the key is in PrimaryKeyWithoutExpression format (has pk/sk properties)\n if (typeof command.key === \"object\" && command.key !== null && \"pk\" in command.key) {\n // Convert from PrimaryKeyWithoutExpression to table key format\n keyForTransaction = this.createKeyForPrimaryIndex(command.key as PrimaryKeyWithoutExpression);\n keyForDuplicateCheck = keyForTransaction;\n } else {\n // Key is already in table format\n keyForTransaction = command.key;\n keyForDuplicateCheck = command.key;\n }\n\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, keyForDuplicateCheck);\n\n const transactionItem: TransactionItem = {\n type: \"Delete\",\n params: {\n ...command,\n key: keyForTransaction,\n },\n };\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds an update operation to the transaction.\n *\n * The method supports all DynamoDB update expressions:\n * - SET: Modify or add attributes\n * - REMOVE: Delete attributes\n * - ADD: Update numbers and sets\n * - DELETE: Remove elements from a set\n *\n * @example\n * ```typescript\n * // Simple update\n * transaction.update(\n * 'orders',\n * { pk: 'ORDER#123' },\n * 'SET #status = :status',\n * { '#status': 'status' },\n * { ':status': 'PROCESSING' }\n * );\n *\n * // Complex update with multiple operations\n * transaction.update(\n * 'products',\n * { pk: 'PROD#ABC' },\n * 'SET #qty = #qty - :amount, #status = :status REMOVE #oldAttr',\n * { '#qty': 'quantity', '#status': 'status', '#oldAttr': 'deprecated_field' },\n * { ':amount': 1, ':status': 'LOW_STOCK' }\n * );\n *\n * // Conditional update\n * transaction.update(\n * 'users',\n * { pk: 'USER#123' },\n * 'SET #lastLogin = :now',\n * { '#lastLogin': 'lastLoginDate' },\n * { ':now': new Date().toISOString() },\n * op => op.attributeExists('pk')\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param key - The primary key of the item to update\n * @param updateExpression - The update expression (SET, REMOVE, ADD, DELETE)\n * @param expressionAttributeNames - Map of attribute name placeholders to actual names\n * @param expressionAttributeValues - Map of value placeholders to actual values\n * @param condition - Optional condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n */\n update<T extends DynamoItem>(\n tableName: string,\n key: PrimaryKeyWithoutExpression,\n updateExpression: string,\n expressionAttributeNames?: Record<string, string>,\n expressionAttributeValues?: Record<string, unknown>,\n condition?: Condition,\n ): this {\n const keyCondition = this.createKeyForPrimaryIndex(key);\n\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, keyCondition);\n\n const transactionItem: TransactionItem = {\n type: \"Update\",\n params: {\n tableName,\n key: keyCondition,\n updateExpression,\n expressionAttributeNames,\n expressionAttributeValues,\n },\n };\n\n if (condition) {\n const { expression, names, values } = prepareExpressionParams(condition);\n transactionItem.params.conditionExpression = expression;\n\n // Merge the condition expression attribute names and values with the update ones\n transactionItem.params.expressionAttributeNames = {\n ...transactionItem.params.expressionAttributeNames,\n ...names,\n };\n\n transactionItem.params.expressionAttributeValues = {\n ...transactionItem.params.expressionAttributeValues,\n ...values,\n };\n }\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured update operation to the transaction.\n *\n * This method is particularly useful when working with UpdateBuilder\n * to maintain consistency in update operations across your application.\n *\n * @example\n * ```typescript\n * // Create an update command with UpdateBuilder\n * const updateCommand = new UpdateBuilder(executor, 'inventory', { pk: 'PROD#ABC' })\n * .set('quantity', ':qty')\n * .set('lastUpdated', ':now')\n * .values({\n * ':qty': 100,\n * ':now': new Date().toISOString()\n * })\n * .condition(op => op.gt('quantity', 0))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.updateWithCommand(updateCommand);\n * ```\n *\n * @param command - The complete update command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see UpdateBuilder for creating update commands\n */\n updateWithCommand(command: UpdateCommandParams): TransactionBuilder {\n // The command.key from UpdateBuilder.toDynamoCommand() is in PrimaryKeyWithoutExpression format\n // but UpdateCommandParams expects it to be in the table's actual key format\n // We need to check if it's already converted or needs conversion\n let keyForDuplicateCheck: Record<string, unknown>;\n let keyForTransaction: Record<string, unknown>;\n\n // Check if the key is in PrimaryKeyWithoutExpression format (has pk/sk properties)\n if (typeof command.key === \"object\" && command.key !== null && \"pk\" in command.key) {\n // Convert from PrimaryKeyWithoutExpression to table key format\n keyForTransaction = this.createKeyForPrimaryIndex(command.key as PrimaryKeyWithoutExpression);\n keyForDuplicateCheck = keyForTransaction;\n } else {\n // Key is already in table format\n keyForTransaction = command.key;\n keyForDuplicateCheck = command.key;\n }\n\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, keyForDuplicateCheck);\n\n const transactionItem: TransactionItem = {\n type: \"Update\",\n params: {\n ...command,\n key: keyForTransaction,\n },\n };\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a condition check operation to the transaction.\n *\n * Condition checks are particularly useful for:\n * - Implementing optimistic locking\n * - Ensuring referential integrity\n * - Validating business rules atomically\n *\n * @example\n * ```typescript\n * // Check if order is in correct state\n * transaction.conditionCheck(\n * 'orders',\n * { pk: 'ORDER#123' },\n * op => op.eq('status', 'PENDING')\n * );\n *\n * // Complex condition check\n * transaction.conditionCheck(\n * 'inventory',\n * { pk: 'PROD#ABC' },\n * op => op.and([\n * op.gt('quantity', 0),\n * op.eq('status', 'ACTIVE'),\n * op.attributeExists('lastRestockDate')\n * ])\n * );\n *\n * // Check with multiple attributes\n * transaction.conditionCheck(\n * 'users',\n * { pk: 'USER#123' },\n * op => op.or([\n * op.eq('status', 'PREMIUM'),\n * op.gte('credits', 100)\n * ])\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param key - The primary key of the item to check\n * @param condition - The condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @throws {Error} If condition expression generation fails\n */\n conditionCheck(tableName: string, key: PrimaryKeyWithoutExpression, condition: Condition): TransactionBuilder {\n const keyCondition = this.createKeyForPrimaryIndex(key);\n\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, keyCondition);\n\n const { expression, names, values } = prepareExpressionParams(condition);\n\n if (!expression) {\n throw new Error(\"Failed to generate condition expression\");\n }\n\n const transactionItem: TransactionItem = {\n type: \"ConditionCheck\",\n params: {\n tableName,\n key: keyCondition,\n conditionExpression: expression,\n expressionAttributeNames: names,\n expressionAttributeValues: values,\n },\n };\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured condition check operation to the transaction.\n *\n * This method is particularly useful when working with ConditionCheckBuilder\n * to maintain consistency in condition checks across your application.\n *\n * @example\n * ```typescript\n * // Create a condition check with ConditionCheckBuilder\n * const checkCommand = new ConditionCheckBuilder('inventory', { pk: 'PROD#ABC' })\n * .condition(op => op.and([\n * op.between('quantity', 10, 100),\n * op.beginsWith('category', 'ELECTRONICS'),\n * op.attributeExists('lastAuditDate')\n * ]))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.conditionCheckWithCommand(checkCommand);\n * ```\n *\n * @param command - The complete condition check command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see ConditionCheckBuilder for creating condition check commands\n */\n conditionCheckWithCommand(command: ConditionCheckCommandParams): TransactionBuilder {\n // The command.key from ConditionCheckBuilder.toDynamoCommand() is in PrimaryKeyWithoutExpression format\n // but ConditionCheckCommandParams expects it to be in the table's actual key format\n // We need to check if it's already converted or needs conversion\n let keyForDuplicateCheck: Record<string, unknown>;\n let keyForTransaction: Record<string, unknown>;\n\n // Check if the key is in PrimaryKeyWithoutExpression format (has pk/sk properties)\n if (typeof command.key === \"object\" && command.key !== null && \"pk\" in command.key) {\n // Convert from PrimaryKeyWithoutExpression to table key format\n keyForTransaction = this.createKeyForPrimaryIndex(command.key as PrimaryKeyWithoutExpression);\n keyForDuplicateCheck = keyForTransaction;\n } else {\n // Key is already in table format\n keyForTransaction = command.key;\n keyForDuplicateCheck = command.key;\n }\n\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, keyForDuplicateCheck);\n\n const transactionItem: TransactionItem = {\n type: \"ConditionCheck\",\n params: {\n ...command,\n key: keyForTransaction,\n },\n };\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Sets options for the transaction execution.\n *\n * @example\n * ```typescript\n * // Enable idempotency and capacity tracking\n * transaction.withOptions({\n * clientRequestToken: 'unique-request-id-123',\n * returnConsumedCapacity: 'TOTAL'\n * });\n *\n * // Track item collection metrics\n * transaction.withOptions({\n * returnItemCollectionMetrics: 'SIZE'\n * });\n * ```\n *\n * Note: ClientRequestToken can be used to make transactions idempotent,\n * ensuring the same transaction is not executed multiple times.\n *\n * @param options - Configuration options for the transaction\n * @returns The transaction builder for method chaining\n */\n withOptions(options: TransactionOptions): TransactionBuilder {\n this.options = { ...this.options, ...options };\n return this;\n }\n\n /**\n * Gets a human-readable representation of the transaction items.\n *\n * The method resolves all expression placeholders with their actual values,\n * making it easier to understand the transaction's operations.\n *\n * @example\n * ```typescript\n * // Add multiple operations\n * transaction\n * .put('orders', { orderId: '123', status: 'PENDING' })\n * .update('inventory',\n * { productId: 'ABC' },\n * 'SET quantity = quantity - :amount',\n * undefined,\n * { ':amount': 1 }\n * );\n *\n * // Debug the transaction\n * const debugInfo = transaction.debug();\n * console.log('Transaction operations:', debugInfo);\n * ```\n *\n * @returns An array of readable representations of the transaction items\n */\n debug() {\n return debugTransaction(this.items);\n }\n\n /**\n * Executes all operations in the transaction atomically.\n *\n * The transaction will only succeed if all operations succeed.\n * If any operation fails, the entire transaction is rolled back.\n *\n * @example\n * ```typescript\n * try {\n * // Build and execute transaction\n * await transaction\n * .put('orders', newOrder)\n * .update('inventory',\n * { productId: 'ABC' },\n * 'SET quantity = quantity - :qty',\n * undefined,\n * { ':qty': 1 }\n * )\n * .conditionCheck('products',\n * { productId: 'ABC' },\n * op => op.eq('status', 'ACTIVE')\n * )\n * .execute();\n *\n * console.log('Transaction completed successfully');\n * } catch (error) {\n * // Handle transaction failure\n * console.error('Transaction failed:', error);\n * }\n * ```\n *\n * @throws {Error} If no transaction items are specified\n * @throws {Error} If any operation in the transaction fails\n * @returns A promise that resolves when the transaction completes\n */\n async execute(): Promise<void> {\n if (this.items.length === 0) {\n throw new Error(\"No transaction items specified\");\n }\n\n const transactItems = this.items.map((item) => {\n switch (item.type) {\n case \"Put\":\n return {\n Put: {\n TableName: item.params.tableName,\n Item: item.params.item,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n case \"Delete\":\n return {\n Delete: {\n TableName: item.params.tableName,\n Key: item.params.key,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n case \"Update\":\n return {\n Update: {\n TableName: item.params.tableName,\n Key: item.params.key,\n UpdateExpression: item.params.updateExpression,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n case \"ConditionCheck\":\n return {\n ConditionCheck: {\n TableName: item.params.tableName,\n Key: item.params.key,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n default: {\n // This should never happen as we've covered all cases in the union type\n const exhaustiveCheck: never = item;\n throw new Error(`Unsupported transaction item type: ${String(exhaustiveCheck)}`);\n }\n }\n });\n\n const params: TransactWriteCommandInput = {\n TransactItems: transactItems,\n ClientRequestToken: this.options.clientRequestToken,\n ReturnConsumedCapacity: this.options.returnConsumedCapacity,\n ReturnItemCollectionMetrics: this.options.returnItemCollectionMetrics,\n };\n\n try {\n await this.executor(params);\n } catch (error) {\n console.log(this.debug());\n console.error(\"Error executing transaction:\", error);\n throw error;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/expression.ts","../../src/utils/debug-expression.ts","../../src/utils/debug-transaction.ts","../../src/builders/transaction-builder.ts"],"names":[],"mappings":"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","file":"transaction-builder.cjs","sourcesContent":["import type { ComparisonOperator, Condition, ExpressionParams, LogicalOperator } from \"./conditions\";\n\nexport const generateAttributeName = (params: ExpressionParams, attr: string): string => {\n // Handle nested paths by splitting on dots\n if (attr.includes(\".\")) {\n const pathSegments = attr.split(\".\");\n const segmentNames: string[] = [];\n\n for (const segment of pathSegments) {\n // Check if this segment already exists in expressionAttributeNames\n let segmentName: string | undefined;\n for (const [existingName, existingAttr] of Object.entries(params.expressionAttributeNames)) {\n if (existingAttr === segment) {\n segmentName = existingName;\n break;\n }\n }\n\n // If not found, create a new attribute name for this segment\n if (!segmentName) {\n segmentName = `#${Object.keys(params.expressionAttributeNames).length}`;\n params.expressionAttributeNames[segmentName] = segment;\n }\n\n segmentNames.push(segmentName);\n }\n\n return segmentNames.join(\".\");\n }\n\n // Handle single-level attributes (original logic)\n // Check if the attribute already exists in the expressionAttributeNames\n for (const [existingName, existingAttr] of Object.entries(params.expressionAttributeNames)) {\n if (existingAttr === attr) {\n return existingName;\n }\n }\n\n // If not found, create a new attribute name\n const attrName = `#${Object.keys(params.expressionAttributeNames).length}`;\n params.expressionAttributeNames[attrName] = attr;\n return attrName;\n};\n\nexport const generateValueName = (params: ExpressionParams, value: unknown): string => {\n const valueName = `:${params.valueCounter.count++}`;\n params.expressionAttributeValues[valueName] = value;\n return valueName;\n};\n\nconst validateCondition = (condition: Condition, requiresAttr = true, requiresValue = true): void => {\n if (requiresAttr && !condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n if (requiresValue && condition.value === undefined) {\n throw new Error(`Value is required for ${condition.type} condition`);\n }\n};\n\nconst buildComparisonExpression = (condition: Condition, operator: string, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const valueName = generateValueName(params, condition.value);\n\n return `${attrName} ${operator} ${valueName}`;\n};\n\nconst buildBetweenExpression = (condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n if (!Array.isArray(condition.value) || condition.value.length !== 2) {\n throw new Error(\"Between condition requires an array of two values\");\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const lowerName = generateValueName(params, condition.value[0]);\n const upperName = generateValueName(params, condition.value[1]);\n\n return `${attrName} BETWEEN ${lowerName} AND ${upperName}`;\n};\n\nconst buildInExpression = (condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n throw new Error(\"In condition requires a non-empty array of values\");\n }\n\n if (condition.value.length > 100) {\n throw new Error(\"In condition supports a maximum of 100 values\");\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const valueNames = condition.value.map((value) => generateValueName(params, value));\n\n return `${attrName} IN (${valueNames.join(\", \")})`;\n};\n\nconst buildFunctionExpression = (functionName: string, condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n const valueName = generateValueName(params, condition.value);\n\n return `${functionName}(${attrName}, ${valueName})`;\n};\n\nconst buildAttributeFunction = (functionName: string, condition: Condition, params: ExpressionParams): string => {\n validateCondition(condition, true, false);\n\n if (!condition.attr) {\n throw new Error(`Attribute is required for ${condition.type} condition`);\n }\n\n const attrName = generateAttributeName(params, condition.attr);\n return `${functionName}(${attrName})`;\n};\n\nconst buildLogicalExpression = (operator: string, conditions: Condition[], params: ExpressionParams): string => {\n if (!conditions || conditions.length === 0) {\n throw new Error(`At least one condition is required for ${operator} expression`);\n }\n\n const expressions = conditions.map((c) => buildExpression(c, params));\n return `(${expressions.join(` ${operator} `)})`;\n};\n\nexport const buildExpression = (condition: Condition, params: ExpressionParams): string => {\n if (!condition) return \"\";\n\n try {\n // Map of condition types to their expression builders\n const expressionBuilders: Record<ComparisonOperator | LogicalOperator, () => string> = {\n eq: () => buildComparisonExpression(condition, \"=\", params),\n ne: () => buildComparisonExpression(condition, \"<>\", params),\n lt: () => buildComparisonExpression(condition, \"<\", params),\n lte: () => buildComparisonExpression(condition, \"<=\", params),\n gt: () => buildComparisonExpression(condition, \">\", params),\n gte: () => buildComparisonExpression(condition, \">=\", params),\n between: () => buildBetweenExpression(condition, params),\n in: () => buildInExpression(condition, params),\n beginsWith: () => buildFunctionExpression(\"begins_with\", condition, params),\n contains: () => buildFunctionExpression(\"contains\", condition, params),\n attributeExists: () => buildAttributeFunction(\"attribute_exists\", condition, params),\n attributeNotExists: () => buildAttributeFunction(\"attribute_not_exists\", condition, params),\n and: () => {\n if (!condition.conditions) {\n throw new Error(\"Conditions array is required for AND operator\");\n }\n return buildLogicalExpression(\"AND\", condition.conditions, params);\n },\n or: () => {\n if (!condition.conditions) {\n throw new Error(\"Conditions array is required for OR operator\");\n }\n return buildLogicalExpression(\"OR\", condition.conditions, params);\n },\n not: () => {\n if (!condition.condition) {\n throw new Error(\"Condition is required for NOT operator\");\n }\n return `NOT (${buildExpression(condition.condition, params)})`;\n },\n };\n\n const builder = expressionBuilders[condition.type];\n if (!builder) {\n throw new Error(`Unknown condition type: ${condition.type}`);\n }\n\n return builder();\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(`Error building expression for condition type ${condition.type}:`, error.message);\n } else {\n console.error(`Error building expression for condition type ${condition.type}:`, error);\n }\n throw error;\n }\n};\n\nexport const prepareExpressionParams = (\n condition?: Condition,\n): {\n expression?: string;\n names?: Record<string, string>;\n values?: Record<string, unknown>;\n} => {\n if (!condition) return {};\n\n const params: ExpressionParams = {\n expressionAttributeNames: {},\n expressionAttributeValues: {},\n valueCounter: { count: 0 },\n };\n\n const expression = buildExpression(condition, params);\n\n return {\n expression,\n names: Object.keys(params.expressionAttributeNames).length > 0 ? params.expressionAttributeNames : undefined,\n values: Object.keys(params.expressionAttributeValues).length > 0 ? params.expressionAttributeValues : undefined,\n };\n};\n","/**\n * Interface for DynamoDB command objects that can contain expressions\n */\nexport interface DynamoCommandWithExpressions {\n conditionExpression?: string;\n updateExpression?: string;\n filterExpression?: string;\n keyConditionExpression?: string;\n projectionExpression?: string;\n expressionAttributeNames?: Record<string, string>;\n expressionAttributeValues?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ntype ReadableDynamoCommand = {\n conditionExpression?: string;\n updateExpression?: string;\n filterExpression?: string;\n keyConditionExpression?: string;\n projectionExpression?: string;\n};\n\n/**\n * Utility function to debug a DynamoDB command by replacing all placeholders\n * in expressions with their actual values.\n *\n * @param command Any DynamoDB command with expressions and attribute maps\n * @returns An object with the same structure but with readable expressions\n */\nexport function debugCommand<T extends DynamoCommandWithExpressions>(\n command: T,\n): {\n raw: T;\n readable: ReadableDynamoCommand;\n} {\n // Create a copy of the command\n const result: ReadableDynamoCommand = {};\n\n function replaceAliases(expressionString: string) {\n if (!expressionString) {\n return expressionString;\n }\n\n let replacedString = expressionString;\n for (const alias in command.expressionAttributeNames) {\n const attributeName = command.expressionAttributeNames[alias];\n const regex = new RegExp(alias, \"g\");\n\n replacedString = replacedString.replace(regex, attributeName as string);\n }\n\n for (const alias in command.expressionAttributeValues) {\n let attributeValue = command.expressionAttributeValues[alias];\n\n // Handle Set objects for better readability\n if (attributeValue instanceof Set) {\n const array = Array.from(attributeValue);\n attributeValue = `Set(${array.length}){${array.map((v) => JSON.stringify(v)).join(\", \")}}`;\n } else {\n // Stringify other values for display\n attributeValue = JSON.stringify(attributeValue);\n }\n\n const regex = new RegExp(alias, \"g\");\n replacedString = replacedString.replace(regex, attributeValue as string);\n }\n\n return replacedString;\n }\n\n if (command.updateExpression) {\n result.updateExpression = replaceAliases(command.updateExpression);\n }\n if (command.conditionExpression) {\n result.conditionExpression = replaceAliases(command.conditionExpression);\n }\n if (command.filterExpression) {\n result.filterExpression = replaceAliases(command.filterExpression);\n }\n if (command.keyConditionExpression) {\n result.keyConditionExpression = replaceAliases(command.keyConditionExpression);\n }\n if (command.projectionExpression) {\n result.projectionExpression = replaceAliases(command.projectionExpression);\n }\n\n return {\n raw: command,\n readable: result,\n };\n}\n","import type { TransactionItem } from \"../builders/builder-types\";\nimport { debugCommand } from \"./debug-expression\";\n\n/**\n * Utility function to create a human-readable representation of a transaction item\n * by replacing all expression placeholders with their actual values.\n *\n * @param item The transaction item to debug\n * @returns A readable representation of the transaction item\n */\nexport function debugTransactionItem(item: TransactionItem): Record<string, unknown> {\n const result: Record<string, unknown> = {\n type: item.type,\n tableName: item.params.tableName,\n };\n\n // Add key if present\n if (\"key\" in item.params) {\n result.key = item.params.key;\n }\n\n // Add item if present (for Put operations)\n if (item.type === \"Put\") {\n result.item = item.params.item;\n }\n\n // Add readable expressions based on operation type\n switch (item.type) {\n case \"Put\":\n case \"Delete\":\n case \"ConditionCheck\":\n result.readable = debugCommand(item.params).readable;\n break;\n case \"Update\":\n result.readable = debugCommand(item.params).readable;\n break;\n }\n\n return result;\n}\n\n/**\n * Utility function to create a human-readable representation of all transaction items\n * in a transaction by replacing all expression placeholders with their actual values.\n *\n * @param items Array of transaction items to debug\n * @returns An array of readable representations of the transaction items\n */\nexport function debugTransaction(items: TransactionItem[]): Record<string, unknown>[] {\n return items.map((item) => debugTransactionItem(item));\n}\n","import type { TransactWriteCommandInput } from \"@aws-sdk/lib-dynamodb\";\nimport type { Condition, PrimaryKeyWithoutExpression } from \"../conditions\";\nimport { prepareExpressionParams } from \"../expression\";\nimport { debugTransaction } from \"../utils/debug-transaction\";\nimport type {\n ConditionCheckCommandParams,\n DeleteCommandParams,\n PutCommandParams,\n TransactionItem,\n UpdateCommandParams,\n} from \"./builder-types\";\nimport type { DynamoItem } from \"../types\";\n\n/**\n * Configuration options for DynamoDB transactions.\n */\nexport interface TransactionOptions {\n /** Unique identifier for the transaction request (idempotency token) */\n clientRequestToken?: string;\n /** Level of consumed capacity details to return */\n returnConsumedCapacity?: \"INDEXES\" | \"TOTAL\" | \"NONE\";\n /** Whether to return item collection metrics */\n returnItemCollectionMetrics?: \"SIZE\" | \"NONE\";\n}\n\n/**\n * Configuration for table indexes used in duplicate detection.\n * Defines the key structure for checking uniqueness constraints.\n */\ninterface IndexConfig {\n /** The partition key attribute name */\n partitionKey: string;\n /** Optional sort key attribute name */\n sortKey?: string;\n}\n\n/**\n * Function type for executing DynamoDB transaction operations.\n * @param params - The complete transaction command input\n * @returns A promise that resolves when the transaction completes\n */\nexport type TransactionExecutor = (params: TransactWriteCommandInput) => Promise<void>;\n\n/**\n * Builder for creating and executing DynamoDB transactions.\n * Use this builder when you need to:\n * - Perform multiple operations atomically\n * - Ensure data consistency across operations\n * - Implement complex business logic that requires atomic updates\n * - Prevent duplicate items across tables\n *\n * The builder supports:\n * - Put operations (insert/replace items)\n * - Delete operations\n * - Update operations\n * - Condition checks\n * - Duplicate detection\n * - Transaction-wide options\n *\n * @example\n * ```typescript\n * // Create a transaction with multiple operations\n * const transaction = new TransactionBuilder(executor, {\n * partitionKey: 'id',\n * sortKey: 'type'\n * });\n *\n * // Add a new order\n * transaction.put('orders', {\n * orderId: '123',\n * status: 'PENDING'\n * });\n *\n * // Update inventory with condition\n * transaction.update(\n * 'inventory',\n * { productId: 'ABC' },\n * 'set quantity = quantity - :amount',\n * { ':amount': 1 },\n * op => op.gte('quantity', 1)\n * );\n *\n * // Execute the transaction atomically\n * await transaction.execute();\n * ```\n *\n * Note: DynamoDB transactions have some limitations:\n * - Maximum 25 operations per transaction\n * - All operations must be in the same AWS region\n * - Cannot include table scans or queries\n */\nexport class TransactionBuilder {\n private items: TransactionItem[] = [];\n private options: TransactionOptions = {};\n private indexConfig: IndexConfig;\n private readonly executor: TransactionExecutor;\n\n constructor(executor: TransactionExecutor, indexConfig: IndexConfig) {\n this.executor = executor;\n this.indexConfig = indexConfig;\n }\n\n /**\n * Checks if an item with the same primary key already exists in the transaction\n * @private\n */\n private checkForDuplicateItem(tableName: string, newItem: DynamoItem): void {\n const pkName = this.indexConfig.partitionKey;\n const skName = this.indexConfig.sortKey ?? \"\";\n\n // Extract the primary key values from the provided key\n const pkValue = newItem[pkName];\n const skValue = skName ? newItem[skName] : undefined;\n\n if (!pkValue) {\n throw new Error(`Primary key value for '${pkName}' is missing`);\n }\n\n const duplicateItem = this.items.find((item) => {\n // Get the key from the item based on its type\n let itemKey: Record<string, unknown> | undefined;\n let itemTableName: string | undefined;\n\n switch (item.type) {\n case \"Put\":\n itemTableName = item.params.tableName;\n // For Put operations, the key is part of the item\n itemKey = item.params.item;\n break;\n case \"Update\":\n case \"Delete\":\n case \"ConditionCheck\":\n itemTableName = item.params.tableName;\n itemKey = item.params.key;\n break;\n }\n\n // Check if the table name and keys match\n if (itemTableName === tableName && itemKey) {\n const itemPkValue = itemKey[pkName];\n const itemSkValue = skName ? itemKey[skName] : undefined;\n\n // Match if partition keys match and either both sort keys match or both are undefined\n if (itemPkValue === pkValue) {\n if (skValue === undefined && itemSkValue === undefined) {\n return true;\n }\n if (skValue !== undefined && itemSkValue !== undefined && skValue === itemSkValue) {\n return true;\n }\n }\n }\n\n return false;\n });\n\n if (duplicateItem) {\n throw new Error(\n `Duplicate item detected in transaction: Table=${tableName}, ${pkName}=${String(pkValue)}, ${skName}=${skValue !== undefined ? String(skValue) : \"undefined\"}. DynamoDB transactions do not allow multiple operations on the same item.`,\n );\n }\n }\n\n createKeyForPrimaryIndex(key: PrimaryKeyWithoutExpression) {\n // Turn the pk/sk into the key object\n const keyCondition = {\n [this.indexConfig.partitionKey]: key.pk,\n };\n\n if (this.indexConfig.sortKey) {\n if (key.sk === undefined) {\n throw new Error(\"Sort key is required for delete operation\");\n }\n keyCondition[this.indexConfig.sortKey] = key.sk;\n }\n\n return keyCondition;\n }\n\n /**\n * Adds a put operation to the transaction.\n *\n * The method automatically checks for duplicate items within the transaction\n * to prevent multiple operations on the same item.\n *\n * @example\n * ```typescript\n * // Simple put operation\n * transaction.put('orders', {\n * orderId: '123',\n * status: 'PENDING',\n * amount: 100\n * });\n *\n * // Conditional put operation\n * transaction.put(\n * 'inventory',\n * { productId: 'ABC', quantity: 50 },\n * op => op.attributeNotExists('productId')\n * );\n *\n * // Put with complex condition\n * transaction.put(\n * 'users',\n * { userId: '123', status: 'ACTIVE' },\n * op => op.and([\n * op.attributeNotExists('userId'),\n * op.beginsWith('status', 'ACTIVE')\n * ])\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param item - The item to put into the table\n * @param condition - Optional condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n */\n put<T extends DynamoItem>(tableName: string, item: T, condition?: Condition): this {\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, item);\n\n const transactionItem: TransactionItem = {\n type: \"Put\",\n params: {\n tableName,\n item,\n },\n };\n\n if (condition) {\n const { expression, names, values } = prepareExpressionParams(condition);\n transactionItem.params.conditionExpression = expression;\n transactionItem.params.expressionAttributeNames = names;\n transactionItem.params.expressionAttributeValues = values;\n }\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured put operation to the transaction.\n *\n * This method is particularly useful when working with PutBuilder\n * to maintain consistency in put operations across your application.\n *\n * @example\n * ```typescript\n * // Create a put command with PutBuilder\n * const putCommand = new PutBuilder(executor, newItem, 'users')\n * .condition(op => op.attributeNotExists('userId'))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.putWithCommand(putCommand);\n * ```\n *\n * @param command - The complete put command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see PutBuilder for creating put commands\n */\n putWithCommand(command: PutCommandParams): TransactionBuilder {\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, command.item);\n\n const transactionItem: TransactionItem = {\n type: \"Put\",\n params: command,\n };\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a delete operation to the transaction.\n *\n * The method automatically checks for duplicate items within the transaction\n * to prevent multiple operations on the same item.\n *\n * @example\n * ```typescript\n * // Simple delete operation\n * transaction.delete('orders', {\n * pk: 'ORDER#123',\n * sk: 'METADATA'\n * });\n *\n * // Conditional delete operation\n * transaction.delete(\n * 'users',\n * { pk: 'USER#123' },\n * op => op.eq('status', 'INACTIVE')\n * );\n *\n * // Delete with complex condition\n * transaction.delete(\n * 'products',\n * { pk: 'PROD#ABC' },\n * op => op.and([\n * op.eq('status', 'DRAFT'),\n * op.lt('version', 5)\n * ])\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param key - The primary key of the item to delete\n * @param condition - Optional condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n */\n delete(tableName: string, key: PrimaryKeyWithoutExpression, condition?: Condition): TransactionBuilder {\n const keyCondition = this.createKeyForPrimaryIndex(key);\n\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, keyCondition);\n\n const transactionItem: TransactionItem = {\n type: \"Delete\",\n params: {\n tableName,\n key: keyCondition,\n },\n };\n\n if (condition) {\n const { expression, names, values } = prepareExpressionParams(condition);\n transactionItem.params.conditionExpression = expression;\n transactionItem.params.expressionAttributeNames = names;\n transactionItem.params.expressionAttributeValues = values;\n }\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured delete operation to the transaction.\n *\n * This method is particularly useful when working with DeleteBuilder\n * to maintain consistency in delete operations across your application.\n *\n * @example\n * ```typescript\n * // Create a delete command with DeleteBuilder\n * const deleteCommand = new DeleteBuilder(executor, 'users', { pk: 'USER#123' })\n * .condition(op => op.and([\n * op.attributeExists('pk'),\n * op.eq('status', 'INACTIVE')\n * ]))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.deleteWithCommand(deleteCommand);\n * ```\n *\n * @param command - The complete delete command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see DeleteBuilder for creating delete commands\n */\n deleteWithCommand(command: DeleteCommandParams): this {\n // The command.key from DeleteBuilder.toDynamoCommand() is in PrimaryKeyWithoutExpression format\n // but DeleteCommandParams expects it to be in the table's actual key format\n // We need to check if it's already converted or needs conversion\n let keyForDuplicateCheck: Record<string, unknown>;\n let keyForTransaction: Record<string, unknown>;\n\n // Check if the key is in PrimaryKeyWithoutExpression format (has pk/sk properties)\n if (typeof command.key === \"object\" && command.key !== null && \"pk\" in command.key) {\n // Convert from PrimaryKeyWithoutExpression to table key format\n keyForTransaction = this.createKeyForPrimaryIndex(command.key as PrimaryKeyWithoutExpression);\n keyForDuplicateCheck = keyForTransaction;\n } else {\n // Key is already in table format\n keyForTransaction = command.key;\n keyForDuplicateCheck = command.key;\n }\n\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, keyForDuplicateCheck);\n\n const transactionItem: TransactionItem = {\n type: \"Delete\",\n params: {\n ...command,\n key: keyForTransaction,\n },\n };\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds an update operation to the transaction.\n *\n * The method supports all DynamoDB update expressions:\n * - SET: Modify or add attributes\n * - REMOVE: Delete attributes\n * - ADD: Update numbers and sets\n * - DELETE: Remove elements from a set\n *\n * @example\n * ```typescript\n * // Simple update\n * transaction.update(\n * 'orders',\n * { pk: 'ORDER#123' },\n * 'SET #status = :status',\n * { '#status': 'status' },\n * { ':status': 'PROCESSING' }\n * );\n *\n * // Complex update with multiple operations\n * transaction.update(\n * 'products',\n * { pk: 'PROD#ABC' },\n * 'SET #qty = #qty - :amount, #status = :status REMOVE #oldAttr',\n * { '#qty': 'quantity', '#status': 'status', '#oldAttr': 'deprecated_field' },\n * { ':amount': 1, ':status': 'LOW_STOCK' }\n * );\n *\n * // Conditional update\n * transaction.update(\n * 'users',\n * { pk: 'USER#123' },\n * 'SET #lastLogin = :now',\n * { '#lastLogin': 'lastLoginDate' },\n * { ':now': new Date().toISOString() },\n * op => op.attributeExists('pk')\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param key - The primary key of the item to update\n * @param updateExpression - The update expression (SET, REMOVE, ADD, DELETE)\n * @param expressionAttributeNames - Map of attribute name placeholders to actual names\n * @param expressionAttributeValues - Map of value placeholders to actual values\n * @param condition - Optional condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n */\n update<T extends DynamoItem>(\n tableName: string,\n key: PrimaryKeyWithoutExpression,\n updateExpression: string,\n expressionAttributeNames?: Record<string, string>,\n expressionAttributeValues?: Record<string, unknown>,\n condition?: Condition,\n ): this {\n const keyCondition = this.createKeyForPrimaryIndex(key);\n\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, keyCondition);\n\n const transactionItem: TransactionItem = {\n type: \"Update\",\n params: {\n tableName,\n key: keyCondition,\n updateExpression,\n expressionAttributeNames,\n expressionAttributeValues,\n },\n };\n\n if (condition) {\n const { expression, names, values } = prepareExpressionParams(condition);\n transactionItem.params.conditionExpression = expression;\n\n // Merge the condition expression attribute names and values with the update ones\n transactionItem.params.expressionAttributeNames = {\n ...transactionItem.params.expressionAttributeNames,\n ...names,\n };\n\n transactionItem.params.expressionAttributeValues = {\n ...transactionItem.params.expressionAttributeValues,\n ...values,\n };\n }\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured update operation to the transaction.\n *\n * This method is particularly useful when working with UpdateBuilder\n * to maintain consistency in update operations across your application.\n *\n * @example\n * ```typescript\n * // Create an update command with UpdateBuilder\n * const updateCommand = new UpdateBuilder(executor, 'inventory', { pk: 'PROD#ABC' })\n * .set('quantity', ':qty')\n * .set('lastUpdated', ':now')\n * .values({\n * ':qty': 100,\n * ':now': new Date().toISOString()\n * })\n * .condition(op => op.gt('quantity', 0))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.updateWithCommand(updateCommand);\n * ```\n *\n * @param command - The complete update command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see UpdateBuilder for creating update commands\n */\n updateWithCommand(command: UpdateCommandParams): TransactionBuilder {\n // The command.key from UpdateBuilder.toDynamoCommand() is in PrimaryKeyWithoutExpression format\n // but UpdateCommandParams expects it to be in the table's actual key format\n // We need to check if it's already converted or needs conversion\n let keyForDuplicateCheck: Record<string, unknown>;\n let keyForTransaction: Record<string, unknown>;\n\n // Check if the key is in PrimaryKeyWithoutExpression format (has pk/sk properties)\n if (typeof command.key === \"object\" && command.key !== null && \"pk\" in command.key) {\n // Convert from PrimaryKeyWithoutExpression to table key format\n keyForTransaction = this.createKeyForPrimaryIndex(command.key as PrimaryKeyWithoutExpression);\n keyForDuplicateCheck = keyForTransaction;\n } else {\n // Key is already in table format\n keyForTransaction = command.key;\n keyForDuplicateCheck = command.key;\n }\n\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, keyForDuplicateCheck);\n\n const transactionItem: TransactionItem = {\n type: \"Update\",\n params: {\n ...command,\n key: keyForTransaction,\n },\n };\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a condition check operation to the transaction.\n *\n * Condition checks are particularly useful for:\n * - Implementing optimistic locking\n * - Ensuring referential integrity\n * - Validating business rules atomically\n *\n * @example\n * ```typescript\n * // Check if order is in correct state\n * transaction.conditionCheck(\n * 'orders',\n * { pk: 'ORDER#123' },\n * op => op.eq('status', 'PENDING')\n * );\n *\n * // Complex condition check\n * transaction.conditionCheck(\n * 'inventory',\n * { pk: 'PROD#ABC' },\n * op => op.and([\n * op.gt('quantity', 0),\n * op.eq('status', 'ACTIVE'),\n * op.attributeExists('lastRestockDate')\n * ])\n * );\n *\n * // Check with multiple attributes\n * transaction.conditionCheck(\n * 'users',\n * { pk: 'USER#123' },\n * op => op.or([\n * op.eq('status', 'PREMIUM'),\n * op.gte('credits', 100)\n * ])\n * );\n * ```\n *\n * @param tableName - The name of the DynamoDB table\n * @param key - The primary key of the item to check\n * @param condition - The condition that must be satisfied\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @throws {Error} If condition expression generation fails\n */\n conditionCheck(tableName: string, key: PrimaryKeyWithoutExpression, condition: Condition): TransactionBuilder {\n const keyCondition = this.createKeyForPrimaryIndex(key);\n\n // Check for duplicate item\n this.checkForDuplicateItem(tableName, keyCondition);\n\n const { expression, names, values } = prepareExpressionParams(condition);\n\n if (!expression) {\n throw new Error(\"Failed to generate condition expression\");\n }\n\n const transactionItem: TransactionItem = {\n type: \"ConditionCheck\",\n params: {\n tableName,\n key: keyCondition,\n conditionExpression: expression,\n expressionAttributeNames: names,\n expressionAttributeValues: values,\n },\n };\n\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Adds a pre-configured condition check operation to the transaction.\n *\n * This method is particularly useful when working with ConditionCheckBuilder\n * to maintain consistency in condition checks across your application.\n *\n * @example\n * ```typescript\n * // Create a condition check with ConditionCheckBuilder\n * const checkCommand = new ConditionCheckBuilder('inventory', { pk: 'PROD#ABC' })\n * .condition(op => op.and([\n * op.between('quantity', 10, 100),\n * op.beginsWith('category', 'ELECTRONICS'),\n * op.attributeExists('lastAuditDate')\n * ]))\n * .toDynamoCommand();\n *\n * // Add the command to the transaction\n * transaction.conditionCheckWithCommand(checkCommand);\n * ```\n *\n * @param command - The complete condition check command configuration\n * @returns The transaction builder for method chaining\n * @throws {Error} If a duplicate item is detected in the transaction\n * @see ConditionCheckBuilder for creating condition check commands\n */\n conditionCheckWithCommand(command: ConditionCheckCommandParams): TransactionBuilder {\n // The command.key from ConditionCheckBuilder.toDynamoCommand() is in PrimaryKeyWithoutExpression format\n // but ConditionCheckCommandParams expects it to be in the table's actual key format\n // We need to check if it's already converted or needs conversion\n let keyForDuplicateCheck: Record<string, unknown>;\n let keyForTransaction: Record<string, unknown>;\n\n // Check if the key is in PrimaryKeyWithoutExpression format (has pk/sk properties)\n if (typeof command.key === \"object\" && command.key !== null && \"pk\" in command.key) {\n // Convert from PrimaryKeyWithoutExpression to table key format\n keyForTransaction = this.createKeyForPrimaryIndex(command.key as PrimaryKeyWithoutExpression);\n keyForDuplicateCheck = keyForTransaction;\n } else {\n // Key is already in table format\n keyForTransaction = command.key;\n keyForDuplicateCheck = command.key;\n }\n\n // Check for duplicate item\n this.checkForDuplicateItem(command.tableName, keyForDuplicateCheck);\n\n const transactionItem: TransactionItem = {\n type: \"ConditionCheck\",\n params: {\n ...command,\n key: keyForTransaction,\n },\n };\n this.items.push(transactionItem);\n return this;\n }\n\n /**\n * Sets options for the transaction execution.\n *\n * @example\n * ```typescript\n * // Enable idempotency and capacity tracking\n * transaction.withOptions({\n * clientRequestToken: 'unique-request-id-123',\n * returnConsumedCapacity: 'TOTAL'\n * });\n *\n * // Track item collection metrics\n * transaction.withOptions({\n * returnItemCollectionMetrics: 'SIZE'\n * });\n * ```\n *\n * Note: ClientRequestToken can be used to make transactions idempotent,\n * ensuring the same transaction is not executed multiple times.\n *\n * @param options - Configuration options for the transaction\n * @returns The transaction builder for method chaining\n */\n withOptions(options: TransactionOptions): TransactionBuilder {\n this.options = { ...this.options, ...options };\n return this;\n }\n\n /**\n * Gets a human-readable representation of the transaction items.\n *\n * The method resolves all expression placeholders with their actual values,\n * making it easier to understand the transaction's operations.\n *\n * @example\n * ```typescript\n * // Add multiple operations\n * transaction\n * .put('orders', { orderId: '123', status: 'PENDING' })\n * .update('inventory',\n * { productId: 'ABC' },\n * 'SET quantity = quantity - :amount',\n * undefined,\n * { ':amount': 1 }\n * );\n *\n * // Debug the transaction\n * const debugInfo = transaction.debug();\n * console.log('Transaction operations:', debugInfo);\n * ```\n *\n * @returns An array of readable representations of the transaction items\n */\n debug() {\n return debugTransaction(this.items);\n }\n\n /**\n * Executes all operations in the transaction atomically.\n *\n * The transaction will only succeed if all operations succeed.\n * If any operation fails, the entire transaction is rolled back.\n *\n * @example\n * ```typescript\n * try {\n * // Build and execute transaction\n * await transaction\n * .put('orders', newOrder)\n * .update('inventory',\n * { productId: 'ABC' },\n * 'SET quantity = quantity - :qty',\n * undefined,\n * { ':qty': 1 }\n * )\n * .conditionCheck('products',\n * { productId: 'ABC' },\n * op => op.eq('status', 'ACTIVE')\n * )\n * .execute();\n *\n * console.log('Transaction completed successfully');\n * } catch (error) {\n * // Handle transaction failure\n * console.error('Transaction failed:', error);\n * }\n * ```\n *\n * @throws {Error} If no transaction items are specified\n * @throws {Error} If any operation in the transaction fails\n * @returns A promise that resolves when the transaction completes\n */\n async execute(): Promise<void> {\n if (this.items.length === 0) {\n throw new Error(\"No transaction items specified\");\n }\n\n const transactItems = this.items.map((item) => {\n switch (item.type) {\n case \"Put\":\n return {\n Put: {\n TableName: item.params.tableName,\n Item: item.params.item,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n case \"Delete\":\n return {\n Delete: {\n TableName: item.params.tableName,\n Key: item.params.key,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n case \"Update\":\n return {\n Update: {\n TableName: item.params.tableName,\n Key: item.params.key,\n UpdateExpression: item.params.updateExpression,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n case \"ConditionCheck\":\n return {\n ConditionCheck: {\n TableName: item.params.tableName,\n Key: item.params.key,\n ConditionExpression: item.params.conditionExpression,\n ExpressionAttributeNames: item.params.expressionAttributeNames,\n ExpressionAttributeValues: item.params.expressionAttributeValues,\n },\n };\n default: {\n // This should never happen as we've covered all cases in the union type\n const exhaustiveCheck: never = item;\n throw new Error(`Unsupported transaction item type: ${String(exhaustiveCheck)}`);\n }\n }\n });\n\n const params: TransactWriteCommandInput = {\n TransactItems: transactItems,\n ClientRequestToken: this.options.clientRequestToken,\n ReturnConsumedCapacity: this.options.returnConsumedCapacity,\n ReturnItemCollectionMetrics: this.options.returnItemCollectionMetrics,\n };\n\n try {\n await this.executor(params);\n } catch (error) {\n console.log(this.debug());\n console.error(\"Error executing transaction:\", error);\n throw error;\n }\n }\n}\n"]}