@hexaijs/postgres 0.3.0 → 0.5.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.
Files changed (59) hide show
  1. package/README.md +78 -24
  2. package/dist/helpers-vPAudN_S.d.ts +125 -0
  3. package/dist/index.d.ts +64 -7
  4. package/dist/index.js +828 -28
  5. package/dist/index.js.map +1 -1
  6. package/dist/test.d.ts +13 -12
  7. package/dist/test.js +683 -246
  8. package/dist/test.js.map +1 -1
  9. package/package.json +8 -7
  10. package/dist/config/index.d.ts +0 -3
  11. package/dist/config/index.d.ts.map +0 -1
  12. package/dist/config/index.js +0 -19
  13. package/dist/config/index.js.map +0 -1
  14. package/dist/config/postgres-config-spec.d.ts +0 -32
  15. package/dist/config/postgres-config-spec.d.ts.map +0 -1
  16. package/dist/config/postgres-config-spec.js +0 -49
  17. package/dist/config/postgres-config-spec.js.map +0 -1
  18. package/dist/config/postgres-config.d.ts +0 -59
  19. package/dist/config/postgres-config.d.ts.map +0 -1
  20. package/dist/config/postgres-config.js +0 -181
  21. package/dist/config/postgres-config.js.map +0 -1
  22. package/dist/helpers.d.ts +0 -57
  23. package/dist/helpers.d.ts.map +0 -1
  24. package/dist/helpers.js +0 -276
  25. package/dist/helpers.js.map +0 -1
  26. package/dist/index.d.ts.map +0 -1
  27. package/dist/postgres-event-store.d.ts +0 -18
  28. package/dist/postgres-event-store.d.ts.map +0 -1
  29. package/dist/postgres-event-store.js +0 -83
  30. package/dist/postgres-event-store.js.map +0 -1
  31. package/dist/postgres-unit-of-work.d.ts +0 -18
  32. package/dist/postgres-unit-of-work.d.ts.map +0 -1
  33. package/dist/postgres-unit-of-work.js +0 -265
  34. package/dist/postgres-unit-of-work.js.map +0 -1
  35. package/dist/run-hexai-migrations.d.ts +0 -3
  36. package/dist/run-hexai-migrations.d.ts.map +0 -1
  37. package/dist/run-hexai-migrations.js +0 -17
  38. package/dist/run-hexai-migrations.js.map +0 -1
  39. package/dist/run-migrations.d.ts +0 -11
  40. package/dist/run-migrations.d.ts.map +0 -1
  41. package/dist/run-migrations.js +0 -202
  42. package/dist/run-migrations.js.map +0 -1
  43. package/dist/test-fixtures/config.d.ts +0 -5
  44. package/dist/test-fixtures/config.d.ts.map +0 -1
  45. package/dist/test-fixtures/config.js +0 -14
  46. package/dist/test-fixtures/config.js.map +0 -1
  47. package/dist/test-fixtures/hooks.d.ts +0 -8
  48. package/dist/test-fixtures/hooks.d.ts.map +0 -1
  49. package/dist/test-fixtures/hooks.js +0 -77
  50. package/dist/test-fixtures/hooks.js.map +0 -1
  51. package/dist/test-fixtures/index.d.ts +0 -3
  52. package/dist/test-fixtures/index.d.ts.map +0 -1
  53. package/dist/test-fixtures/index.js +0 -19
  54. package/dist/test-fixtures/index.js.map +0 -1
  55. package/dist/test.d.ts.map +0 -1
  56. package/dist/types.d.ts +0 -14
  57. package/dist/types.d.ts.map +0 -1
  58. package/dist/types.js +0 -11
  59. package/dist/types.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,mDAAiC;AACjC,yDAAuC;AACvC,qCAKmB;AAJf,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,uGAAA,YAAY,OAAA;AACZ,2GAAA,gBAAgB,OAAA;AAEpB,yDAAuC;AAEvC,iBAAiB;AACjB,2CAAyB"}
1
+ {"version":3,"sources":["../src/config/postgres-config.ts","../src/config/postgres-config-spec.ts","../src/types.ts","../src/helpers.ts","../src/postgres-unit-of-work.ts","../src/run-migrations.ts","../src/run-hexai-migrations.ts","../src/postgres-event-store.ts"],"names":["IsolationLevel","pg","pg3","__dirname","path"],"mappings":";;;;;;;;;;;;AAiBO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAyC;AAAA,EAClC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EAEhB,YAAY,MAAA,EAOT;AACC,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,OAAO,IAAA,IAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAO,IAAA,IAAQ,UAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAO,IAAA,IAAQ,IAAA;AAC3B,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAAA,EACvB;AAAA,EAEA,OAAc,QAAQ,KAAA,EAA+B;AACjD,IAAA,OAAO,IAAI,eAAA,CAAe,eAAA,CAAe,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAc,OAAA,CACV,MAAA,EACA,OAAA,EACc;AACd,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,KAAA;AAE9B,IAAA,IAAI,SAAS,KAAA,EAAO;AAChB,MAAA,MAAM,MAAA,GAAS,GAAG,MAAM,CAAA,IAAA,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAE9B,MAAA,IAAI,CAAC,GAAA,EAAK;AACN,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,eAAA,CAAe,QAAQ,GAAG,CAAA;AAAA,IACrC;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,SAAA,CAAW,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,wBAAwB,MAAM,CAAA,oBAAA;AAAA,OAClC;AAAA,IACJ;AAEA,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,QAAA;AAAA,MACA,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,MAClC,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,CAAA,GAC5B,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,CAAE,CAAA,GACvC,MAAA;AAAA,MACN,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,MAClC,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,SAAA,CAAW;AAAA,KAC7C,CAAA;AAAA,EACL;AAAA,EAEA,OAAe,SAAS,KAAA,EAAe;AACnC,IAAA,MAAM,KAAA,GACF,0GAAA;AAEJ,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAEjC,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,IAAA,EAAM,QAAA,KAAa,OAAA,CAAQ,MAAA;AAEzD,IAAA,OAAO;AAAA,MACH,IAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAAA,MAC9B;AAAA,KACJ;AAAA,EACJ;AAAA,EAEO,aAAa,QAAA,EAAkC;AAClD,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACL;AAAA,EAEO,SAAS,IAAA,EAA8B;AAC1C,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACL;AAAA,EAEO,aAAa,QAAA,EAAkC;AAClD,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACL;AAAA,EAEO,SAAS,IAAA,EAA8B;AAC1C,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,IAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACL;AAAA,EAEO,SAAS,IAAA,EAA8B;AAC1C,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACL;AAAA,EAEO,aAAa,IAAA,EAA8B;AAC9C,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,MAAM,IAAA;AAAK,KAC9B,CAAA;AAAA,EACL;AAAA,EAEO,sBAAsB,iBAAA,EAA2C;AACpE,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,MAAM,iBAAA;AAAkB,KAC3C,CAAA;AAAA,EACL;AAAA,EAEO,gBAAgB,WAAA,EAAqC;AACxD,IAAA,OAAO,IAAI,eAAA,CAAe;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,MAAM,WAAA;AAAY,KACrC,CAAA;AAAA,EACL;AAAA,EAEO,QAAA,GAAmB;AACtB,IAAA,IAAI,GAAA,GAAM,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAA,CAAA;AAEjC,IAAA,IAAI,KAAK,QAAA,EAAU;AACf,MAAA,GAAA,IAAO,CAAA,CAAA,EAAI,KAAK,QAAQ,CAAA,CAAA;AAAA,IAC5B;AACA,IAAA,GAAA,IAAO,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,EAAI,KAAK,QAAQ,CAAA,CAAA;AAElD,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,IAAA,CAAK,IAAA,EAAM,IAAA,KAAS,MAAA,EAAW;AAC/B,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAM,iBAAA,KAAsB,MAAA,EAAW;AAC5C,MAAA,WAAA,CAAY,IAAA;AAAA,QACR,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAA;AAAA,OACrD;AAAA,IACJ;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAM,WAAA,KAAgB,MAAA,EAAW;AACtC,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AACxB,MAAA,GAAA,IAAO,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,GAAA;AAAA,EACX;AACJ;;;ACtOO,IAAM,qBAAN,MAA+D;AAAA,EAGlE,WAAA,CACqB,MAAA,EACA,IAAA,GAA+B,KAAA,EAClD;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAClB;AAAA,EALM,KAAA,GAAQ,UAAA;AAAA,EAOjB,QAAQ,MAAA,EAA8C;AAClD,IAAA,IAAI;AACA,MAAA,OAAO,cAAA,CAAe,QAAQ,IAAA,CAAK,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAClE,SAAS,CAAA,EAAG;AACR,MAAA,MAAA,CAAO,IAAA,CAAM,EAAY,OAAO,CAAA;AAChC,MAAA,OAAO,MAAA;AAAA,IACX;AAAA,EACJ;AACJ;AAuBO,SAAS,cAAA,CACZ,MAAA,EACA,IAAA,GAA+B,KAAA,EACb;AAClB,EAAA,OAAO,IAAI,kBAAA,CAAmB,MAAA,EAAQ,IAAI,CAAA;AAC9C;;;ACvCO,IAAK,cAAA,qBAAAA,eAAAA,KAAL;AACH,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,gBAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,gBAAA,cAAA,CAAA,GAAe,cAAA;AAJP,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;ACDL,IAAM,gBAAN,MAAoB;AAAA,EACb,MAAA;AAAA,EAEH,SAAA,GAAuB;AAC1B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,YAAY,WAAA,EAAkD;AAC1D,IAAA,IACI,WAAA,YAAuB,cAAA,IACvB,OAAO,WAAA,KAAgB,QAAA,EACzB;AACE,MAAA,IAAA,CAAK,MAAA,GAAS,IAAOC,GAAA,CAAA,MAAA,CAAO;AAAA,QACxB,gBAAA,EAAkB,YAAY,QAAA;AAAS,OAC1C,CAAA;AAAA,IACL,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AAAA,IAClB;AAAA,EACJ;AAAA,EAEA,MAAgB,WACZ,IAAA,EACU;AACV,IAAA,MAAM,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAClC,IAAA,OAAO,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAa,KAAA,CACT,KAAA,EACA,MAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA;AAAA,MAAW,CAAC,MAAA,KAClC,MAAA,CAAO,KAAA,CAAM,OAAO,MAAM;AAAA,KAC9B;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,KAAA,GAAuB;AAChC,IAAA,MAAM,IAAA,CAAK,OAAO,GAAA,EAAI;AAAA,EAC1B;AACJ;AAEO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EAC/C,MAAa,eAAe,IAAA,EAA6B;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,MACtB,8CAA8C,IAAI,CAAA,CAAA;AAAA,KACtD;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAAA,IACrD;AAAA,EACJ;AAAA,EAEA,MAAa,aAAa,IAAA,EAA6B;AACnD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAAA,EACtD;AACJ;AA0KO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EAC5C,MAAa,eAAe,SAAA,EAK1B;AACE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAKN,SAAS,CAAA;AAAA,QAAA,CAClC,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACxB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,MAAM,GAAA,CAAI;AAAA,KACd,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,MAAa,YAAY,SAAA,EAAqC;AAC1D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIN,SAAS,CAAA;AAAA,QAAA,CAClC,CAAA;AAED,IAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAa,WAAA,CACT,IAAA,EACA,OAAA,EAIa;AACb,IAAA,IAAI,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AAC9B,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAA,GAAQ;AAAA,yBAAA,EACK,IAAI,CAAA;AAAA,gBAAA,EACb,OAAA,CACG,GAAA,CAAI,CAAC,MAAA,KAAW,GAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA,CACnD,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,QAAA,CAAA;AAIvB,IAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAa,UAAU,IAAA,EAA6B;AAChD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,EACtD;AAAA,EAEA,MAAa,cAAc,IAAA,EAA6B;AACpD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACzE;AAAA,EAEA,MAAa,iBAAA,GAAmC;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AAExC,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAC,CAAA;AAAA,EACtE;AAAA,EAEA,MAAa,aAAA,GAA+B;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AAExC,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAc,aAAA,GAAmC;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAK/B,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,UAAU,CAAA;AAAA,EAC7C;AACJ;AAkBA,eAAsB,iBAAiB,MAAA,EAAsC;AACzE,EAAA,IAAI;AACA,IAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,EACzB,SAAS,CAAA,EAAG;AACR,IAAA,IAAK,CAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG,CAE9C,MAAO;AACH,MAAA,MAAM,CAAA;AAAA,IACV;AAAA,EACJ;AACJ;;;ACtUO,IAAM,4BAAN,MAA8D;AAAA,EAGjE,WAAA,CACY,eACA,aAAA,EACV;AAFU,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EACT;AAAA,EALK,kBAAA,GAAqB,IAAI,iBAAA,EAAuC;AAAA,EAOjE,SAAA,GAA2B;AAC9B,IAAA,MAAM,OAAA,GAAU,KAAK,qBAAA,EAAsB;AAE3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,IAAA,CACF,EAAA,EACA,OAAA,GAA+C,EAAC,EACtC;AACV,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,eAAe,CAAA;AAE3D,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MAAiB,WAAA;AAAA,MAAa,CAAC,EAAA,KACvC,EAAA,CAAG,OAAA,CAAQ,IAAI,eAAe;AAAA,KAClC;AAAA,EACJ;AAAA,EAEA,MAAM,WAAc,EAAA,EAAuD;AACvE,IAAA,MAAM,kBAAA,GAAqB,KAAK,qBAAA,EAAsB;AAEtD,IAAA,IAAI,kBAAA,EAAoB;AACpB,MAAA,OAAO,EAAA,CAAG,kBAAA,CAAmB,SAAA,EAAW,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,IAAI;AACA,MAAA,MAAM,iBAAiB,MAAM,CAAA;AAC7B,MAAA,OAAO,MAAM,GAAG,MAAM,CAAA;AAAA,IAC1B,CAAA,SAAE;AACE,MAAA,MAAM,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,IACrC;AAAA,EACJ;AAAA,EAEQ,qBAAA,GAAoD;AACxD,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAS,IAAK,IAAA;AAAA,EACjD;AAAA,EAEQ,eACJ,OAAA,EAC0B;AAC1B,IAAA,OAAO;AAAA,MACH,aAAa,WAAA,CAAY,QAAA;AAAA,MACzB,GAAG;AAAA,KACP;AAAA,EACJ;AAAA,EAEQ,mBACJ,OAAA,EACmB;AACnB,IAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,WAAA,CAAY,GAAA,EAAK;AACzC,MAAA,OAAO,KAAK,iBAAA,EAAkB;AAAA,IAClC;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA,EAAsB,IAAK,IAAA,CAAK,iBAAA,EAAkB;AAAA,EAClE;AAAA,EAEQ,iBAAA,GAAyC;AAC7C,IAAA,OAAO,IAAI,mBAAA,CAAoB,IAAA,CAAK,aAAA,EAAe,KAAK,aAAa,CAAA;AAAA,EACzE;AAAA,EAEQ,gBAAA,CACJ,aACA,QAAA,EACU;AACV,IAAA,OAAO,KAAK,kBAAA,CAAmB,GAAA;AAAA,MAAI,WAAA;AAAA,MAAa,MAC5C,SAAS,WAAW;AAAA,KACxB;AAAA,EACJ;AACJ;AAEA,IAAM,sBAAN,MAA0B;AAAA,EAWtB,WAAA,CACY,eACA,aAAA,EACV;AAFU,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EACT;AAAA,EAbK,WAAA,GAAc,KAAA;AAAA,EACd,MAAA,GAAS,KAAA;AAAA,EACT,UAAA;AAAA,EAEA,YAAA,GAAe,CAAA;AAAA,EACf,OAAA;AAAA,EAEA,MAAA;AAAA,EACA,aAA0B,EAAC;AAAA,EAOnC,MAAa,OAAA,CACT,EAAA,EACA,OAAA,EACU;AACV,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,MAAM,KAAK,aAAA,EAAc;AAEzB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AACzD,IAAA,OAAO,QAAA,KAAa,OACd,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA,GACxB,QAAA,CAAS,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,EACtC;AAAA,EAEO,SAAA,GAA2B;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,MAAc,aAAA,GAA+B;AACzC,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAAA,EAChC;AAAA,EAEA,MAAc,gBAAA,GAAkC;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AAExC,IAAA,IAAI,EAAE,WAAW,MAAA,CAAA,EAAS;AACtB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,iBAAiB,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAClB;AAAA,EAEA,MAAc,gBAAA,GAAkC;AAC5C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAE/B,IAAA,MAAM,cAAA,GACF,KAAK,OAAA,CAAQ,cAAA,IAAA,gBAAA;AACjB,IAAA,IAAI,cAAA,KAAA,gBAAA,uBAAkD;AAClD,MAAA,MAAM,KAAK,MAAA,CAAO,KAAA;AAAA,QACd,mCAAmC,cAAc,CAAA;AAAA,OACrD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,iBACV,EAAA,EACU;AACV,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAA;AAAA,IAC3C,SAAS,CAAA,EAAG;AACR,MAAA,OAAA,CAAQ,MAAM,CAAA,2CAAA,CAA6C,CAAA;AAC3D,MAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AACf,MAAA,IAAA,CAAK,cAAc,CAAU,CAAA;AAC7B,MAAA,MAAM,CAAA;AAAA,IACV,CAAA,SAAE;AACE,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEA,MAAc,mBACV,EAAA,EACU;AACV,IAAA,IAAA,CAAK,YAAA,EAAA;AACL,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,EAAA,CAAG,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,YAAA,EAAA;AAAA,IACT;AAAA,EACJ;AAAA,EAEQ,cAAc,KAAA,EAAoB;AACtC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACtB;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC1C,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACzB,MAAA,OAAO,KAAK,SAAA,EAAU,GAAI,KAAK,QAAA,EAAS,GAAI,KAAK,MAAA,EAAO,CAAA;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEQ,gBACJ,WAAA,EAC+B;AAC/B,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACzB,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,WAAA,KAAgB,YAAY,MAAA,GAC7B,IAAA,CAAK,iBAAgB,GACpB,IAAA,CAAK,qBAAoB,IAAK,IAAA;AAAA,EACzC;AAAA,EAEQ,eAAA,GAA6B;AACjC,IAAA,MAAM,YAAY,IAAI,SAAA;AAAA,MAClB,CAAA,GAAA,EAAM,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAA;AAAA,MAChC,IAAA,CAAK,MAAA;AAAA,MACL,MAAM,KAAK,eAAA;AAAgB,KAC/B;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAC9B,IAAA,OAAO,SAAA;AAAA,EACX;AAAA,EAEQ,mBAAA,GAA6C;AACjD,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAClD,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,CAAE,UAAS,EAAG;AAChC,QAAA,OAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,eAAA,GAAwB;AAC5B,IAAA,IAAA,CAAK,WAAW,GAAA,EAAI;AAAA,EACxB;AAAA,EAEA,MAAc,MAAA,GAAwB;AAClC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,MAAM,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAc,QAAA,GAA0B;AACpC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAEd,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,IACtC,SAAS,CAAA,EAAG;AACR,MAAA,IACI,aAAa,KAAA,IACb,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,wCAAwC,CAAA,EAC7D;AACE,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,CAAA;AAAA,IACV;AAEA,IAAA,MAAM,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEQ,SAAA,GAAqB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,CAAC,IAAA,CAAK,MAAA;AAAA,EAClD;AACJ,CAAA;AAEA,IAAM,YAAN,MAAgB;AAAA,EAOZ,WAAA,CACqB,IAAA,EACA,MAAA,EACA,OAAA,EACnB;AAHmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAClB;AAAA,EAVK,WAAA,GAAc,KAAA;AAAA,EACd,MAAA,GAAS,KAAA;AAAA,EACT,UAAA;AAAA,EAEA,YAAA,GAAe,CAAA;AAAA,EAQvB,MAAa,QACT,EAAA,EACU;AACV,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,OAAO,IAAA,CAAK,iBAAiB,EAAE,CAAA;AAAA,EACnC;AAAA,EAEO,QAAA,GAAoB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,MAAc,aAAA,GAA+B;AACzC,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEA,MAAc,iBACV,EAAA,EACU;AACV,IAAA,IAAA,CAAK,YAAA,EAAA;AACL,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,EAAA,CAAG,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B,SAAS,CAAA,EAAG;AACR,MAAA,IAAA,CAAK,cAAc,CAAU,CAAA;AAC7B,MAAA,MAAM,CAAA;AAAA,IACV,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,YAAA,EAAA;AACL,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEQ,cAAc,KAAA,EAAoB;AACtC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACtB;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC1C,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACzB,MAAA,OAAO,KAAK,SAAA,EAAU,GAAI,KAAK,QAAA,EAAS,GAAI,KAAK,MAAA,EAAO,CAAA;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEA,MAAc,MAAA,GAAwB;AAClC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxD,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,MAAc,QAAA,GAA0B;AACpC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC5D,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEQ,SAAA,GAAqB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,CAAC,IAAA,CAAK,MAAA;AAAA,EAClD;AACJ,CAAA;AAMO,SAAS,yBACZ,MAAA,EACkB;AAClB,EAAA,IAAI,kBAAqB,GAAA,CAAA,IAAA,EAAM;AAC3B,IAAA,OAAO,IAAI,yBAAA;AAAA,MACP,YAAY,OAAO,OAAA,EAAQ;AAAA,MAC3B,CAAC,MAAA,KAAY,MAAA,CAAyB,OAAA;AAAQ,KAClD;AAAA,EACJ;AAEA,EAAA,MAAM,gBAAA,GACF,MAAA,YAAkB,cAAA,GAAiB,MAAA,CAAO,UAAS,GAAI,MAAA;AAE3D,EAAA,OAAO,IAAI,yBAAA;AAAA,IACP,MAAM,IAAO,GAAA,CAAA,MAAA,CAAO,EAAE,kBAAkB,CAAA;AAAA,IACxC,CAAC,MAAA,KAAY,MAAA,CAAqB,GAAA;AAAI,GAC1C;AACJ;AChXA,SAAS,qBAAqB,QAAA,EAA0B;AACpD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACrC,EAAA,OAAO,QAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC5C;AAeA,eAAe,wBAAA,CACX,QACA,SAAA,EACa;AAEb,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,KAAA;AAAA,IAC7B;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIA,CAAC,SAAS;AAAA,GACd;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAGnC,EAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,KAAA;AAAA,IAC9B;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIA,CAAC,SAAS;AAAA,GACd;AAEA,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,OAAO,KAAA,CAAM;AAAA,yBAAA,EACA,SAAS,CAAA;AAAA;AAAA,QAAA,CAE3B,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,SAAS,CAAA,0BAAA,CAAuB,CAAA;AAAA,EAClE;AACJ;AAMA,eAAe,qBAAqB,GAAA,EAA+B;AAC/D,EAAA,IAAI;AACA,IAAA,MAAM,UAAU,MAAS,GAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC7D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AACzB,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACrB,QAAA,MAAM,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,MAAM,eAAe,CAAA;AAC1D,QAAA,IAAI;AACA,UAAA,MAAS,WAAO,OAAO,CAAA;AACvB,UAAA,OAAO,IAAA;AAAA,QACX,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAKA,eAAe,gBAAA,CACX,MAAA,EACA,GAAA,EACA,eAAA,EACA,MAAA,EACa;AAEb,EAAA,MAAM,OAAO,KAAA,CAAM;AAAA,oCAAA,EACe,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKhD,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,KAAA;AAAA,IAC/B,qBAAqB,eAAe,CAAA,qBAAA;AAAA,GACxC;AACA,EAAA,MAAM,iBAAA,GAAoB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAGvE,EAAA,MAAM,UAAU,MAAS,GAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,OAAA,CACjB,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,WAAA,EAAa,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CACjB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,qBAAqB,CAAC,CAAA,GAAI,oBAAA,CAAqB,CAAC,CAAC,CAAA;AAGrE,EAAA,MAAM,oBAAqD,EAAC;AAC5D,EAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACtC,IAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA,EAAG;AACrC,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,eAAe,CAAA;AAC5D,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,MAAS,GAAA,CAAA,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC9C,MAAA,iBAAA,CAAkB,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,KAAK,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACJ;AAEA,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,IAAA;AAAA,EACJ;AAEA,EAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAChC,EAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,MAAA,EAAQ;AACR,IAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,IAAA;AAAA,EACJ;AAGA,EAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,SAAA,CAAU,IAAI,CAAA,SAAA,CAAW,CAAA;AACtD,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,GAAG,CAAA;AAChC,IAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACT,gBAAgB,eAAe,CAAA,oBAAA,CAAA;AAAA,MAC/B,CAAC,UAAU,IAAI;AAAA,KACnB;AAAA,EACJ;AACJ;AAEA,eAAsB,aAAA,CAAc;AAAA,EAChC,SAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,KAAA;AAAA,EACA,MAAA,GAAS;AACb,CAAA,EAAoC;AAChC,EAAA,MAAM,eAAA,GAAkB,SAAA,GAClB,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA,GAC9B,mBAAA;AAEN,EAAA,MAAM,MAAA,GAAS,IAAOC,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA;AAChC,EAAA,IAAI;AACA,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,MAAM,wBAAA,CAAyB,QAAQ,eAAe,CAAA;AAGtD,IAAA,MAAM,WAAA,GAAc,MAAM,oBAAA,CAAqB,GAAG,CAAA;AAElD,IAAA,IAAI,WAAA,EAAa;AAEb,MAAA,MAAM,gBAAA,CAAiB,MAAA,EAAQ,GAAA,EAAK,eAAA,EAAiB,MAAM,CAAA;AAAA,IAC/D,CAAA,MAAO;AAEH,MAAA,MAAM,OAAO,GAAA,EAAI;AACjB,MAAA,MAAM,MAAA,CAAO;AAAA,QACT,WAAA,EAAa,IAAI,QAAA,EAAS;AAAA,QAC1B,GAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,eAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA,EAAmB,IAAA;AAAA,QACnB,GAAA,EAAK,CAAC,GAAA,KAAgB;AAGlB,UAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,+BAA+B,CAAA,EAAG;AAClD,YAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,UACnB;AAAA,QACJ;AAAA,OACH,CAAA;AACD,MAAA;AAAA,IACJ;AAAA,EACJ,CAAA,SAAE;AACE,IAAA,IAAI;AACA,MAAA,MAAM,OAAO,GAAA,EAAI;AAAA,IACrB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACJ;AACJ;AC3MA,IAAMC,cAAYC,cAAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC7D,IAAM,cAAA,GAAiBA,cAAAA,CAAK,IAAA,CAAKD,WAAA,EAAW,eAAe,CAAA;AAE3D,eAAsB,mBAAmB,KAAA,EAAgC;AACrE,EAAA,MAAM,aAAA,CAAc;AAAA,IAChB,GAAA,EAAK,cAAA;AAAA,IACL,GAAA,EAAK,KAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACd,CAAA;AACL;ACLA,IAAM,kBAAA,GAAqB,eAAA;AAC3B,IAAM,iBAAA,GAAoB,CAAA;AAanB,IAAM,qBAAN,MAA+C;AAAA,EAGlD,WAAA,CACqB,MAAA,EACjB,MAAA,GAAmC,EAAC,EACtC;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGjB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AAAA,EACzC;AAAA,EAPiB,SAAA;AAAA,EASjB,MAAM,MAAM,KAAA,EAAsC;AAC9C,IAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAU;AAEnC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MAC7B,CAAA,YAAA,EAAe,KAAK,SAAS,CAAA;AAAA;AAAA,+BAAA,CAAA;AAAA,MAG7B;AAAA,QACI,MAAM,cAAA,EAAe;AAAA,QACrB,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAAA,QACjC,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,OAAO;AAAA;AACrC,KACJ;AAEA,IAAA,OAAO;AAAA,MACH,QAAA,EAAU,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,QAAA;AAAA,MAC1B;AAAA,KACJ;AAAA,EACJ;AAAA,EAEA,MAAM,SAAS,MAAA,EAA2C;AACtD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC7B,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAU;AACnC,MAAA,MAAM,SAAS,KAAA,GAAQ,iBAAA;AACvB,MAAA,YAAA,CAAa,IAAA;AAAA,QACT,CAAA,EAAA,EAAK,SAAS,CAAC,CAAA,GAAA,EAAM,SAAS,CAAC,CAAA,GAAA,EAAM,SAAS,CAAC,CAAA,CAAA;AAAA,OACnD;AACA,MAAA,MAAA,CAAO,IAAA;AAAA,QACH,MAAM,cAAA,EAAe;AAAA,QACrB,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAAA,QACjC,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,OAAO;AAAA,OACrC;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MAC7B,CAAA,YAAA,EAAe,KAAK,SAAS,CAAA;AAAA,oBAAA,EACnB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA,+BAAA,CAAA;AAAA,MAEjC;AAAA,KACJ;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,MAAW;AAAA,MACpC,QAAA,EAAU,CAAC,GAAA,CAAI,QAAA;AAAA,MACf,KAAA,EAAO,OAAO,KAAK;AAAA,KACvB,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,MAAM,KAAA,CACF,aAAA,EACA,KAAA,EAC8B;AAC9B,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,EAAgB;AAEhD,IAAA,IAAI,KAAA,GAAQ;AAAA;AAAA,iBAAA,EAED,KAAK,SAAS;AAAA;AAAA;AAAA,QAAA,CAAA;AAIzB,IAAA,MAAM,MAAA,GAAoB,CAAC,aAAa,CAAA;AAExC,IAAA,IAAI,UAAU,MAAA,EAAW;AACrB,MAAA,KAAA,IAAS,CAAA,SAAA,CAAA;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAgB,OAAO,MAAM,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAwB,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KAC3C,IAAA,CAAK,cAAA,CAAe,GAAG;AAAA,KAC3B;AAEA,IAAA,OAAO;AAAA,MACH,MAAA;AAAA,MACA;AAAA,KACJ;AAAA,EACJ;AAAA,EAEA,MAAM,eAAA,GAAmC;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MAC7B,CAAA,iCAAA,EAAoC,KAAK,SAAS,CAAA;AAAA,KACtD;AAEA,IAAA,OAAO,EAAE,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,GAAA,IAAO,CAAA,CAAA;AAAA,EACnC;AAAA,EAEQ,eAAe,GAAA,EAA4B;AAC/C,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,OAAc,CAAA;AAElD,IAAA,OAAO;AAAA,MACH,QAAA,EAAU,CAAC,GAAA,CAAI,QAAA;AAAA,MACf;AAAA,KACJ;AAAA,EACJ;AACJ","file":"index.js","sourcesContent":["import type { DatabaseConfig } from \"ezcfg\";\n\nexport interface PoolOptions {\n size?: number;\n connectionTimeout?: number;\n idleTimeout?: number;\n}\n\nexport interface FromEnvOptions {\n /**\n * Environment variable loading mode.\n * - \"url\": Load from {PREFIX}_URL (default)\n * - \"fields\": Load from {PREFIX}_HOST, {PREFIX}_PORT, {PREFIX}_DATABASE, {PREFIX}_USER, {PREFIX}_PASSWORD\n */\n mode?: \"url\" | \"fields\";\n}\n\nexport class PostgresConfig implements DatabaseConfig {\n public readonly host: string;\n public readonly database: string;\n public readonly user: string;\n public readonly port: number;\n public readonly password?: string;\n public readonly pool?: PoolOptions;\n\n constructor(config: {\n database: string;\n user?: string;\n host?: string;\n port?: number;\n password?: string;\n pool?: PoolOptions;\n }) {\n this.database = config.database;\n this.password = config.password;\n this.host = config.host ?? \"localhost\";\n this.user = config.user ?? \"postgres\";\n this.port = config.port ?? 5432;\n this.pool = config.pool;\n }\n\n public static fromUrl(value: string): PostgresConfig {\n return new PostgresConfig(PostgresConfig.parseUrl(value));\n }\n\n /**\n * Creates a PostgresConfig from environment variables.\n *\n * @param prefix - Environment variable prefix\n * @param options - Loading options (mode: \"url\" | \"fields\")\n * @throws Error if required environment variables are not set\n *\n * @example\n * ```typescript\n * // URL mode (default): reads ASSIGNMENT_DB_URL\n * const config = PostgresConfig.fromEnv(\"ASSIGNMENT_DB\");\n *\n * // Fields mode: reads POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DATABASE, POSTGRES_USER, POSTGRES_PASSWORD\n * const config = PostgresConfig.fromEnv(\"POSTGRES\", { mode: \"fields\" });\n * ```\n */\n public static fromEnv(\n prefix: string,\n options?: FromEnvOptions\n ): PostgresConfig {\n const mode = options?.mode ?? \"url\";\n\n if (mode === \"url\") {\n const envKey = `${prefix}_URL`;\n const url = process.env[envKey];\n\n if (!url) {\n throw new Error(`Environment variable ${envKey} is not set`);\n }\n\n return PostgresConfig.fromUrl(url);\n }\n\n // fields mode\n const database = process.env[`${prefix}_DATABASE`];\n if (!database) {\n throw new Error(\n `Environment variable ${prefix}_DATABASE is not set`\n );\n }\n\n return new PostgresConfig({\n database,\n host: process.env[`${prefix}_HOST`],\n port: process.env[`${prefix}_PORT`]\n ? parseInt(process.env[`${prefix}_PORT`]!)\n : undefined,\n user: process.env[`${prefix}_USER`],\n password: process.env[`${prefix}_PASSWORD`],\n });\n }\n\n private static parseUrl(value: string) {\n const regex =\n /postgres(ql)?:\\/\\/(?<user>[^:/]+)(:(?<password>[^@]+))?@(?<host>[^:/]+)(:(?<port>\\d+))?\\/(?<database>.+)/;\n\n const matches = value.match(regex);\n\n if (!matches?.groups) {\n throw new Error(`Invalid postgres url: ${value}`);\n }\n\n const { user, password, host, port, database } = matches.groups;\n\n return {\n host,\n database,\n user,\n port: port ? parseInt(port) : 5432,\n password,\n };\n }\n\n public withDatabase(database: string): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database,\n user: this.user,\n port: this.port,\n password: this.password,\n pool: this.pool,\n });\n }\n\n public withUser(user: string): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database: this.database,\n user,\n port: this.port,\n password: this.password,\n pool: this.pool,\n });\n }\n\n public withPassword(password: string): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database: this.database,\n user: this.user,\n port: this.port,\n password,\n pool: this.pool,\n });\n }\n\n public withHost(host: string): PostgresConfig {\n return new PostgresConfig({\n host,\n database: this.database,\n user: this.user,\n port: this.port,\n password: this.password,\n pool: this.pool,\n });\n }\n\n public withPort(port: number): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database: this.database,\n user: this.user,\n port,\n password: this.password,\n pool: this.pool,\n });\n }\n\n public withPoolSize(size: number): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database: this.database,\n user: this.user,\n port: this.port,\n password: this.password,\n pool: { ...this.pool, size },\n });\n }\n\n public withConnectionTimeout(connectionTimeout: number): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database: this.database,\n user: this.user,\n port: this.port,\n password: this.password,\n pool: { ...this.pool, connectionTimeout },\n });\n }\n\n public withIdleTimeout(idleTimeout: number): PostgresConfig {\n return new PostgresConfig({\n host: this.host,\n database: this.database,\n user: this.user,\n port: this.port,\n password: this.password,\n pool: { ...this.pool, idleTimeout },\n });\n }\n\n public toString(): string {\n let url = `postgres://${this.user}`;\n\n if (this.password) {\n url += `:${this.password}`;\n }\n url += `@${this.host}:${this.port}/${this.database}`;\n\n const queryParams: string[] = [];\n if (this.pool?.size !== undefined) {\n queryParams.push(`pool_size=${this.pool.size}`);\n }\n if (this.pool?.connectionTimeout !== undefined) {\n queryParams.push(\n `connection_timeout=${this.pool.connectionTimeout}`\n );\n }\n if (this.pool?.idleTimeout !== undefined) {\n queryParams.push(`idle_timeout=${this.pool.idleTimeout}`);\n }\n\n if (queryParams.length > 0) {\n url += `?${queryParams.join(\"&\")}`;\n }\n\n return url;\n }\n}\n","import type { ConfigSpec } from \"ezcfg\";\nimport { PostgresConfig, type FromEnvOptions } from \"./postgres-config\";\n\nexport class PostgresConfigSpec implements ConfigSpec<PostgresConfig> {\n readonly _type = \"postgres\";\n\n constructor(\n private readonly prefix: string,\n private readonly mode: FromEnvOptions[\"mode\"] = \"url\"\n ) {}\n\n resolve(errors: string[]): PostgresConfig | undefined {\n try {\n return PostgresConfig.fromEnv(this.prefix, { mode: this.mode });\n } catch (e) {\n errors.push((e as Error).message);\n return undefined;\n }\n }\n}\n\n/**\n * PostgreSQL database configuration from environment variables.\n * Returns a PostgresConfig instance.\n *\n * @param prefix - Environment variable prefix\n * @param mode - \"url\" reads {PREFIX}_URL, \"fields\" reads individual fields\n *\n * @example\n * ```typescript\n * import { defineConfig, env } from \"@hexaijs/core\";\n * import { postgresConfig } from \"@hexaijs/postgres\";\n *\n * const getConfig = defineConfig({\n * db: postgresConfig(\"ORDER_DB\"), // reads ORDER_DB_URL\n * db2: postgresConfig(\"PG\", \"fields\"), // reads PG_HOST, PG_PORT, etc.\n * });\n *\n * getConfig().db.host; // \"localhost\"\n * getConfig().db.toString(); // \"postgres://...\"\n * ```\n */\nexport function postgresConfig(\n prefix: string,\n mode: FromEnvOptions[\"mode\"] = \"url\"\n): PostgresConfigSpec {\n return new PostgresConfigSpec(prefix, mode);\n}\n","import * as pg from \"pg\";\n\nimport { BaseUnitOfWorkOptions } from \"@hexaijs/core\";\n\nexport type ClientFactory = () => pg.ClientBase | Promise<pg.ClientBase>;\n\nexport type ClientCleanUp = (client: pg.ClientBase) => void | Promise<void>;\n\nexport enum IsolationLevel {\n READ_UNCOMMITTED = \"read uncommitted\",\n READ_COMMITTED = \"read committed\",\n REPEATABLE_READ = \"repeatable read\",\n SERIALIZABLE = \"serializable\",\n}\n\nexport interface PostgresTransactionOptions extends BaseUnitOfWorkOptions {\n isolationLevel?: IsolationLevel;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport * as pg from \"pg\";\n\nimport { PostgresConfig } from \"@/config\";\n\nexport class ClientWrapper {\n protected client: pg.Client;\n\n public getClient(): pg.Client {\n return this.client;\n }\n\n constructor(urlOrClient: PostgresConfig | string | pg.Client) {\n if (\n urlOrClient instanceof PostgresConfig ||\n typeof urlOrClient === \"string\"\n ) {\n this.client = new pg.Client({\n connectionString: urlOrClient.toString(),\n });\n } else {\n this.client = urlOrClient;\n }\n }\n\n protected async withClient<T = unknown>(\n work: (client: pg.Client) => Promise<T>\n ): Promise<T> {\n await ensureConnection(this.client);\n return work(this.client);\n }\n\n public async query<R = any>(\n query: string,\n params?: any[]\n ): Promise<Array<R>> {\n const result = await this.withClient((client) =>\n client.query(query, params)\n );\n return result.rows;\n }\n\n public async close(): Promise<void> {\n await this.client.end();\n }\n}\n\nexport class DatabaseManager extends ClientWrapper {\n public async createDatabase(name: string): Promise<void> {\n const exists = await this.query(\n `SELECT 1 FROM pg_database WHERE datname = '${name}'`\n );\n\n if (exists.length === 0) {\n await this.client.query(`CREATE DATABASE ${name}`);\n }\n }\n\n public async dropDatabase(name: string): Promise<void> {\n await this.query(`DROP DATABASE IF EXISTS ${name}`);\n }\n}\n\nexport class MigrationManager extends ClientWrapper {\n public tableManager: TableManager;\n private static readonly MIGRATION_TABLE: [\n string,\n {\n name: string;\n property: string;\n }[],\n ] = [\n \"hexai__migrations\",\n [\n {\n name: \"name\",\n property: \"VARCHAR(255) NOT NULL\",\n },\n {\n name: \"applied_at\",\n property: \"TIMESTAMP NOT NULL DEFAULT NOW()\",\n },\n ],\n ];\n\n private static withNamespace(namespace: string | undefined, name: string) {\n return namespace ? `${namespace}__${name}` : name;\n }\n\n private static stripNamespace(namespace: string | undefined, name: string) {\n return namespace ? name.replace(`${namespace}__`, \"\") : name;\n }\n\n private static hasNamespace(namespace: string | undefined, name: string) {\n return namespace ? name.startsWith(`${namespace}__`) : false;\n }\n\n constructor(\n urlOrClient: string | pg.Client,\n private namespace?: string\n ) {\n super(urlOrClient);\n\n this.tableManager = new TableManager(this.client);\n }\n\n public async open(): Promise<void> {\n await this.ensureMigrationTableCreated();\n }\n\n public async ensureMigrationTableCreated(): Promise<void> {\n const exists = await this.tableManager.tableExists(\n MigrationManager.MIGRATION_TABLE[0]\n );\n if (exists) {\n return;\n }\n\n await this.tableManager.createTable(\n ...MigrationManager.MIGRATION_TABLE\n );\n }\n\n public async getAppliedMigrations(): Promise<string[]> {\n const queryResult = await this.query(\n `SELECT name FROM hexai__migrations ORDER BY applied_at ASC;`\n );\n\n let migrations = queryResult.map((row) => row.name);\n\n migrations = this.stripNamespaceFromMigrations(migrations);\n\n return migrations;\n }\n\n private stripNamespaceFromMigrations(migrations: string[]): string[] {\n if (!this.namespace) {\n return migrations;\n }\n\n return migrations\n .filter((name) =>\n MigrationManager.hasNamespace(this.namespace, name)\n )\n .map((name) =>\n MigrationManager.stripNamespace(this.namespace, name)\n );\n }\n\n public async applyMigrations(\n migrations: Array<{\n name: string;\n sql: string;\n }>\n ): Promise<void> {\n const client = this.getClient();\n\n await runInsideTransaction(client, async () => {\n for (const migration of migrations) {\n await Promise.all([\n this.query(migration.sql),\n this.markMigrationsAsApplied(migration.name),\n ]);\n }\n });\n }\n\n private async markMigrationsAsApplied(\n ...migrations: string[]\n ): Promise<void> {\n for (const migration of migrations) {\n await this.query(\n `INSERT INTO hexai__migrations (name) VALUES ($1);`,\n [migration]\n );\n }\n }\n\n public async getMigrationsToApply(dir: string): Promise<\n Array<{\n name: string;\n sql: string;\n }>\n > {\n const migrations = await this.getMigrationsFromFileSystem(dir);\n const appliedMigrations = await this.getAppliedMigrations();\n\n // check that all applied migrations are in the migrations directory\n for (const appliedMigration of appliedMigrations) {\n if (!migrations.includes(appliedMigration)) {\n throw new Error(\n `Applied migration ${appliedMigration} not found in migrations directory`\n );\n }\n }\n\n const prevMaxMigrationIndex = Math.max(\n ...migrations.map((name) => appliedMigrations.indexOf(name))\n );\n\n const migrationsToApply = migrations.slice(prevMaxMigrationIndex + 1);\n return Promise.all(\n migrationsToApply.map(async (migrationDir) => {\n const migrationPath = path.join(\n dir,\n migrationDir,\n \"migration.sql\"\n );\n const sql = await fs.readFile(migrationPath, \"utf-8\");\n\n return {\n name: MigrationManager.withNamespace(\n this.namespace,\n migrationDir\n ),\n sql,\n };\n })\n );\n }\n\n private async getMigrationsFromFileSystem(dir: string): Promise<string[]> {\n const migrationDirs = (await fs.readdir(dir, { withFileTypes: true }))\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name)\n .sort();\n\n return migrationDirs;\n }\n}\n\nexport class TableManager extends ClientWrapper {\n public async getTableSchema(tableName: string): Promise<\n Array<{\n column: string;\n type: string;\n }>\n > {\n const result = await this.query(`\n SELECT\n column_name AS column,\n data_type AS type\n FROM information_schema.columns\n WHERE table_name = '${tableName}';\n `);\n\n return result.map((row) => ({\n column: row.column,\n type: row.type,\n }));\n }\n\n public async tableExists(tableName: string): Promise<boolean> {\n const result = await this.query(`\n SELECT\n table_name\n FROM information_schema.tables\n WHERE table_name = '${tableName}';\n `);\n\n return result.length > 0;\n }\n\n public async createTable(\n name: string,\n columns: Array<{\n name: string;\n property: string;\n }>\n ): Promise<void> {\n if (await this.tableExists(name)) {\n return;\n }\n\n const query = `\n CREATE TABLE ${name} (\n ${columns\n .map((column) => `${column.name} ${column.property}`)\n .join(\", \")}\n );\n `;\n\n await this.query(query);\n }\n\n public async dropTable(name: string): Promise<void> {\n await this.query(`DROP TABLE IF EXISTS \"${name}\";`);\n }\n\n public async truncateTable(name: string): Promise<void> {\n await this.query(`TRUNCATE TABLE \"${name}\" RESTART IDENTITY CASCADE;`);\n }\n\n public async truncateAllTables(): Promise<void> {\n const tables = await this.getTableNames();\n\n await Promise.all(tables.map((table) => this.truncateTable(table)));\n }\n\n public async dropAllTables(): Promise<void> {\n const tables = await this.getTableNames();\n\n await Promise.all(tables.map((table) => this.dropTable(table)));\n }\n\n private async getTableNames(): Promise<string[]> {\n const result = await this.query(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type = 'BASE TABLE';\n `);\n\n return result.map((row) => row.table_name);\n }\n}\n\nexport async function runInsideTransaction<T = unknown>(\n client: pg.Client,\n fn: (client: pg.Client) => Promise<T>\n): Promise<T> {\n await client.query(\"BEGIN\");\n\n try {\n const result = await fn(client);\n await client.query(\"COMMIT\");\n return result;\n } catch (e) {\n await client.query(\"ROLLBACK\");\n throw e;\n }\n}\n\nexport async function ensureConnection(client: pg.ClientBase): Promise<void> {\n try {\n await client.connect();\n } catch (e) {\n if ((e as Error).message.includes(\"already\")) {\n // ignore\n } else {\n throw e;\n }\n }\n}\n\nexport function isDatabaseError(e: any): e is pg.DatabaseError {\n return e instanceof Error && \"code\" in e;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport * as pg from \"pg\";\n\nimport { Propagation, UnitOfWork } from \"@hexaijs/core\";\nimport { PostgresConfig } from \"./config\";\nimport { IsolationLevel } from \"./types\";\nimport {\n ClientCleanUp,\n ClientFactory,\n PostgresTransactionOptions,\n} from \"./types\";\nimport { ensureConnection } from \"./helpers\";\n\nexport interface PostgresUnitOfWork\n extends UnitOfWork<pg.ClientBase, PostgresTransactionOptions> {\n withClient<T>(fn: (client: pg.ClientBase) => Promise<T>): Promise<T>;\n}\n\nexport class DefaultPostgresUnitOfWork implements PostgresUnitOfWork {\n private transactionStorage = new AsyncLocalStorage<PostgresTransaction>();\n\n constructor(\n private clientFactory: ClientFactory,\n private clientCleanUp?: ClientCleanUp\n ) {}\n\n public getClient(): pg.ClientBase {\n const current = this.getCurrentTransaction();\n\n if (!current) {\n throw new Error(\"Unit of work not started\");\n }\n\n return current.getClient();\n }\n\n async wrap<T = unknown>(\n fn: (client: pg.ClientBase) => Promise<T>,\n options: Partial<PostgresTransactionOptions> = {}\n ): Promise<T> {\n const resolvedOptions = this.resolveOptions(options);\n const transaction = this.resolveTransaction(resolvedOptions);\n\n return this.executeInContext(transaction, (tx) =>\n tx.execute(fn, resolvedOptions)\n );\n }\n\n async withClient<T>(fn: (client: pg.ClientBase) => Promise<T>): Promise<T> {\n const currentTransaction = this.getCurrentTransaction();\n\n if (currentTransaction) {\n return fn(currentTransaction.getClient());\n }\n\n const client = await this.clientFactory();\n try {\n await ensureConnection(client);\n return await fn(client);\n } finally {\n await this.clientCleanUp?.(client);\n }\n }\n\n private getCurrentTransaction(): PostgresTransaction | null {\n return this.transactionStorage.getStore() ?? null;\n }\n\n private resolveOptions(\n options: Partial<PostgresTransactionOptions>\n ): PostgresTransactionOptions {\n return {\n propagation: Propagation.EXISTING,\n ...options,\n };\n }\n\n private resolveTransaction(\n options: PostgresTransactionOptions\n ): PostgresTransaction {\n if (options.propagation === Propagation.NEW) {\n return this.createTransaction();\n }\n return this.getCurrentTransaction() ?? this.createTransaction();\n }\n\n private createTransaction(): PostgresTransaction {\n return new PostgresTransaction(this.clientFactory, this.clientCleanUp);\n }\n\n private executeInContext<T>(\n transaction: PostgresTransaction,\n callback: (transaction: PostgresTransaction) => Promise<T>\n ): Promise<T> {\n return this.transactionStorage.run(transaction, () =>\n callback(transaction)\n );\n }\n}\n\nclass PostgresTransaction {\n private initialized = false;\n private closed = false;\n private abortError?: Error;\n\n private nestingDepth = 0;\n private options!: PostgresTransactionOptions;\n\n private client!: pg.ClientBase;\n private savepoints: Savepoint[] = [];\n\n constructor(\n private clientFactory: ClientFactory,\n private clientCleanUp?: ClientCleanUp\n ) {}\n\n public async execute<T>(\n fn: (client: pg.ClientBase) => Promise<T>,\n options: PostgresTransactionOptions\n ): Promise<T> {\n this.options = options;\n await this.ensureStarted();\n\n const executor = this.resolveExecutor(options.propagation);\n return executor === this\n ? this.runWithLifecycle(fn)\n : executor.execute(fn, options);\n }\n\n public getClient(): pg.ClientBase {\n return this.client;\n }\n\n private async ensureStarted(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.initialized = true;\n await this.initializeClient();\n await this.beginTransaction();\n }\n\n private async initializeClient(): Promise<void> {\n const client = await this.clientFactory();\n\n if (!(\"query\" in client)) {\n throw new Error(\"Client factory must return a pg.ClientBase\");\n }\n\n await ensureConnection(client);\n this.client = client;\n }\n\n private async beginTransaction(): Promise<void> {\n await this.client.query(\"BEGIN\");\n\n const isolationLevel =\n this.options.isolationLevel ?? IsolationLevel.READ_COMMITTED;\n if (isolationLevel !== IsolationLevel.READ_COMMITTED) {\n await this.client.query(\n `SET TRANSACTION ISOLATION LEVEL ${isolationLevel}`\n );\n }\n }\n\n private async runWithLifecycle<T>(\n fn: (client: pg.ClientBase) => Promise<T>\n ): Promise<T> {\n try {\n return await this.executeWithNesting(fn);\n } catch (e) {\n console.error(`Transaction aborting, error in transaction:`);\n console.error(e);\n this.markAsAborted(e as Error);\n throw e;\n } finally {\n await this.finalizeIfRoot();\n }\n }\n\n private async executeWithNesting<T>(\n fn: (client: pg.ClientBase) => Promise<T>\n ): Promise<T> {\n this.nestingDepth++;\n try {\n return await fn(this.client);\n } finally {\n this.nestingDepth--;\n }\n }\n\n private markAsAborted(error: Error): void {\n this.abortError = error;\n }\n\n private async finalizeIfRoot(): Promise<void> {\n if (this.nestingDepth === 0) {\n await (this.isAborted() ? this.rollback() : this.commit());\n }\n }\n\n private resolveExecutor(\n propagation: Propagation\n ): PostgresTransaction | Savepoint {\n if (this.nestingDepth === 0) {\n return this;\n }\n\n return propagation === Propagation.NESTED\n ? this.createSavepoint()\n : (this.findActiveSavepoint() ?? this);\n }\n\n private createSavepoint(): Savepoint {\n const savepoint = new Savepoint(\n `sp_${this.savepoints.length + 1}`,\n this.client,\n () => this.removeSavepoint()\n );\n this.savepoints.push(savepoint);\n return savepoint;\n }\n\n private findActiveSavepoint(): Savepoint | undefined {\n for (let i = this.savepoints.length - 1; i >= 0; i--) {\n if (!this.savepoints[i].isClosed()) {\n return this.savepoints[i];\n }\n }\n }\n\n private removeSavepoint(): void {\n this.savepoints.pop();\n }\n\n private async commit(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n await this.client.query(\"COMMIT\");\n await this.clientCleanUp?.(this.client);\n }\n\n private async rollback(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n try {\n await this.client.query(\"ROLLBACK\");\n } catch (e) {\n if (\n e instanceof Error &&\n e.message.includes(\"Client was closed and is not queryable\")\n ) {\n return;\n }\n throw e;\n }\n\n await this.clientCleanUp?.(this.client);\n }\n\n private isAborted(): boolean {\n return this.abortError !== undefined && !this.closed;\n }\n}\n\nclass Savepoint {\n private initialized = false;\n private closed = false;\n private abortError?: Error;\n\n private nestingDepth = 0;\n\n constructor(\n private readonly name: string,\n private readonly client: pg.ClientBase,\n private readonly onClose: () => void\n ) {}\n\n public async execute<T>(\n fn: (client: pg.ClientBase) => Promise<T>\n ): Promise<T> {\n await this.ensureStarted();\n return this.runWithLifecycle(fn);\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n private async ensureStarted(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.initialized = true;\n await this.client.query(`SAVEPOINT ${this.name}`);\n }\n\n private async runWithLifecycle<T>(\n fn: (client: pg.ClientBase) => Promise<T>\n ): Promise<T> {\n this.nestingDepth++;\n try {\n return await fn(this.client);\n } catch (e) {\n this.markAsAborted(e as Error);\n throw e;\n } finally {\n this.nestingDepth--;\n await this.finalizeIfRoot();\n }\n }\n\n private markAsAborted(error: Error): void {\n this.abortError = error;\n }\n\n private async finalizeIfRoot(): Promise<void> {\n if (this.nestingDepth === 0) {\n await (this.isAborted() ? this.rollback() : this.commit());\n }\n }\n\n private async commit(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n await this.client.query(`RELEASE SAVEPOINT ${this.name}`);\n this.onClose();\n }\n\n private async rollback(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n await this.client.query(`ROLLBACK TO SAVEPOINT ${this.name}`);\n this.onClose();\n }\n\n private isAborted(): boolean {\n return this.abortError !== undefined && !this.closed;\n }\n}\n\nexport function createPostgresUnitOfWork(pool: pg.Pool): PostgresUnitOfWork;\nexport function createPostgresUnitOfWork(\n config: PostgresConfig | string\n): PostgresUnitOfWork;\nexport function createPostgresUnitOfWork(\n source: pg.Pool | PostgresConfig | string\n): PostgresUnitOfWork {\n if (source instanceof pg.Pool) {\n return new DefaultPostgresUnitOfWork(\n async () => source.connect(),\n (client) => (client as pg.PoolClient).release()\n );\n }\n\n const connectionString =\n source instanceof PostgresConfig ? source.toString() : source;\n\n return new DefaultPostgresUnitOfWork(\n () => new pg.Client({ connectionString }),\n (client) => (client as pg.Client).end()\n );\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as pg from \"pg\";\nimport runner from \"node-pg-migrate\";\nimport { PostgresConfig } from \"@/config\";\n\n/**\n * Extracts numeric prefix from migration filename for proper sorting.\n * Handles both simple numeric prefixes (1_initial) and timestamps (1734567890123_initial).\n */\nfunction extractNumericPrefix(filename: string): number {\n const match = filename.match(/^(\\d+)/);\n return match ? parseInt(match[1], 10) : 0;\n}\n\nexport interface MigrationOptions {\n url: PostgresConfig | string;\n dir: string;\n namespace?: string;\n direction?: \"up\" | \"down\";\n count?: number;\n dryRun?: boolean;\n}\n\n/**\n * Ensures backward compatibility with existing tables that have 'applied_at' column\n * by renaming it to 'run_on' (node-pg-migrate's expected column name)\n */\nasync function ensureTableCompatibility(\n client: pg.Client,\n tableName: string\n): Promise<void> {\n // Check if table exists\n const tableExists = await client.query(\n `\n SELECT 1 FROM information_schema.tables\n WHERE table_name = $1\n `,\n [tableName]\n );\n\n if (tableExists.rows.length === 0) return;\n\n // Check if applied_at column exists (old schema)\n const hasAppliedAt = await client.query(\n `\n SELECT 1 FROM information_schema.columns\n WHERE table_name = $1 AND column_name = 'applied_at'\n `,\n [tableName]\n );\n\n if (hasAppliedAt.rows.length > 0) {\n await client.query(`\n ALTER TABLE \"${tableName}\"\n RENAME COLUMN applied_at TO run_on\n `);\n console.log(`Migrated table ${tableName}: applied_at → run_on`);\n }\n}\n\n/**\n * Detects whether the migrations directory contains SQL-based migrations\n * (directories with migration.sql files) or JavaScript-based migrations.\n */\nasync function isSqlMigrationFormat(dir: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const sqlPath = path.join(dir, entry.name, \"migration.sql\");\n try {\n await fs.access(sqlPath);\n return true;\n } catch {\n // Not a SQL migration directory\n }\n }\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Runs SQL-based migrations (directories with migration.sql files)\n */\nasync function runSqlMigrations(\n client: pg.Client,\n dir: string,\n migrationsTable: string,\n dryRun: boolean\n): Promise<void> {\n // Ensure migrations table exists\n await client.query(`\n CREATE TABLE IF NOT EXISTS \"${migrationsTable}\" (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n run_on TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n\n // Get applied migrations\n const appliedResult = await client.query(\n `SELECT name FROM \"${migrationsTable}\" ORDER BY run_on ASC`\n );\n const appliedMigrations = new Set(appliedResult.rows.map((r) => r.name));\n\n // Get migration directories\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const migrationDirs = entries\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort((a, b) => extractNumericPrefix(a) - extractNumericPrefix(b));\n\n // Find migrations to apply\n const migrationsToApply: { name: string; sql: string }[] = [];\n for (const migrationDir of migrationDirs) {\n if (appliedMigrations.has(migrationDir)) {\n continue;\n }\n\n const sqlPath = path.join(dir, migrationDir, \"migration.sql\");\n try {\n const sql = await fs.readFile(sqlPath, \"utf-8\");\n migrationsToApply.push({ name: migrationDir, sql });\n } catch {\n // Skip directories without migration.sql\n }\n }\n\n if (migrationsToApply.length === 0) {\n console.log(\"No migrations to run!\");\n return;\n }\n\n console.log(`> Migrating files:`);\n for (const migration of migrationsToApply) {\n console.log(`> - ${migration.name}`);\n }\n\n if (dryRun) {\n console.log(\"Dry run - no migrations applied\");\n return;\n }\n\n // Apply migrations\n for (const migration of migrationsToApply) {\n console.log(`### MIGRATION ${migration.name} (UP) ###`);\n await client.query(migration.sql);\n await client.query(\n `INSERT INTO \"${migrationsTable}\" (name) VALUES ($1)`,\n [migration.name]\n );\n }\n}\n\nexport async function runMigrations({\n namespace,\n url,\n dir,\n direction = \"up\",\n count,\n dryRun = false,\n}: MigrationOptions): Promise<void> {\n const migrationsTable = namespace\n ? `hexai__migrations_${namespace}`\n : \"hexai__migrations\";\n\n const client = new pg.Client(url);\n try {\n await client.connect();\n await ensureTableCompatibility(client, migrationsTable);\n\n // Check if this is SQL-based migrations or JavaScript-based\n const isSqlFormat = await isSqlMigrationFormat(dir);\n\n if (isSqlFormat) {\n // Run SQL-based migrations\n await runSqlMigrations(client, dir, migrationsTable, dryRun);\n } else {\n // Run JavaScript-based migrations using node-pg-migrate\n await client.end();\n await runner({\n databaseUrl: url.toString(),\n dir,\n direction,\n count,\n migrationsTable,\n dryRun,\n singleTransaction: true,\n log: (msg: string) => {\n // Filter out timestamp warnings for backward compatibility\n // with migration files using simple numeric prefixes (e.g., 1_initial.js)\n if (!msg.startsWith(\"Can't determine timestamp for\")) {\n console.log(msg);\n }\n },\n });\n return;\n }\n } finally {\n try {\n await client.end();\n } catch {\n // Client already closed\n }\n }\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { runMigrations } from \"@/run-migrations\";\nimport { PostgresConfig } from \"@/config\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst MIGRATIONS_DIR = path.join(__dirname, \"../migrations\");\n\nexport async function runHexaiMigrations(dbUrl: string | PostgresConfig) {\n await runMigrations({\n dir: MIGRATIONS_DIR,\n url: dbUrl,\n namespace: \"hexai\",\n });\n}\n","import { Client, PoolClient } from \"pg\";\nimport {\n Message,\n EventStore,\n EventStoreFetchResult,\n StoredEvent,\n} from \"@hexaijs/core\";\n\ntype PgClient = Client | PoolClient;\n\nconst DEFAULT_TABLE_NAME = \"hexai__events\";\nconst COLUMNS_PER_EVENT = 3;\n\nexport interface PostgresEventStoreConfig {\n tableName?: string;\n}\n\ninterface EventRow {\n position: number;\n message_type: string;\n headers: Record<string, unknown>;\n payload: Record<string, unknown>;\n}\n\nexport class PostgresEventStore implements EventStore {\n private readonly tableName: string;\n\n constructor(\n private readonly client: PgClient,\n config: PostgresEventStoreConfig = {}\n ) {\n this.tableName = config.tableName ?? DEFAULT_TABLE_NAME;\n }\n\n async store(event: Message): Promise<StoredEvent> {\n const serialized = event.serialize();\n\n const result = await this.client.query<{ position: number }>(\n `INSERT INTO ${this.tableName} (message_type, headers, payload)\n VALUES ($1, $2, $3)\n RETURNING position`,\n [\n event.getMessageType(),\n JSON.stringify(serialized.headers),\n JSON.stringify(serialized.payload),\n ]\n );\n\n return {\n position: +result.rows[0].position,\n event,\n };\n }\n\n async storeAll(events: Message[]): Promise<StoredEvent[]> {\n if (events.length === 0) {\n return [];\n }\n\n const values: unknown[] = [];\n const placeholders: string[] = [];\n\n events.forEach((event, index) => {\n const serialized = event.serialize();\n const offset = index * COLUMNS_PER_EVENT;\n placeholders.push(\n `($${offset + 1}, $${offset + 2}, $${offset + 3})`\n );\n values.push(\n event.getMessageType(),\n JSON.stringify(serialized.headers),\n JSON.stringify(serialized.payload)\n );\n });\n\n const result = await this.client.query<{ position: number }>(\n `INSERT INTO ${this.tableName} (message_type, headers, payload)\n VALUES ${placeholders.join(\", \")}\n RETURNING position`,\n values\n );\n\n return result.rows.map((row, index) => ({\n position: +row.position,\n event: events[index],\n }));\n }\n\n async fetch(\n afterPosition: number,\n limit?: number\n ): Promise<EventStoreFetchResult> {\n const lastPosition = await this.getLastPosition();\n\n let query = `\n SELECT position, message_type, headers, payload\n FROM ${this.tableName}\n WHERE position > $1\n ORDER BY position ASC\n `;\n const params: unknown[] = [afterPosition];\n\n if (limit !== undefined) {\n query += ` LIMIT $2`;\n params.push(limit);\n }\n\n const result = await this.client.query<EventRow>(query, params);\n\n const events: StoredEvent[] = result.rows.map((row) =>\n this.deserializeRow(row)\n );\n\n return {\n events,\n lastPosition,\n };\n }\n\n async getLastPosition(): Promise<number> {\n const result = await this.client.query<{ max: number | null }>(\n `SELECT MAX(position) as max FROM ${this.tableName}`\n );\n\n return +(result.rows[0].max ?? 0);\n }\n\n private deserializeRow(row: EventRow): StoredEvent {\n const headers = row.headers;\n const payload = row.payload;\n\n const event = Message.from(payload, headers as any);\n\n return {\n position: +row.position,\n event,\n };\n }\n}\n"]}
package/dist/test.d.ts CHANGED
@@ -1,26 +1,27 @@
1
- import { Client } from "pg";
2
- import { QueryableUnitOfWork } from "@hexaijs/core";
3
- import { TableManager } from "./helpers";
4
- import { PostgresConfig } from "./config";
5
- import { PostgresTransactionOptions } from "./types";
6
- export declare function createTestContext(dbUrl: string | PostgresConfig): {
1
+ import { ClientBase, Client } from 'pg';
2
+ import { f as PostgresUnitOfWork, e as PostgresTransactionOptions, P as PostgresConfig, T as TableManager } from './helpers-vPAudN_S.js';
3
+ import '@hexaijs/core';
4
+ import 'ezcfg';
5
+
6
+ declare function createTestContext(dbUrl: string | PostgresConfig): {
7
7
  client: Client;
8
8
  newClient: () => Client;
9
9
  tableManager: TableManager;
10
10
  setup: () => Promise<void>;
11
11
  teardown: () => Promise<void>;
12
12
  };
13
- export declare class PostgresUnitOfWorkForTesting implements QueryableUnitOfWork<Client, PostgresTransactionOptions> {
13
+ declare class PostgresUnitOfWorkForTesting implements PostgresUnitOfWork {
14
14
  private client;
15
15
  private executorStorage;
16
- constructor(client: Client);
17
- getClient(): Client;
18
- query<T>(fn: (client: Client) => Promise<T>): Promise<T>;
19
- wrap<T = unknown>(fn: (client: Client) => Promise<T>, options?: Partial<PostgresTransactionOptions>): Promise<T>;
16
+ constructor(client: ClientBase);
17
+ getClient(): ClientBase;
18
+ withClient<T>(fn: (client: ClientBase) => Promise<T>): Promise<T>;
19
+ wrap<T = unknown>(fn: (client: ClientBase) => Promise<T>, options?: Partial<PostgresTransactionOptions>): Promise<T>;
20
20
  private getCurrentExecutor;
21
21
  private resolveOptions;
22
22
  private resolveExecutor;
23
23
  private createExecutor;
24
24
  private executeInContext;
25
25
  }
26
- //# sourceMappingURL=test.d.ts.map
26
+
27
+ export { PostgresUnitOfWorkForTesting, createTestContext };