@monlite/core 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -7
- package/dist/index.cjs +160 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -6
- package/dist/index.d.ts +40 -6
- package/dist/index.js +159 -29
- package/dist/index.js.map +1 -1
- package/package.json +16 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/id.ts","../src/errors.ts","../src/query/sql.ts","../src/query/where.ts","../src/query/order.ts","../src/query/path.ts","../src/query/select.ts","../src/query/update.ts","../src/aggregation/aggregate.ts","../src/collection.ts","../src/auto-index.ts","../src/db.ts"],"names":["randomBytes","Database"],"mappings":";;;;;;;;;;AAWA,IAAM,cAAA,GAAiBA,mBAAY,CAAC,CAAA;AACpC,IAAI,UAAUA,kBAAA,CAAY,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AAErC,SAAS,QAAA,GAAmB;AACjC,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACzC,EAAA,OAAA,GAAA,CAAW,UAAU,CAAA,IAAK,QAAA;AAE1B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,WAAA,CAAY,EAAE,CAAA;AACjC,EAAA,GAAA,CAAI,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG,CAAC,CAAA;AAC/B,EAAA,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAChC,EAAA,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAE7B,EAAA,OAAO,GAAA,CAAI,SAAS,KAAK,CAAA;AAC3B;AAGO,SAAS,WAAW,KAAA,EAAiC;AAC1D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAClE;;;AC5BO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,YAAA,CAAa;AAAA,EAClD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;;;ACXO,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,CAAA;AAEnE,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,eAAA,CAAgB,IAAI,KAAK,CAAA;AAClC;AAOO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,0BAAA,CAA2B,IAAA,CAAK,GAAG,CAAA,EAAG;AACxC,MAAA,IAAA,IAAQ,GAAA,GAAM,GAAA;AAAA,IAChB,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAC5B,MAAA,IAAA,IAAQ,MAAM,GAAA,GAAM,GAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,IAAA,IAAQ,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,GAAI,GAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,OAAO,MAAM,QAAA,CAAS,KAAK,EAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,GAAI,GAAA;AACrD;AAGO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,IAAI,KAAK,CAAA,CAAA,CAAA;AACvC,EAAA,OAAO,CAAA,mBAAA,EAAsB,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA,CAAA;AACjD;AAOO,SAAS,SAAS,KAAA,EAAsD;AAC7E,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,QAAQ,CAAA,GAAI,CAAA;AACnD,EAAA,IAAI,KAAA,YAAiB,IAAA,EAAM,OAAO,KAAA,CAAM,WAAA,EAAY;AACpD,EAAA,IACE,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,QAAA,EACjB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAEnC,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;;;AC/CO,SAAS,UAAA,CACd,OACA,GAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AACnB,EAAA,OAAO,eAAA,CAAgB,KAAA,EAAO,GAAG,CAAA,IAAK,GAAA;AACxC;AAEA,SAAS,QAAW,CAAA,EAAiB;AACnC,EAAA,OAAO,MAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAClC;AAEA,SAAS,eAAA,CAAgB,OAAmB,GAAA,EAA2B;AACrE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,KAAA,GAAS,MAAc,GAAG,CAAA;AAChC,IAAA,IAAI,UAAU,MAAA,EAAW;AAEzB,IAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,IAAA,EAAM;AACjC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAK,CAAA,CACvB,GAAA,CAAI,CAAC,CAAA,KAAkB,eAAA,CAAgB,CAAA,EAAG,GAAG,CAAC,CAAA,CAC9C,OAAO,OAAO,CAAA;AACjB,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,MAAM,IAAA,GAAO,GAAA,KAAQ,KAAA,GAAQ,OAAA,GAAU,MAAA;AACvC,QAAA,KAAA,CAAM,KAAK,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,IAAI,IAAI,GAAG,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAK,CAAA,CACvB,GAAA,CAAI,CAAC,CAAA,KAAkB,eAAA,CAAgB,CAAA,EAAG,GAAG,CAAC,CAAA,CAC9C,OAAO,OAAO,CAAA;AACjB,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,GAAG,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAC7C,MAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAC3B;AAEA,SAAS,eAAe,CAAA,EAA0B;AAChD,EAAA,OACE,CAAA,KAAM,QACN,OAAO,CAAA,KAAM,YACb,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAChB,EAAE,aAAa,IAAA,CAAA,IACf,CAAC,OAAO,QAAA,CAAS,CAAC,MACjB,CAAA,CAAE,WAAA,KAAgB,MAAA,IAAU,CAAA,CAAE,WAAA,KAAgB,MAAA,CAAA;AAEnD;AAEA,SAAS,cAAA,CAAe,KAAA,EAAe,SAAA,EAAgB,GAAA,EAA2B;AAChF,EAAA,IAAI,GAAA,CAAI,UAAU,CAAC,UAAA,CAAW,KAAK,CAAA,EAAG,GAAA,CAAI,OAAO,KAAK,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,UAAU,KAAK,CAAA;AAG5B,EAAA,IAAI,CAAC,cAAA,CAAe,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAA,CAAO,IAAA,EAAM,SAAA,EAAW,GAAG,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,MAAA,GAAS,SAAA;AACf,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACpC,IAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,IAAA,IAAI,MAAM,MAAA,EAAW;AAErB,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACjC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAClC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AACnC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AACnC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAA,CAAQ,KAAK,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,KAAK,CAAC,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AACvC,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,OAAA,CAAQ,KAAK,YAAA,CAAa,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,QAAA,CAAU,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAA,CAAQ,KAAK,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,KAAK,UAAA,CAAW,KAAA,EAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,QAAA;AAAA,MACF;AACE,QAAA,MAAM,IAAI,iBAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,EAAE,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA;AAAA,SACnD;AAAA;AACJ,EACF;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,EAAA;AAC5B,EAAA,OAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,OAAA,CAAQ,CAAC,IAAK,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAC5E;AAEA,SAAS,MAAA,CAAO,IAAA,EAAc,CAAA,EAAQ,GAAA,EAA2B;AAC/D,EAAA,IAAI,CAAA,KAAM,IAAA,EAAM,OAAO,CAAA,EAAG,IAAI,CAAA,QAAA,CAAA;AAC9B,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,EAAA,OAAO,GAAG,IAAI,CAAA,IAAA,CAAA;AAChB;AAEA,SAAS,OAAA,CAAQ,IAAA,EAAc,CAAA,EAAQ,GAAA,EAA2B;AAEhE,EAAA,IAAI,CAAA,KAAM,IAAA,EAAM,OAAO,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA;AAC9B,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,EAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,YAAA,EAAe,IAAI,CAAA,MAAA,CAAA;AACpC;AAEA,SAAS,GAAA,CAAI,IAAA,EAAc,EAAA,EAAY,CAAA,EAAQ,GAAA,EAA2B;AACxE,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,EAAA,CAAA;AACtB;AAEA,SAAS,MAAA,CACP,IAAA,EACA,GAAA,EACA,GAAA,EACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,CAAA,EAAG,MAAA,GAAS,OAAA,GAAU,IAAI,CAAA,iBAAA;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,SAAS,GAAA,GAAM,GAAA;AAC5C,EAAA,MAAM,YAAA,GAAe,GAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACZ,EAAA,OAAO,MAAA,GACH,CAAA,CAAA,EAAI,IAAI,CAAA,YAAA,EAAe,IAAI,CAAA,SAAA,EAAY,YAAY,CAAA,EAAA,CAAA,GACnD,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,CAAA;AACjC;AAOA,SAAS,YAAA,CACP,KAAA,EACA,IAAA,EACA,CAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,IAAA,OAAO,SAAS,IAAI,CAAA,QAAA,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,EAAA,OACE,CAAA,2BAAA,EAA8B,IAAI,CAAA,uDAAA,EACY,IAAI,iCACpC,IAAI,CAAA,aAAA,CAAA;AAEtB;AAEA,SAAS,OAAA,CACP,KAAA,EACA,IAAA,EACA,CAAA,EACA,GAAA,EACQ;AACR,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3B,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,GAAG,IAAI,CAAA,IAAA,CAAA;AACrC,EAAA,OAAO,CAAA,sCAAA,EAAyC,WAAA,CAAY,KAAK,CAAC,CAAA,kBAAA,CAAA;AACpE;AAEA,SAAS,UAAA,CAAW,KAAA,EAAe,IAAA,EAAc,IAAA,EAAuB;AACtE,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA,GAAiB,GAAG,IAAI,CAAA,QAAA,CAAA;AAAA,EAC/C;AACA,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,EAAA,OAAO,IAAA,GACH,CAAA,gBAAA,EAAmB,IAAI,CAAA,aAAA,CAAA,GACvB,mBAAmB,IAAI,CAAA,SAAA,CAAA;AAC7B;;;ACrNO,SAAS,YAAA,CACd,SACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AAErB,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AACxD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,GAAA,GAAO,IAAY,KAAK,CAAA;AAC9B,MAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,MAAA,IAAI,UAAU,CAAC,UAAA,CAAW,KAAK,CAAA,SAAU,KAAK,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAA,CAAO,GAAG,EAAE,WAAA,EAAY,KAAM,SAAS,MAAA,GAAS,KAAA;AAC1D,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AACzD;;;ACtBO,SAAS,OAAA,CAAQ,KAAU,IAAA,EAAmB;AACnD,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AACjC,IAAA,IAAI,GAAA,IAAO,MAAM,OAAO,MAAA;AACxB,IAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,OAAA,CAAQ,GAAA,EAAU,IAAA,EAAc,KAAA,EAAkB;AAChE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,IAAQ,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,QAAA,EAAU,GAAA,CAAI,GAAG,CAAA,GAAI,EAAC;AAClE,IAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AAAA,EACf;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAE,CAAA,GAAI,KAAA;AAChC;AAEO,SAAS,SAAA,CAAU,KAAU,IAAA,EAAoB;AACtD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,IAAQ,OAAO,GAAA,CAAI,GAAG,MAAM,QAAA,EAAU;AACtD,IAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAE,CAAA;AACnC;;;ACxBO,SAAS,OAAA,CACd,KACA,MAAA,EACqB;AACrB,EAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAO,CAAC,CAAA,KAAO,MAAA,CAAe,CAAC,CAAC,CAAA;AACjE,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,GAAA;AAEzB,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC9B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,GAAA;AACT;;;ACjBA,IAAM,UAAA,uBAAiB,GAAA,CAAI,CAAC,QAAQ,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAGhE,SAAS,kBAAkB,IAAA,EAAoB;AACpD,EAAA,OACE,IAAA,IAAQ,IAAA,IACR,OAAO,IAAA,KAAS,YAChB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AAEnD;AAEA,SAAS,SAAA,CAAU,GAAQ,CAAA,EAAiB;AAC1C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,OAAO,KAAK,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAC/C;AAOO,SAAS,WAAA,CACd,KACA,IAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,gBAAgB,GAAG,CAAA;AAEhC,EAAA,IAAI,CAAC,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC5B,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,iDAAiD,GAAG,CAAA,2DAAA;AAAA,OAEtD;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA;AAEZ,EAAA,IAAI,IAAI,IAAA,EAAM;AACZ,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,IAAI,IAAA,EAAM;AACZ,IAAA,KAAA,MAAW,CAAC,MAAM,EAAE,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACjD,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAA,EAAM,OAAO,OAAO,GAAA,KAAQ,WAAW,GAAA,GAAM,CAAA,IAAK,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IACtE;AAAA,EACF;AACA,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACrD,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,CAAI,KAAA,KAAU,EAAC;AAEhD,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,OAAA,CAAS,KAAA,CAAc,KAAK,CAAA,EAAG;AAC7E,QAAA,GAAA,CAAI,IAAA,CAAK,GAAI,KAAA,CAAc,KAAK,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MAChB;AACA,MAAA,OAAA,CAAQ,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACrD,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAC9B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,OAAA;AAAA,UACE,IAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA,CAAI,OAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,CAAA,EAAG,KAAK,CAAC;AAAA,SACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,IAAI,MAAA,EAAQ;AACd,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,IAAA;AACT;;;ACxEA,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAGpD,IAAM,MAAA,GAAsC;AAAA,EAC1C,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AASA,SAAS,iBAAA,CACP,MACA,MAAA,EACuC;AACvC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,MAAM,SAAA,GAAY,KAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,MAAA,IAAI,CAAC,SAAA,CAAU,KAAK,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,KAAK,CAAA;AACZ,MAAA,MAAM,QAAQ,CAAA,IAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAC,IAAI,CAAA,EAAG,CAAA,CAAA;AACzC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAK,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AAEO,SAAS,SAAA,CACd,KACA,IAAA,EACiB;AACjB,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,CAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA;AACnE,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,KAAS,iBAAA,CAAkB,IAAA,EAAM,IAAI,MAAM,CAAA;AAG5D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,qBAAA,CAAA,EAAyB,GAAG,OAAO,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,OAAA,EAAU,GAAA,CAAI,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA;AAC9E,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ,GAAG,EAAE,GAAA,CAAI,GAAG,MAAM,CAAA,IAAK,EAAC;AAEpD,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,IAAI,SAAA,IAAa,CAAA;AAClD,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,GAAA,CAAI,IAAI,MAAM,EAAC;AACtC,IAAA,MAAA,CAAO,IAAI,KAAK,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,OAAA,CACd,KACA,IAAA,EACiB;AACjB,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA,CAAK,EAAA,CAAG,MAAA,KAAW,CAAA,EAAG;AACnD,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,CAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA;AAEnE,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,EAAA,EAAI;AAC3B,IAAA,GAAA,CAAI,OAAO,KAAK,CAAA;AAChB,IAAA,MAAM,IAAA,GAAO,UAAU,KAAK,CAAA;AAC5B,IAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACpB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC;AAEA,EAAA,OAAA,CAAQ,KAAK,CAAA,qBAAA,CAAuB,CAAA;AACpC,EAAA,MAAM,EAAE,SAAS,UAAA,EAAY,IAAA,KAAS,iBAAA,CAAkB,IAAA,EAAM,IAAI,MAAM,CAAA;AACxE,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAE1B,EAAA,IAAI,GAAA,GACF,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,OAAA,EAAU,GAAA,CAAI,KAAK,WAAW,KAAK,CAAA,UAAA,EACnD,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAEnC,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3C,MAAA,MAAM,GAAA,GACJ,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,WAAA,EAAY,KAAM,MAAA,GAAS,MAAA,GAAS,KAAA;AAChE,MAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,GAAG,CAAA,CAAE,CAAA;AAAA,WAC9C,KAAA,CAAM,KAAK,CAAA,EAAG,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,MAAM,MAAA,EAAQ,GAAA,IAAO,aAAa,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,IAAA,GAAA,IAAO,UAAA;AACP,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACvB;AACA,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,IAAA,GAAA,IAAA,CAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,GAAO,EAAA,GAAK,WAAA,IAAe,WAAA;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACvB;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAE9C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,IAAA,MAAM,MAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,EAAA,MAAQ,KAAK,CAAA,GAAI,IAAI,KAAK,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,SAAA;AAClC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,CAAC,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,KAAM,EAAC,EAAG,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA;AAAA,IACxD;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;;;ACvGA,IAAM,WAAA,GAAc,CAAA,iCAAA,CAAA;AAEpB,SAAS,YAAY,GAAA,EAA+C;AAClE,EAAA,MAAM,EAAE,GAAA,EAAK,UAAA,EAAY,UAAA,EAAY,GAAG,MAAK,GAAI,GAAA;AACjD,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,aAAN,MAA0B;AAAA,EAK/B,WAAA,CACmB,KACR,IAAA,EACT;AAFiB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACR,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EACR;AAAA,EAFgB,GAAA;AAAA,EACR,IAAA;AAAA,EANH,WAAA,GAAc,KAAA;AAAA,EACL,SAAA,GAAY,CAAC,IAAA,KAC5B,IAAA,CAAK,IAAI,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAO5C,IAAY,EAAA,GAAK;AACf,IAAA,OAAO,KAAK,GAAA,CAAI,MAAA;AAAA,EAClB;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa;AACtB,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,MACN,CAAA,4BAAA,EAA+B,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA;AAAA,KAM1C;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEQ,SAAS,GAAA,EAAqB;AACpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAM,GAAA,CAAI,GAAA;AACd,IAAA,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA;AACrB,IAAA,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA;AACrB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,cAAc,KAAA,EAAiC;AACrD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,IAAO,IAAA,GAAO,OAAO,KAAA,CAAM,GAAG,IAAI,QAAA,EAAS;AAC5D,IAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,MACxB,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,OAAO,IAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA,aAAA,EAAgB,KAAK,IAAI,CAAA,yDAAA;AAAA,KAC3B,CACC,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,IAAA,EAAM,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,UAAU,CAAA;AACxD,IAAA,OAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,IAAA,EAAqD;AACpE,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA;AAAA,MACnB,CAAA,aAAA,EAAgB,KAAK,IAAI,CAAA,yDAAA;AAAA,KAC3B;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,CAAC,KAAA,KAAiC;AACtE,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACnC,QAAA,IAAA,CAAK,GAAA,CAAI,IAAI,GAAA,EAAK,GAAA,CAAI,MAAM,GAAA,CAAI,UAAA,EAAY,IAAI,UAAU,CAAA;AAAA,MAC5D;AAAA,IACF,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AACnB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO;AAAA,EACnC;AAAA;AAAA,EAIA,MAAM,QAAA,CAAS,IAAA,GAAwB,EAAC,EAAyB;AAC/D,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,CAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,CAAA;AACvE,IAAA,IAAI,MAAM,CAAA,OAAA,EAAU,WAAW,UAAU,IAAA,CAAK,IAAI,WAAW,KAAK,CAAA,CAAA;AAElE,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,KAAK,SAAS,CAAA;AACvD,IAAA,IAAI,KAAA,SAAc,GAAA,GAAM,KAAA;AAExB,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,GAAA,IAAO,UAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,GAAA,IAAA,CAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,GAAO,EAAA,GAAK,WAAA,IAAe,WAAA;AAChD,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,KAAK,MAAM;AAAA,KAC9C;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,GAAyB,EAAC,EAA8B;AACtE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,CAAA;AACrD,IAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,SAAS,EAAA,EAAuC;AACpD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CACd,OAAA,CAAQ,CAAA,OAAA,EAAU,WAAW,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,eAAA,CAAiB,CAAA,CACjE,GAAA,CAAI,EAAE,CAAA;AACT,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA;AAAA,EACpC;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,GAAqB,EAAC,EAAoB;AACpD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,CAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CACd,OAAA,CAAQ,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAAA,CACjE,GAAA,CAAI,GAAG,MAAM,CAAA;AAChB,IAAA,OAAO,GAAA,CAAI,CAAA;AAAA,EACb;AAAA;AAAA,EAIQ,SAAA,CACN,KAAA,EACA,IAAA,EACA,MAAA,EACa;AACb,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,MAAM,MAAA,GAAS,WAAW,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA;AACnE,IAAA,IAAI,YAAY,CAAA,OAAA,EAAU,WAAW,UAAU,IAAA,CAAK,IAAI,WAAW,MAAM,CAAA,CAAA;AACzE,IAAA,IAAI,QAAQ,SAAA,IAAa,UAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA,CAAQ,SAAS,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAC;AAE1B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA;AAAA,MACnB,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,4CAAA;AAAA,KACtB;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,MAAM;AACpC,MAAA,MAAM,MAAmB,EAAC;AAC1B,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACnC,QAAA,MAAM,OAAA,GAAU,WAAA,CAAY,WAAA,CAAY,OAAA,EAAS,IAAI,CAAC,CAAA;AACtD,QAAA,IAAA,CAAK,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG,GAAA,EAAK,IAAI,GAAG,CAAA;AAC9C,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,GAAG,OAAA;AAAA,UACH,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,UAAA,EAAY;AAAA,SACA,CAAA;AAAA,MAChB;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,GAAA,EAAI;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgD;AAC3D,IAAA,OAAO,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,EAAO,KAAK,IAAA,EAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,WAAW,IAAA,EAAiD;AAChE,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA,CAAE,MAAA,EAAO;AAAA,EACtE;AAAA,EAEA,MAAM,OAAO,IAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO;AAAA,QAChC,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,CAAS,GAAA,EAAI;AAAA,QAC3B,MAAM,IAAA,CAAK;AAAA,OACZ,CAAA;AACD,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,IAAA,EAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA,EAIQ,SAAA,CACN,OACA,MAAA,EACa;AACb,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,MAAM,MAAA,GAAS,WAAW,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA;AACnE,IAAA,IAAI,YAAY,CAAA,OAAA,EAAU,WAAW,UAAU,IAAA,CAAK,IAAI,WAAW,MAAM,CAAA,CAAA;AACzE,IAAA,IAAI,QAAQ,SAAA,IAAa,UAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA,CAAQ,SAAS,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAC;AAE1B,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,aAAA,EAAgB,IAAA,CAAK,IAAI,CAAA,eAAA,CAAiB,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,MAAM;AACpC,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,IAC1C,CAAC,CAAA;AACD,IAAA,GAAA,EAAI;AAEJ,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgD;AAC3D,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,CAAK,OAAO,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,GAAsB,EAAE,KAAA,EAAO,QAAiB,EAE9D;AACD,IAAA,OAAO,EAAE,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,KAAA,EAAO,KAAK,EAAE,MAAA,EAAO;AAAA,EAC3D;AAAA;AAAA,EAIA,MAAM,SAAA,CAAU,IAAA,GAAyB,EAAC,EAA6B;AACrE,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,SAAA;AAAA,MACL,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAU;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAA,EAAgD;AAC5D,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,OAAA;AAAA,MACL,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAU;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AACF;;;ACjRO,IAAM,cAAN,MAAkB;AAAA,EAIvB,WAAA,CACmB,EAAA,EACA,OAAA,EACA,SAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAChB;AAAA,EAHgB,EAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EANX,MAAA,uBAAa,GAAA,EAAoB;AAAA,EACjC,OAAA,uBAAc,GAAA,EAAY;AAAA,EAQlC,KAAA,CAAM,YAAoB,IAAA,EAAoB;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAU,CAAA,EAAA,EAAI,IAAI,CAAA,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAE3B,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAEzB,IAAA,IAAI,IAAA,IAAQ,KAAK,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,IAAI,CAAA;AAC5B,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,YAAoB,IAAA,EAAoB;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,CAAA,mBAAA,EAAsB,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA,CAAA;AACpD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,QACN,CAAA,4BAAA,EAA+B,SAAS,CAAA,MAAA,EAAS,UAAU,KAAK,IAAI,CAAA,CAAA;AAAA,OACtE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAA,EAA2B;AAC/B,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,GAAG,UAAU,CAAA,EAAA,CAAA;AAC5B,IAAA,KAAA,MAAW,KAAK,CAAC,GAAG,KAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG;AACvC,MAAA,IAAI,EAAE,UAAA,CAAW,MAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,KAAA,MAAW,KAAK,CAAC,GAAG,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG;AACxC,MAAA,IAAI,EAAE,UAAA,CAAW,MAAM,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,IACjD;AAAA,EACF;AACF,CAAA;;;ACpDA,SAAS,aAAa,IAAA,EAAoB;AACxC,EAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,4BAA4B,IAAI,CAAA,iGAAA;AAAA,KAElC;AAAA,EACF;AACF;AAEA,SAAS,WAAA,CACP,SACA,MAAA,EACgC;AAChC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AAC3B,IAAA,GAAA,IAAO,IAAA;AACP,IAAA,IAAI,CAAA,GAAI,OAAO,MAAA,EAAQ;AACrB,MAAA,GAAA,IAAO,GAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IACjC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AACvB;AAMO,IAAM,UAAN,MAAc;AAAA;AAAA,EAEV,MAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EAEQ,WAAA,uBAAkB,GAAA,EAA6B;AAAA,EACxD,MAAA,GAAS,KAAA;AAAA,EAEjB,WAAA,CAAY,QAAA,EAAkB,OAAA,GAA0B,EAAC,EAAG;AAC1D,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,yBAAA,CAAS,QAAA,EAAU;AAAA,MACnC,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,MAC9B,GAAI,OAAA,GAAU,EAAE,OAAA,EAAS,CAAC,GAAA,KAAkB,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,EAAE,GAAI;AAAC,KACvE,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,KAAa,OAAA,CAAQ,OAAO,IAAA,CAAA,EAAO;AAC9C,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,oBAAoB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,cAAc,IAAI,WAAA;AAAA,MACrB,IAAA,CAAK,MAAA;AAAA,MACL,QAAQ,SAAA,IAAa,IAAA;AAAA,MACrB,QAAQ,cAAA,IAAkB;AAAA,KAC5B;AAAA,EACF;AAAA;AAAA,EAGA,WAAoB,IAAA,EAA6B;AAC/C,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,IAAI,UAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AAClC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAA,CAAmB,YAAkC,MAAA,EAA6B;AAChF,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,WAAA,CAAY,SAAS,MAAM,CAAA;AACnD,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAQ,CAAA;AAAA,EACvE;AAAA;AAAA,EAGA,eAAA,CAAyB,QAAgB,MAAA,EAA6B;AACpE,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,MACb,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,IAAI,GAAG,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAC;AAAA,KACtD;AAAA,EACF;AAAA;AAAA,EAGA,WAAA,CAAY,YAAkC,MAAA,EAAgC;AAC5E,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,WAAA,CAAY,SAAS,MAAM,CAAA;AACnD,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA,CAAE,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,iBAAA,CAAkB,QAAgB,MAAA,EAAgC;AAChE,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,MACb,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE;AAAA,KACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAgB,EAAA,EAAiC;AACrD,IAAA,IAAA,CAAK,UAAA,EAAW;AAGhB,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,YAAY,MAAM,EAAA,CAAG,IAAI,CAAC,CAAA;AAClD,IAAA,OAAO,GAAA,EAAI;AAAA,EACb;AAAA;AAAA,EAGA,YAAA,GAAkC;AAChC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CACf,OAAA;AAAA,MACC,CAAA;AAAA;AAAA,sBAAA;AAAA,MAID,GAAA,EAAI;AACP,IAAA,OAAO,OAAA,CAAQ,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,IAAA,EAA6B;AACjC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAA,CAAG,CAAA;AACjD,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,IAAI,CAAA;AAC3B,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,QAAA,GAA0B;AAC9B,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,IAAA,CAAK,YAAA,IAAgB,MAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACrE;AAAA;AAAA,EAGA,WAAA,GAA6B;AAC3B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,IACpB;AACA,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,aAAa,+BAA+B,CAAA;AAAA,EACzE;AACF;AAMO,SAAS,QAAA,CAAS,UAAkB,OAAA,EAAmC;AAC5E,EAAA,OAAO,IAAI,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AACtC","file":"index.cjs","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\n/**\n * Generates MongoDB ObjectId-compatible identifiers: a 24-character hex string\n * built from a 4-byte timestamp, 5 random bytes (stable per process) and a\n * 3-byte incrementing counter.\n *\n * Because the timestamp is the high-order component, ids sort in roughly\n * insertion order — which keeps the SQLite primary-key index well-localized.\n */\n\nconst PROCESS_UNIQUE = randomBytes(5);\nlet counter = randomBytes(3).readUIntBE(0, 3);\n\nexport function objectId(): string {\n const time = Math.floor(Date.now() / 1000);\n counter = (counter + 1) % 0x1000000; // wrap at 2^24\n\n const buf = Buffer.allocUnsafe(12);\n buf.writeUInt32BE(time >>> 0, 0);\n PROCESS_UNIQUE.copy(buf, 4, 0, 5);\n buf.writeUIntBE(counter, 9, 3);\n\n return buf.toString(\"hex\");\n}\n\n/** True when a value looks like a monlite/ObjectId id (24 hex chars). */\nexport function isObjectId(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{24}$/i.test(value);\n}\n","/** Base error for all monlite-originated failures. */\nexport class MonliteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MonliteError\";\n }\n}\n\n/** Thrown when a query/update payload is malformed. */\nexport class MonliteQueryError extends MonliteError {\n constructor(message: string) {\n super(message);\n this.name = \"MonliteQueryError\";\n }\n}\n","/** Shared helpers for translating document paths and values into SQLite. */\n\n/** System columns stored outside the JSON `data` blob. */\nexport const RESERVED_FIELDS = new Set([\"_id\", \"created_at\", \"updated_at\"]);\n\nexport function isReserved(field: string): boolean {\n return RESERVED_FIELDS.has(field);\n}\n\n/**\n * Convert a dotted document path (`address.city`, `items.0.name`) into a\n * SQLite JSON path (`$.address.city`, `$.items[0].name`), quoting segments\n * that are not bare identifiers.\n */\nexport function jsonPath(field: string): string {\n let path = \"$\";\n for (const seg of field.split(\".\")) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(seg)) {\n path += \".\" + seg;\n } else if (/^\\d+$/.test(seg)) {\n path += \"[\" + seg + \"]\";\n } else {\n path += '.\"' + seg.replace(/\"/g, '\"\"') + '\"';\n }\n }\n return path;\n}\n\n/** A JSON path wrapped as a single-quoted SQL string literal. */\nexport function pathLiteral(field: string): string {\n return \"'\" + jsonPath(field).replace(/'/g, \"''\") + \"'\";\n}\n\n/** SQL expression yielding the value of `field` for a row. */\nexport function fieldExpr(field: string): string {\n if (isReserved(field)) return `\"${field}\"`;\n return `json_extract(data, ${pathLiteral(field)})`;\n}\n\n/**\n * Normalize a JS value into something better-sqlite3 can bind.\n * better-sqlite3 only accepts numbers, bigints, strings, Buffers and null —\n * so booleans, Dates, undefined and objects are converted here.\n */\nexport function bindable(value: any): number | bigint | string | Buffer | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.toISOString();\n if (\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n ) {\n return value;\n }\n if (Buffer.isBuffer(value)) return value;\n // Arrays / nested objects: compare against SQLite's minified JSON text.\n return JSON.stringify(value);\n}\n","import type { WhereInput, FieldFilter } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { fieldExpr, pathLiteral, bindable, isReserved } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\n /** Called with every document path referenced (for auto-index tracking). */\n onPath?: (path: string) => void;\n}\n\n/** Build a SQL boolean expression from a where clause. Returns `1` when empty. */\nexport function buildWhere(\n where: WhereInput | undefined,\n ctx: WhereContext,\n): string {\n if (!where) return \"1\";\n return translateObject(where, ctx) || \"1\";\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nfunction translateObject(where: WhereInput, ctx: WhereContext): string {\n const parts: string[] = [];\n\n for (const key of Object.keys(where)) {\n const value = (where as any)[key];\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) {\n const join = key === \"AND\" ? \" AND \" : \" OR \";\n parts.push(\"(\" + subs.join(join) + \")\");\n }\n } else if (key === \"NOT\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) parts.push(\"NOT (\" + subs.join(\" AND \") + \")\");\n } else {\n const clause = translateField(key, value, ctx);\n if (clause) parts.push(clause);\n }\n }\n\n return parts.join(\" AND \");\n}\n\nfunction isFilterObject(v: any): v is FieldFilter {\n return (\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v) &&\n (v.constructor === Object || v.constructor === undefined)\n );\n}\n\nfunction translateField(field: string, condition: any, ctx: WhereContext): string {\n if (ctx.onPath && !isReserved(field)) ctx.onPath(field);\n const expr = fieldExpr(field);\n\n // Scalar (or array/Date) value is shorthand for `{ equals: value }`.\n if (!isFilterObject(condition)) {\n return eqExpr(expr, condition, ctx);\n }\n\n const filter = condition as Record<string, any>;\n const clauses: string[] = [];\n for (const op of Object.keys(filter)) {\n const v = filter[op];\n if (v === undefined) continue;\n\n switch (op) {\n case \"equals\":\n clauses.push(eqExpr(expr, v, ctx));\n break;\n case \"not\":\n clauses.push(notExpr(expr, v, ctx));\n break;\n case \"gt\":\n clauses.push(cmp(expr, \">\", v, ctx));\n break;\n case \"gte\":\n clauses.push(cmp(expr, \">=\", v, ctx));\n break;\n case \"lt\":\n clauses.push(cmp(expr, \"<\", v, ctx));\n break;\n case \"lte\":\n clauses.push(cmp(expr, \"<=\", v, ctx));\n break;\n case \"in\":\n clauses.push(inExpr(expr, v, ctx, false));\n break;\n case \"notIn\":\n clauses.push(inExpr(expr, v, ctx, true));\n break;\n case \"contains\":\n clauses.push(containsExpr(field, expr, v, ctx));\n break;\n case \"startsWith\":\n ctx.params.push(bindable(v));\n clauses.push(`instr(${expr}, ?) = 1`);\n break;\n case \"endsWith\":\n ctx.params.push(bindable(v));\n ctx.params.push(bindable(v));\n clauses.push(`substr(${expr}, -length(?)) = ?`);\n break;\n case \"has\":\n clauses.push(hasExpr(field, expr, v, ctx));\n break;\n case \"exists\":\n clauses.push(existsExpr(field, expr, !!v));\n break;\n default:\n throw new MonliteQueryError(\n `Unknown where operator \"${op}\" on field \"${field}\"`,\n );\n }\n }\n\n if (!clauses.length) return \"\";\n return clauses.length === 1 ? clauses[0]! : \"(\" + clauses.join(\" AND \") + \")\";\n}\n\nfunction eqExpr(expr: string, v: any, ctx: WhereContext): string {\n if (v === null) return `${expr} IS NULL`;\n ctx.params.push(bindable(v));\n return `${expr} = ?`;\n}\n\nfunction notExpr(expr: string, v: any, ctx: WhereContext): string {\n // Mongo/Prisma semantics: a missing field counts as \"not equal\".\n if (v === null) return `${expr} IS NOT NULL`;\n ctx.params.push(bindable(v));\n return `(${expr} IS NULL OR ${expr} != ?)`;\n}\n\nfunction cmp(expr: string, op: string, v: any, ctx: WhereContext): string {\n ctx.params.push(bindable(v));\n return `${expr} ${op} ?`;\n}\n\nfunction inExpr(\n expr: string,\n arr: any,\n ctx: WhereContext,\n negate: boolean,\n): string {\n if (!Array.isArray(arr)) {\n throw new MonliteQueryError(\n `${negate ? \"notIn\" : \"in\"} expects an array`,\n );\n }\n if (arr.length === 0) return negate ? \"1\" : \"0\";\n const placeholders = arr\n .map((v) => {\n ctx.params.push(bindable(v));\n return \"?\";\n })\n .join(\", \");\n return negate\n ? `(${expr} IS NULL OR ${expr} NOT IN (${placeholders}))`\n : `${expr} IN (${placeholders})`;\n}\n\n/**\n * `contains` works on strings (case-sensitive substring via `instr`) and arrays\n * (element membership). `instr` is used instead of `LIKE` so that `%`/`_` are\n * treated literally and matching is case-sensitive, matching Prisma semantics.\n */\nfunction containsExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n if (isReserved(field)) {\n ctx.params.push(bindable(v));\n return `instr(${expr}, ?) > 0`;\n }\n const path = pathLiteral(field);\n ctx.params.push(bindable(v)); // array branch\n ctx.params.push(bindable(v)); // string branch\n return (\n `(CASE WHEN json_type(data, ${path}) = 'array' ` +\n `THEN EXISTS (SELECT 1 FROM json_each(data, ${path}) WHERE value = ?) ` +\n `ELSE instr(${expr}, ?) > 0 END)`\n );\n}\n\nfunction hasExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n ctx.params.push(bindable(v));\n if (isReserved(field)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(field: string, expr: string, want: boolean): string {\n if (isReserved(field)) {\n return want ? `${expr} IS NOT NULL` : `${expr} IS NULL`;\n }\n const path = pathLiteral(field);\n return want\n ? `json_type(data, ${path}) IS NOT NULL`\n : `json_type(data, ${path}) IS NULL`;\n}\n","import type { OrderBy } from \"../types.js\";\nimport { fieldExpr, isReserved } from \"./sql.js\";\n\n/** Build an `ORDER BY` clause from an orderBy spec. Returns \"\" when empty. */\nexport function buildOrderBy(\n orderBy: OrderBy | undefined,\n onPath?: (p: string) => void,\n): string {\n if (!orderBy) return \"\";\n\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const parts: string[] = [];\n\n for (const obj of list) {\n for (const field of Object.keys(obj)) {\n const dir = (obj as any)[field];\n if (dir === undefined) continue;\n if (onPath && !isReserved(field)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field)} ${d}`);\n }\n }\n\n return parts.length ? \"ORDER BY \" + parts.join(\", \") : \"\";\n}\n","/** Deep get/set/unset on plain objects using dot-notation paths. */\n\nexport function getPath(obj: any, path: string): any {\n let cur = obj;\n for (const seg of path.split(\".\")) {\n if (cur == null) return undefined;\n cur = cur[seg];\n }\n return cur;\n}\n\nexport function setPath(obj: any, path: string, value: any): void {\n const segs = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") cur[seg] = {};\n cur = cur[seg];\n }\n cur[segs[segs.length - 1]!] = value;\n}\n\nexport function unsetPath(obj: any, path: string): void {\n const segs = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") return;\n cur = cur[seg];\n }\n delete cur[segs[segs.length - 1]!];\n}\n","import type { Select } from \"../types.js\";\nimport { getPath, setPath } from \"./path.js\";\n\n/**\n * Project a document down to the selected fields. Supports dot-notation paths,\n * reconstructing nested objects. With no select, the document is returned as-is.\n */\nexport function project(\n doc: Record<string, any>,\n select?: Select,\n): Record<string, any> {\n if (!select) return doc;\n const keys = Object.keys(select).filter((k) => (select as any)[k]);\n if (!keys.length) return doc;\n\n const out: Record<string, any> = {};\n for (const key of keys) {\n const value = getPath(doc, key);\n if (value !== undefined) setPath(out, key, value);\n }\n return out;\n}\n","import type { UpdateData } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { getPath, setPath, unsetPath } from \"./path.js\";\n\nconst UPDATE_OPS = new Set([\"$set\", \"$unset\", \"$inc\", \"$push\", \"$pull\"]);\n\n/** True when the payload uses update operators rather than plain fields. */\nexport function isUpdateOperators(data: any): boolean {\n return (\n data != null &&\n typeof data === \"object\" &&\n Object.keys(data).some((k) => k.startsWith(\"$\"))\n );\n}\n\nfunction sameValue(a: any, b: any): boolean {\n if (a === b) return true;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * Apply an update payload to a (system-field-free) document, returning a new\n * document. Plain payloads are shallow-merged; operator payloads ($set, $inc,\n * $push, $pull, $unset) are applied in order.\n */\nexport function applyUpdate(\n doc: Record<string, any>,\n data: UpdateData,\n): Record<string, any> {\n const next = structuredClone(doc);\n\n if (!isUpdateOperators(data)) {\n return Object.assign(next, data);\n }\n\n for (const key of Object.keys(data)) {\n if (!key.startsWith(\"$\")) {\n throw new MonliteQueryError(\n `Cannot mix update operators with plain field \"${key}\". ` +\n `Use either a plain object or update operators, not both.`,\n );\n }\n if (!UPDATE_OPS.has(key)) {\n throw new MonliteQueryError(`Unknown update operator \"${key}\"`);\n }\n }\n\n const ops = data as Record<string, Record<string, any>>;\n\n if (ops.$set) {\n for (const [path, value] of Object.entries(ops.$set)) setPath(next, path, value);\n }\n if (ops.$inc) {\n for (const [path, by] of Object.entries(ops.$inc)) {\n const cur = getPath(next, path);\n setPath(next, path, (typeof cur === \"number\" ? cur : 0) + Number(by));\n }\n }\n if (ops.$push) {\n for (const [path, value] of Object.entries(ops.$push)) {\n const cur = getPath(next, path);\n const arr = Array.isArray(cur) ? cur.slice() : [];\n // `{ $each: [...] }` pushes multiple values.\n if (value && typeof value === \"object\" && Array.isArray((value as any).$each)) {\n arr.push(...(value as any).$each);\n } else {\n arr.push(value);\n }\n setPath(next, path, arr);\n }\n }\n if (ops.$pull) {\n for (const [path, value] of Object.entries(ops.$pull)) {\n const cur = getPath(next, path);\n if (Array.isArray(cur)) {\n setPath(\n next,\n path,\n cur.filter((x) => !sameValue(x, value)),\n );\n }\n }\n }\n if (ops.$unset) {\n for (const path of Object.keys(ops.$unset)) unsetPath(next, path);\n }\n\n return next;\n}\n","import type { Database } from \"better-sqlite3\";\nimport type {\n AggregateArgs,\n AggregateResult,\n GroupByArgs,\n GroupByResult,\n} from \"../types.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Database;\n table: string;\n onPath: (path: string) => void;\n}\n\nconst ACCUMULATORS = [\"_sum\", \"_avg\", \"_min\", \"_max\"] as const;\ntype Accumulator = (typeof ACCUMULATORS)[number];\n\nconst SQL_FN: Record<Accumulator, string> = {\n _sum: \"SUM\",\n _avg: \"AVG\",\n _min: \"MIN\",\n _max: \"MAX\",\n};\n\ninterface AccCol {\n alias: string;\n kind: Accumulator;\n field: string;\n}\n\n/** Build the accumulator SELECT fragments shared by aggregate and groupBy. */\nfunction buildAccumulators(\n args: { _sum?: any; _avg?: any; _min?: any; _max?: any },\n onPath: (p: string) => void,\n): { selects: string[]; cols: AccCol[] } {\n const selects: string[] = [];\n const cols: AccCol[] = [];\n let i = 0;\n\n for (const kind of ACCUMULATORS) {\n const selection = args[kind];\n if (!selection) continue;\n for (const field of Object.keys(selection)) {\n if (!selection[field]) continue;\n onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field)}) AS ${alias}`);\n cols.push({ alias, kind, field });\n }\n }\n return { selects, cols };\n}\n\nexport function aggregate(\n ctx: AggContext,\n args: AggregateArgs,\n): AggregateResult {\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: ctx.onPath });\n const { selects, cols } = buildAccumulators(args, ctx.onPath);\n\n // Always compute count internally; expose only when requested.\n const allSelects = [`COUNT(*) AS agg_count`, ...selects];\n const sql = `SELECT ${allSelects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where}`;\n const row = (ctx.db.prepare(sql).get(...params) ?? {}) as Record<string, any>;\n\n const result: AggregateResult = {};\n if (args._count) result._count = row.agg_count ?? 0;\n for (const col of cols) {\n const bucket = (result[col.kind] ??= {});\n bucket[col.field] = row[col.alias] ?? null;\n }\n return result;\n}\n\nexport function groupBy(\n ctx: AggContext,\n args: GroupByArgs,\n): GroupByResult[] {\n if (!Array.isArray(args.by) || args.by.length === 0) {\n throw new Error(\"groupBy requires a non-empty `by` array\");\n }\n\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: ctx.onPath });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n ctx.onPath(field);\n const expr = fieldExpr(field);\n groupExprs.push(expr);\n selects.push(`${expr} AS \"${field}\"`);\n }\n\n selects.push(`COUNT(*) AS agg_count`);\n const { selects: accSelects, cols } = buildAccumulators(args, ctx.onPath);\n selects.push(...accSelects);\n\n let sql =\n `SELECT ${selects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where} ` +\n `GROUP BY ${groupExprs.join(\", \")}`;\n\n if (args.orderBy) {\n const parts: string[] = [];\n for (const key of Object.keys(args.orderBy)) {\n const dir =\n String(args.orderBy[key]).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n if (key === \"_count\") parts.push(`agg_count ${dir}`);\n else parts.push(`${fieldExpr(key)} ${dir}`);\n }\n if (parts.length) sql += ` ORDER BY ${parts.join(\", \")}`;\n }\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = ctx.db.prepare(sql).all(...params) as Array<Record<string, any>>;\n\n return rows.map((row) => {\n const out: GroupByResult = {};\n for (const field of args.by) out[field] = row[field];\n if (args._count) out._count = row.agg_count;\n for (const col of cols) {\n (out[col.kind] ??= {})[col.field] = row[col.alias] ?? null;\n }\n return out;\n });\n}\n","import type { Monlite } from \"./db.js\";\nimport type {\n AggregateArgs,\n AggregateResult,\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n Doc,\n FindFirstArgs,\n FindManyArgs,\n GroupByArgs,\n GroupByResult,\n UpdateArgs,\n UpdateData,\n UpsertArgs,\n WhereInput,\n WithId,\n} from \"./types.js\";\nimport { objectId } from \"./id.js\";\nimport { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ninterface Row {\n _id: string;\n data: string;\n created_at: number;\n updated_at: number;\n}\n\nconst SELECT_COLS = `_id, data, created_at, updated_at`;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\n/**\n * A document collection. Backed by a single SQLite table whose rows store the\n * document as JSON in a `data` column. Created lazily on first write/read.\n */\nexport class Collection<T = Doc> {\n private initialized = false;\n private readonly trackPath = (path: string) =>\n this.mon.autoIndexer.track(this.name, path);\n\n constructor(\n private readonly mon: Monlite,\n readonly name: string,\n ) {}\n\n private get db() {\n return this.mon.sqlite;\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${this.name}\" (\n _id TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n this.initialized = true;\n }\n\n private rowToDoc(row: Row): WithId<T> {\n const doc = JSON.parse(row.data) as Record<string, any>;\n doc._id = row._id;\n doc.created_at = row.created_at;\n doc.updated_at = row.updated_at;\n return doc as WithId<T>;\n }\n\n private prepareInsert(input: Record<string, any>): Row {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n return {\n _id: id,\n data: JSON.stringify(doc),\n created_at: now,\n updated_at: now,\n };\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.prepareInsert(args.data);\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n )\n .run(row._id, row.data, row.created_at, row.updated_at);\n return this.rowToDoc(row);\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n );\n const insertAll = this.db.transaction((items: Record<string, any>[]) => {\n for (const item of items) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_at);\n }\n });\n insertAll(args.data);\n return { count: args.data.length };\n }\n\n /* ------------------------------ read ------------------------------ */\n\n async findMany(args: FindManyArgs<T> = {}): Promise<WithId<T>[]> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: this.trackPath });\n let sql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath);\n if (order) sql += \" \" + order;\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = this.db.prepare(sql).all(...params) as Row[];\n return rows.map(\n (r) => project(this.rowToDoc(r), args.select) as WithId<T>,\n );\n }\n\n async findFirst(args: FindFirstArgs<T> = {}): Promise<WithId<T> | null> {\n const rows = await this.findMany({ ...args, take: 1 });\n return rows[0] ?? null;\n }\n\n async findById(id: string): Promise<WithId<T> | null> {\n this.ensureTable();\n const row = this.db\n .prepare(`SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE _id = ?`)\n .get(id) as Row | undefined;\n return row ? this.rowToDoc(row) : null;\n }\n\n async count(args: CountArgs<T> = {}): Promise<number> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: this.trackPath });\n const row = this.db\n .prepare(`SELECT COUNT(*) AS n FROM \"${this.name}\" WHERE ${where}`)\n .get(...params) as { n: number };\n return row.n;\n }\n\n /* ----------------------------- update ----------------------------- */\n\n private runUpdate(\n where: WhereInput<T> | undefined,\n data: UpdateData<T>,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const now = Date.now();\n const stmt = this.db.prepare(\n `UPDATE \"${this.name}\" SET data = ?, updated_at = ? WHERE _id = ?`,\n );\n\n const txn = this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = JSON.parse(row.data) as Record<string, any>;\n const updated = stripSystem(applyUpdate(current, data));\n stmt.run(JSON.stringify(updated), now, row._id);\n out.push({\n ...updated,\n _id: row._id,\n created_at: row.created_at,\n updated_at: now,\n } as WithId<T>);\n }\n return out;\n });\n\n return txn();\n }\n\n async update(args: UpdateArgs<T>): Promise<WithId<T> | null> {\n return this.runUpdate(args.where, args.data, true)[0] ?? null;\n }\n\n async updateMany(args: UpdateArgs<T>): Promise<{ count: number }> {\n return { count: this.runUpdate(args.where, args.data, false).length };\n }\n\n async upsert(args: UpsertArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const existing = await this.findFirst({ where: args.where });\n if (existing) {\n const updated = await this.update({\n where: { _id: existing._id } as WhereInput<T>,\n data: args.update,\n });\n return updated as WithId<T>;\n }\n return this.create({ data: args.create });\n }\n\n /* ----------------------------- delete ----------------------------- */\n\n private runDelete(\n where: WhereInput<T> | undefined,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const stmt = this.db.prepare(`DELETE FROM \"${this.name}\" WHERE _id = ?`);\n const txn = this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\n });\n txn();\n\n return rows.map((r) => this.rowToDoc(r));\n }\n\n async delete(args: DeleteArgs<T>): Promise<WithId<T> | null> {\n return this.runDelete(args.where, true)[0] ?? null;\n }\n\n async deleteMany(args: DeleteArgs<T> = { where: undefined as any }): Promise<{\n count: number;\n }> {\n return { count: this.runDelete(args.where, false).length };\n }\n\n /* --------------------------- aggregation -------------------------- */\n\n async aggregate(args: AggregateArgs<T> = {}): Promise<AggregateResult> {\n this.ensureTable();\n return aggregate(\n { db: this.db, table: this.name, onPath: this.trackPath },\n args,\n );\n }\n\n async groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]> {\n this.ensureTable();\n return groupBy(\n { db: this.db, table: this.name, onPath: this.trackPath },\n args,\n );\n }\n}\n","import type { Database } from \"better-sqlite3\";\nimport { pathLiteral } from \"./query/sql.js\";\n\n/**\n * Tracks which JSON paths are queried per collection and silently creates a\n * SQLite expression index once a path crosses the configured threshold.\n */\nexport class AutoIndexer {\n private counts = new Map<string, number>();\n private created = new Set<string>();\n\n constructor(\n private readonly db: Database,\n private readonly enabled: boolean,\n private readonly threshold: number,\n ) {}\n\n track(collection: string, path: string): void {\n if (!this.enabled) return;\n const key = `${collection}\u0000${path}`;\n if (this.created.has(key)) return;\n\n const next = (this.counts.get(key) ?? 0) + 1;\n this.counts.set(key, next);\n\n if (next >= this.threshold) {\n this.create(collection, path);\n this.created.add(key);\n this.counts.delete(key);\n }\n }\n\n private create(collection: string, path: string): void {\n const safe = path.replace(/[^A-Za-z0-9_]+/g, \"_\");\n const indexName = `idx_${collection}_${safe}`;\n const expr = `json_extract(data, ${pathLiteral(path)})`;\n try {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON \"${collection}\"(${expr})`,\n );\n } catch {\n // Collection may have been dropped between query and index creation.\n }\n }\n\n /** Forget tracking for a collection (or everything when omitted). */\n reset(collection?: string): void {\n if (!collection) {\n this.counts.clear();\n this.created.clear();\n return;\n }\n const prefix = `${collection}\u0000`;\n for (const k of [...this.counts.keys()]) {\n if (k.startsWith(prefix)) this.counts.delete(k);\n }\n for (const k of [...this.created.keys()]) {\n if (k.startsWith(prefix)) this.created.delete(k);\n }\n }\n}\n","import Database from \"better-sqlite3\";\nimport type { Database as SqliteDatabase } from \"better-sqlite3\";\nimport type { Doc, MonliteOptions } from \"./types.js\";\nimport { Collection } from \"./collection.js\";\nimport { AutoIndexer } from \"./auto-index.js\";\nimport { MonliteError } from \"./errors.js\";\nimport { bindable } from \"./query/sql.js\";\n\nfunction validateName(name: string): void {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new MonliteError(\n `Invalid collection name \"${name}\". Names must start with a letter or ` +\n `underscore and contain only letters, digits and underscores.`,\n );\n }\n}\n\nfunction buildTagged(\n strings: TemplateStringsArray,\n values: any[],\n): { sql: string; params: any[] } {\n let sql = \"\";\n const params: any[] = [];\n strings.forEach((part, i) => {\n sql += part;\n if (i < values.length) {\n sql += \"?\";\n params.push(bindable(values[i]));\n }\n });\n return { sql, params };\n}\n\n/**\n * A monlite database — a thin document layer over a single SQLite file.\n * Create one with {@link createDb}.\n */\nexport class Monlite {\n /** The underlying better-sqlite3 connection (escape hatch). */\n readonly sqlite: SqliteDatabase;\n /** @internal */\n readonly autoIndexer: AutoIndexer;\n\n private readonly collections = new Map<string, Collection<any>>();\n private closed = false;\n\n constructor(filename: string, options: MonliteOptions = {}) {\n const verbose = options.verbose;\n this.sqlite = new Database(filename, {\n readonly: options.readonly ?? false,\n ...(verbose ? { verbose: (msg?: unknown) => verbose(String(msg)) } : {}),\n });\n\n if (!options.readonly && (options.wal ?? true)) {\n this.sqlite.pragma(\"journal_mode = WAL\");\n }\n\n this.autoIndexer = new AutoIndexer(\n this.sqlite,\n options.autoIndex ?? true,\n options.autoIndexAfter ?? 10,\n );\n }\n\n /** Get (or lazily create) a typed collection handle. */\n collection<T = Doc>(name: string): Collection<T> {\n this.assertOpen();\n validateName(name);\n let col = this.collections.get(name);\n if (!col) {\n col = new Collection<T>(this, name);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\n }\n\n /** Tagged-template SQL query returning rows. Values are safely parameterized. */\n $queryRaw<R = any>(strings: TemplateStringsArray, ...values: any[]): Promise<R[]> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.sqlite.prepare(sql).all(...params) as R[]);\n }\n\n /** Like {@link $queryRaw} but takes a raw SQL string and positional params. */\n $queryRawUnsafe<R = any>(sql: string, ...params: any[]): Promise<R[]> {\n this.assertOpen();\n return Promise.resolve(\n this.sqlite.prepare(sql).all(...params.map(bindable)) as R[],\n );\n }\n\n /** Tagged-template SQL statement returning the number of affected rows. */\n $executeRaw(strings: TemplateStringsArray, ...values: any[]): Promise<number> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.sqlite.prepare(sql).run(...params).changes);\n }\n\n /** Like {@link $executeRaw} but takes a raw SQL string and positional params. */\n $executeRawUnsafe(sql: string, ...params: any[]): Promise<number> {\n this.assertOpen();\n return Promise.resolve(\n this.sqlite.prepare(sql).run(...params.map(bindable)).changes,\n );\n }\n\n /**\n * Run a function inside a synchronous SQLite transaction. If it throws, the\n * transaction is rolled back.\n */\n async $transaction<R>(fn: (db: this) => R): Promise<R> {\n this.assertOpen();\n // better-sqlite3 transactions are synchronous; `fn` must not be async.\n // A throw inside `txn()` rolls back and rejects this promise.\n const txn = this.sqlite.transaction(() => fn(this));\n return txn();\n }\n\n /** List all collection (table) names. */\n $collections(): Promise<string[]> {\n this.assertOpen();\n const rows = this.sqlite\n .prepare(\n `SELECT name FROM sqlite_master\n WHERE type='table' AND name NOT LIKE 'sqlite_%'\n ORDER BY name`,\n )\n .all() as Array<{ name: string }>;\n return Promise.resolve(rows.map((r) => r.name));\n }\n\n /** Drop a collection and all of its data. */\n $drop(name: string): Promise<void> {\n this.assertOpen();\n validateName(name);\n this.sqlite.exec(`DROP TABLE IF EXISTS \"${name}\"`);\n this.collections.delete(name);\n this.autoIndexer.reset(name);\n return Promise.resolve();\n }\n\n /** Drop every collection in the database. */\n async $dropAll(): Promise<void> {\n for (const name of await this.$collections()) await this.$drop(name);\n }\n\n /** Close the underlying SQLite connection. */\n $disconnect(): Promise<void> {\n if (!this.closed) {\n this.closed = true;\n this.sqlite.close();\n }\n return Promise.resolve();\n }\n\n private assertOpen(): void {\n if (this.closed) throw new MonliteError(\"Database connection is closed\");\n }\n}\n\n/**\n * Open (or create) a monlite database backed by a single SQLite file.\n * Use `\":memory:\"` for an in-memory database.\n */\nexport function createDb(filename: string, options?: MonliteOptions): Monlite {\n return new Monlite(filename, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/id.ts","../src/errors.ts","../src/query/sql.ts","../src/query/where.ts","../src/query/order.ts","../src/query/path.ts","../src/query/select.ts","../src/query/update.ts","../src/aggregation/aggregate.ts","../src/collection.ts","../src/auto-index.ts","../src/driver/better-sqlite3.ts","../src/driver/node-sqlite.ts","../src/driver/index.ts","../src/db.ts"],"names":["randomBytes","createRequire"],"mappings":"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","file":"index.cjs","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\n/**\n * Generates MongoDB ObjectId-compatible identifiers: a 24-character hex string\n * built from a 4-byte timestamp, 5 random bytes (stable per process) and a\n * 3-byte incrementing counter.\n *\n * Because the timestamp is the high-order component, ids sort in roughly\n * insertion order — which keeps the SQLite primary-key index well-localized.\n */\n\nconst PROCESS_UNIQUE = randomBytes(5);\nlet counter = randomBytes(3).readUIntBE(0, 3);\n\nexport function objectId(): string {\n const time = Math.floor(Date.now() / 1000);\n counter = (counter + 1) % 0x1000000; // wrap at 2^24\n\n const buf = Buffer.allocUnsafe(12);\n buf.writeUInt32BE(time >>> 0, 0);\n PROCESS_UNIQUE.copy(buf, 4, 0, 5);\n buf.writeUIntBE(counter, 9, 3);\n\n return buf.toString(\"hex\");\n}\n\n/** True when a value looks like a monlite/ObjectId id (24 hex chars). */\nexport function isObjectId(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{24}$/i.test(value);\n}\n","/** Base error for all monlite-originated failures. */\nexport class MonliteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MonliteError\";\n }\n}\n\n/** Thrown when a query/update payload is malformed. */\nexport class MonliteQueryError extends MonliteError {\n constructor(message: string) {\n super(message);\n this.name = \"MonliteQueryError\";\n }\n}\n","/** Shared helpers for translating document paths and values into SQLite. */\n\n/** System columns stored outside the JSON `data` blob. */\nexport const RESERVED_FIELDS = new Set([\"_id\", \"created_at\", \"updated_at\"]);\n\nexport function isReserved(field: string): boolean {\n return RESERVED_FIELDS.has(field);\n}\n\n/**\n * Convert a dotted document path (`address.city`, `items.0.name`) into a\n * SQLite JSON path (`$.address.city`, `$.items[0].name`), quoting segments\n * that are not bare identifiers.\n */\nexport function jsonPath(field: string): string {\n let path = \"$\";\n for (const seg of field.split(\".\")) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(seg)) {\n path += \".\" + seg;\n } else if (/^\\d+$/.test(seg)) {\n path += \"[\" + seg + \"]\";\n } else {\n path += '.\"' + seg.replace(/\"/g, '\"\"') + '\"';\n }\n }\n return path;\n}\n\n/** A JSON path wrapped as a single-quoted SQL string literal. */\nexport function pathLiteral(field: string): string {\n return \"'\" + jsonPath(field).replace(/'/g, \"''\") + \"'\";\n}\n\n/** SQL expression yielding the value of `field` for a row. */\nexport function fieldExpr(field: string): string {\n if (isReserved(field)) return `\"${field}\"`;\n return `json_extract(data, ${pathLiteral(field)})`;\n}\n\n/**\n * Normalize a JS value into something better-sqlite3 can bind.\n * better-sqlite3 only accepts numbers, bigints, strings, Buffers and null —\n * so booleans, Dates, undefined and objects are converted here.\n */\nexport function bindable(value: any): number | bigint | string | Buffer | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.toISOString();\n if (\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n ) {\n return value;\n }\n if (Buffer.isBuffer(value)) return value;\n // Arrays / nested objects: compare against SQLite's minified JSON text.\n return JSON.stringify(value);\n}\n","import type { WhereInput, FieldFilter } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { fieldExpr, pathLiteral, bindable, isReserved } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\n /** Called with every document path referenced (for auto-index tracking). */\n onPath?: (path: string) => void;\n}\n\n/** Build a SQL boolean expression from a where clause. Returns `1` when empty. */\nexport function buildWhere(\n where: WhereInput | undefined,\n ctx: WhereContext,\n): string {\n if (!where) return \"1\";\n return translateObject(where, ctx) || \"1\";\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nfunction translateObject(where: WhereInput, ctx: WhereContext): string {\n const parts: string[] = [];\n\n for (const key of Object.keys(where)) {\n const value = (where as any)[key];\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) {\n const join = key === \"AND\" ? \" AND \" : \" OR \";\n parts.push(\"(\" + subs.join(join) + \")\");\n }\n } else if (key === \"NOT\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) parts.push(\"NOT (\" + subs.join(\" AND \") + \")\");\n } else {\n const clause = translateField(key, value, ctx);\n if (clause) parts.push(clause);\n }\n }\n\n return parts.join(\" AND \");\n}\n\nfunction isFilterObject(v: any): v is FieldFilter {\n return (\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v) &&\n (v.constructor === Object || v.constructor === undefined)\n );\n}\n\nfunction translateField(field: string, condition: any, ctx: WhereContext): string {\n if (ctx.onPath && !isReserved(field)) ctx.onPath(field);\n const expr = fieldExpr(field);\n\n // Scalar (or array/Date) value is shorthand for `{ equals: value }`.\n if (!isFilterObject(condition)) {\n return eqExpr(expr, condition, ctx);\n }\n\n const filter = condition as Record<string, any>;\n const clauses: string[] = [];\n for (const op of Object.keys(filter)) {\n const v = filter[op];\n if (v === undefined) continue;\n\n switch (op) {\n case \"equals\":\n clauses.push(eqExpr(expr, v, ctx));\n break;\n case \"not\":\n clauses.push(notExpr(expr, v, ctx));\n break;\n case \"gt\":\n clauses.push(cmp(expr, \">\", v, ctx));\n break;\n case \"gte\":\n clauses.push(cmp(expr, \">=\", v, ctx));\n break;\n case \"lt\":\n clauses.push(cmp(expr, \"<\", v, ctx));\n break;\n case \"lte\":\n clauses.push(cmp(expr, \"<=\", v, ctx));\n break;\n case \"in\":\n clauses.push(inExpr(expr, v, ctx, false));\n break;\n case \"notIn\":\n clauses.push(inExpr(expr, v, ctx, true));\n break;\n case \"contains\":\n clauses.push(containsExpr(field, expr, v, ctx));\n break;\n case \"startsWith\":\n ctx.params.push(bindable(v));\n clauses.push(`instr(${expr}, ?) = 1`);\n break;\n case \"endsWith\":\n ctx.params.push(bindable(v));\n ctx.params.push(bindable(v));\n clauses.push(`substr(${expr}, -length(?)) = ?`);\n break;\n case \"has\":\n clauses.push(hasExpr(field, expr, v, ctx));\n break;\n case \"exists\":\n clauses.push(existsExpr(field, expr, !!v));\n break;\n default:\n throw new MonliteQueryError(\n `Unknown where operator \"${op}\" on field \"${field}\"`,\n );\n }\n }\n\n if (!clauses.length) return \"\";\n return clauses.length === 1 ? clauses[0]! : \"(\" + clauses.join(\" AND \") + \")\";\n}\n\nfunction eqExpr(expr: string, v: any, ctx: WhereContext): string {\n if (v === null) return `${expr} IS NULL`;\n ctx.params.push(bindable(v));\n return `${expr} = ?`;\n}\n\nfunction notExpr(expr: string, v: any, ctx: WhereContext): string {\n // Mongo/Prisma semantics: a missing field counts as \"not equal\".\n if (v === null) return `${expr} IS NOT NULL`;\n ctx.params.push(bindable(v));\n return `(${expr} IS NULL OR ${expr} != ?)`;\n}\n\nfunction cmp(expr: string, op: string, v: any, ctx: WhereContext): string {\n ctx.params.push(bindable(v));\n return `${expr} ${op} ?`;\n}\n\nfunction inExpr(\n expr: string,\n arr: any,\n ctx: WhereContext,\n negate: boolean,\n): string {\n if (!Array.isArray(arr)) {\n throw new MonliteQueryError(\n `${negate ? \"notIn\" : \"in\"} expects an array`,\n );\n }\n if (arr.length === 0) return negate ? \"1\" : \"0\";\n const placeholders = arr\n .map((v) => {\n ctx.params.push(bindable(v));\n return \"?\";\n })\n .join(\", \");\n return negate\n ? `(${expr} IS NULL OR ${expr} NOT IN (${placeholders}))`\n : `${expr} IN (${placeholders})`;\n}\n\n/**\n * `contains` works on strings (case-sensitive substring via `instr`) and arrays\n * (element membership). `instr` is used instead of `LIKE` so that `%`/`_` are\n * treated literally and matching is case-sensitive, matching Prisma semantics.\n */\nfunction containsExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n if (isReserved(field)) {\n ctx.params.push(bindable(v));\n return `instr(${expr}, ?) > 0`;\n }\n const path = pathLiteral(field);\n ctx.params.push(bindable(v)); // array branch\n ctx.params.push(bindable(v)); // string branch\n return (\n `(CASE WHEN json_type(data, ${path}) = 'array' ` +\n `THEN EXISTS (SELECT 1 FROM json_each(data, ${path}) WHERE value = ?) ` +\n `ELSE instr(${expr}, ?) > 0 END)`\n );\n}\n\nfunction hasExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n ctx.params.push(bindable(v));\n if (isReserved(field)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(field: string, expr: string, want: boolean): string {\n if (isReserved(field)) {\n return want ? `${expr} IS NOT NULL` : `${expr} IS NULL`;\n }\n const path = pathLiteral(field);\n return want\n ? `json_type(data, ${path}) IS NOT NULL`\n : `json_type(data, ${path}) IS NULL`;\n}\n","import type { OrderBy } from \"../types.js\";\nimport { fieldExpr, isReserved } from \"./sql.js\";\n\n/** Build an `ORDER BY` clause from an orderBy spec. Returns \"\" when empty. */\nexport function buildOrderBy(\n orderBy: OrderBy | undefined,\n onPath?: (p: string) => void,\n): string {\n if (!orderBy) return \"\";\n\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const parts: string[] = [];\n\n for (const obj of list) {\n for (const field of Object.keys(obj)) {\n const dir = (obj as any)[field];\n if (dir === undefined) continue;\n if (onPath && !isReserved(field)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field)} ${d}`);\n }\n }\n\n return parts.length ? \"ORDER BY \" + parts.join(\", \") : \"\";\n}\n","/** Deep get/set/unset on plain objects using dot-notation paths. */\n\nexport function getPath(obj: any, path: string): any {\n let cur = obj;\n for (const seg of path.split(\".\")) {\n if (cur == null) return undefined;\n cur = cur[seg];\n }\n return cur;\n}\n\nexport function setPath(obj: any, path: string, value: any): void {\n const segs = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") cur[seg] = {};\n cur = cur[seg];\n }\n cur[segs[segs.length - 1]!] = value;\n}\n\nexport function unsetPath(obj: any, path: string): void {\n const segs = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") return;\n cur = cur[seg];\n }\n delete cur[segs[segs.length - 1]!];\n}\n","import type { Select } from \"../types.js\";\nimport { getPath, setPath } from \"./path.js\";\n\n/**\n * Project a document down to the selected fields. Supports dot-notation paths,\n * reconstructing nested objects. With no select, the document is returned as-is.\n */\nexport function project(\n doc: Record<string, any>,\n select?: Select,\n): Record<string, any> {\n if (!select) return doc;\n const keys = Object.keys(select).filter((k) => (select as any)[k]);\n if (!keys.length) return doc;\n\n const out: Record<string, any> = {};\n for (const key of keys) {\n const value = getPath(doc, key);\n if (value !== undefined) setPath(out, key, value);\n }\n return out;\n}\n","import type { UpdateData } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { getPath, setPath, unsetPath } from \"./path.js\";\n\nconst UPDATE_OPS = new Set([\"$set\", \"$unset\", \"$inc\", \"$push\", \"$pull\"]);\n\n/** True when the payload uses update operators rather than plain fields. */\nexport function isUpdateOperators(data: any): boolean {\n return (\n data != null &&\n typeof data === \"object\" &&\n Object.keys(data).some((k) => k.startsWith(\"$\"))\n );\n}\n\nfunction sameValue(a: any, b: any): boolean {\n if (a === b) return true;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * Apply an update payload to a (system-field-free) document, returning a new\n * document. Plain payloads are shallow-merged; operator payloads ($set, $inc,\n * $push, $pull, $unset) are applied in order.\n */\nexport function applyUpdate(\n doc: Record<string, any>,\n data: UpdateData,\n): Record<string, any> {\n const next = structuredClone(doc);\n\n if (!isUpdateOperators(data)) {\n return Object.assign(next, data);\n }\n\n for (const key of Object.keys(data)) {\n if (!key.startsWith(\"$\")) {\n throw new MonliteQueryError(\n `Cannot mix update operators with plain field \"${key}\". ` +\n `Use either a plain object or update operators, not both.`,\n );\n }\n if (!UPDATE_OPS.has(key)) {\n throw new MonliteQueryError(`Unknown update operator \"${key}\"`);\n }\n }\n\n const ops = data as Record<string, Record<string, any>>;\n\n if (ops.$set) {\n for (const [path, value] of Object.entries(ops.$set)) setPath(next, path, value);\n }\n if (ops.$inc) {\n for (const [path, by] of Object.entries(ops.$inc)) {\n const cur = getPath(next, path);\n setPath(next, path, (typeof cur === \"number\" ? cur : 0) + Number(by));\n }\n }\n if (ops.$push) {\n for (const [path, value] of Object.entries(ops.$push)) {\n const cur = getPath(next, path);\n const arr = Array.isArray(cur) ? cur.slice() : [];\n // `{ $each: [...] }` pushes multiple values.\n if (value && typeof value === \"object\" && Array.isArray((value as any).$each)) {\n arr.push(...(value as any).$each);\n } else {\n arr.push(value);\n }\n setPath(next, path, arr);\n }\n }\n if (ops.$pull) {\n for (const [path, value] of Object.entries(ops.$pull)) {\n const cur = getPath(next, path);\n if (Array.isArray(cur)) {\n setPath(\n next,\n path,\n cur.filter((x) => !sameValue(x, value)),\n );\n }\n }\n }\n if (ops.$unset) {\n for (const path of Object.keys(ops.$unset)) unsetPath(next, path);\n }\n\n return next;\n}\n","import type {\n AggregateArgs,\n AggregateResult,\n GroupByArgs,\n GroupByResult,\n} from \"../types.js\";\nimport type { Driver } from \"../driver/types.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\n}\n\nconst ACCUMULATORS = [\"_sum\", \"_avg\", \"_min\", \"_max\"] as const;\ntype Accumulator = (typeof ACCUMULATORS)[number];\n\nconst SQL_FN: Record<Accumulator, string> = {\n _sum: \"SUM\",\n _avg: \"AVG\",\n _min: \"MIN\",\n _max: \"MAX\",\n};\n\ninterface AccCol {\n alias: string;\n kind: Accumulator;\n field: string;\n}\n\n/** Build the accumulator SELECT fragments shared by aggregate and groupBy. */\nfunction buildAccumulators(\n args: { _sum?: any; _avg?: any; _min?: any; _max?: any },\n onPath: (p: string) => void,\n): { selects: string[]; cols: AccCol[] } {\n const selects: string[] = [];\n const cols: AccCol[] = [];\n let i = 0;\n\n for (const kind of ACCUMULATORS) {\n const selection = args[kind];\n if (!selection) continue;\n for (const field of Object.keys(selection)) {\n if (!selection[field]) continue;\n onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field)}) AS ${alias}`);\n cols.push({ alias, kind, field });\n }\n }\n return { selects, cols };\n}\n\nexport function aggregate(\n ctx: AggContext,\n args: AggregateArgs,\n): AggregateResult {\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: ctx.onPath });\n const { selects, cols } = buildAccumulators(args, ctx.onPath);\n\n // Always compute count internally; expose only when requested.\n const allSelects = [`COUNT(*) AS agg_count`, ...selects];\n const sql = `SELECT ${allSelects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where}`;\n const row = (ctx.db.prepare(sql).get(...params) ?? {}) as Record<string, any>;\n\n const result: AggregateResult = {};\n if (args._count) result._count = row.agg_count ?? 0;\n for (const col of cols) {\n const bucket = (result[col.kind] ??= {});\n bucket[col.field] = row[col.alias] ?? null;\n }\n return result;\n}\n\nexport function groupBy(\n ctx: AggContext,\n args: GroupByArgs,\n): GroupByResult[] {\n if (!Array.isArray(args.by) || args.by.length === 0) {\n throw new Error(\"groupBy requires a non-empty `by` array\");\n }\n\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: ctx.onPath });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n ctx.onPath(field);\n const expr = fieldExpr(field);\n groupExprs.push(expr);\n selects.push(`${expr} AS \"${field}\"`);\n }\n\n selects.push(`COUNT(*) AS agg_count`);\n const { selects: accSelects, cols } = buildAccumulators(args, ctx.onPath);\n selects.push(...accSelects);\n\n let sql =\n `SELECT ${selects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where} ` +\n `GROUP BY ${groupExprs.join(\", \")}`;\n\n if (args.orderBy) {\n const parts: string[] = [];\n for (const key of Object.keys(args.orderBy)) {\n const dir =\n String(args.orderBy[key]).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n if (key === \"_count\") parts.push(`agg_count ${dir}`);\n else parts.push(`${fieldExpr(key)} ${dir}`);\n }\n if (parts.length) sql += ` ORDER BY ${parts.join(\", \")}`;\n }\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = ctx.db.prepare(sql).all(...params) as Array<Record<string, any>>;\n\n return rows.map((row) => {\n const out: GroupByResult = {};\n for (const field of args.by) out[field] = row[field];\n if (args._count) out._count = row.agg_count;\n for (const col of cols) {\n (out[col.kind] ??= {})[col.field] = row[col.alias] ?? null;\n }\n return out;\n });\n}\n","import type { Monlite } from \"./db.js\";\nimport type {\n AggregateArgs,\n AggregateResult,\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n Doc,\n FindFirstArgs,\n FindManyArgs,\n GroupByArgs,\n GroupByResult,\n UpdateArgs,\n UpdateData,\n UpsertArgs,\n WhereInput,\n WithId,\n} from \"./types.js\";\nimport { objectId } from \"./id.js\";\nimport { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ninterface Row {\n _id: string;\n data: string;\n created_at: number;\n updated_at: number;\n}\n\nconst SELECT_COLS = `_id, data, created_at, updated_at`;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\n/**\n * A document collection. Backed by a single SQLite table whose rows store the\n * document as JSON in a `data` column. Created lazily on first write/read.\n */\nexport class Collection<T = Doc> {\n private initialized = false;\n private readonly trackPath = (path: string) =>\n this.mon.autoIndexer.track(this.name, path);\n\n constructor(\n private readonly mon: Monlite,\n readonly name: string,\n ) {}\n\n private get db() {\n return this.mon.driver;\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${this.name}\" (\n _id TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n this.initialized = true;\n }\n\n private rowToDoc(row: Row): WithId<T> {\n const doc = JSON.parse(row.data) as Record<string, any>;\n doc._id = row._id;\n doc.created_at = row.created_at;\n doc.updated_at = row.updated_at;\n return doc as WithId<T>;\n }\n\n private prepareInsert(input: Record<string, any>): Row {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n return {\n _id: id,\n data: JSON.stringify(doc),\n created_at: now,\n updated_at: now,\n };\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.prepareInsert(args.data);\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n )\n .run(row._id, row.data, row.created_at, row.updated_at);\n return this.rowToDoc(row);\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n );\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_at);\n }\n });\n return { count: args.data.length };\n }\n\n /* ------------------------------ read ------------------------------ */\n\n async findMany(args: FindManyArgs<T> = {}): Promise<WithId<T>[]> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: this.trackPath });\n let sql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath);\n if (order) sql += \" \" + order;\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = this.db.prepare(sql).all(...params) as Row[];\n return rows.map(\n (r) => project(this.rowToDoc(r), args.select) as WithId<T>,\n );\n }\n\n async findFirst(args: FindFirstArgs<T> = {}): Promise<WithId<T> | null> {\n const rows = await this.findMany({ ...args, take: 1 });\n return rows[0] ?? null;\n }\n\n async findById(id: string): Promise<WithId<T> | null> {\n this.ensureTable();\n const row = this.db\n .prepare(`SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE _id = ?`)\n .get(id) as Row | undefined;\n return row ? this.rowToDoc(row) : null;\n }\n\n async count(args: CountArgs<T> = {}): Promise<number> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, { params, onPath: this.trackPath });\n const row = this.db\n .prepare(`SELECT COUNT(*) AS n FROM \"${this.name}\" WHERE ${where}`)\n .get(...params) as { n: number };\n return row.n;\n }\n\n /* ----------------------------- update ----------------------------- */\n\n private runUpdate(\n where: WhereInput<T> | undefined,\n data: UpdateData<T>,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const now = Date.now();\n const stmt = this.db.prepare(\n `UPDATE \"${this.name}\" SET data = ?, updated_at = ? WHERE _id = ?`,\n );\n\n return this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = JSON.parse(row.data) as Record<string, any>;\n const updated = stripSystem(applyUpdate(current, data));\n stmt.run(JSON.stringify(updated), now, row._id);\n out.push({\n ...updated,\n _id: row._id,\n created_at: row.created_at,\n updated_at: now,\n } as WithId<T>);\n }\n return out;\n });\n }\n\n async update(args: UpdateArgs<T>): Promise<WithId<T> | null> {\n return this.runUpdate(args.where, args.data, true)[0] ?? null;\n }\n\n async updateMany(args: UpdateArgs<T>): Promise<{ count: number }> {\n return { count: this.runUpdate(args.where, args.data, false).length };\n }\n\n async upsert(args: UpsertArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const existing = await this.findFirst({ where: args.where });\n if (existing) {\n const updated = await this.update({\n where: { _id: existing._id } as WhereInput<T>,\n data: args.update,\n });\n return updated as WithId<T>;\n }\n return this.create({ data: args.create });\n }\n\n /* ----------------------------- delete ----------------------------- */\n\n private runDelete(\n where: WhereInput<T> | undefined,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const stmt = this.db.prepare(`DELETE FROM \"${this.name}\" WHERE _id = ?`);\n this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\n });\n\n return rows.map((r) => this.rowToDoc(r));\n }\n\n async delete(args: DeleteArgs<T>): Promise<WithId<T> | null> {\n return this.runDelete(args.where, true)[0] ?? null;\n }\n\n async deleteMany(args: DeleteArgs<T> = { where: undefined as any }): Promise<{\n count: number;\n }> {\n return { count: this.runDelete(args.where, false).length };\n }\n\n /* --------------------------- aggregation -------------------------- */\n\n async aggregate(args: AggregateArgs<T> = {}): Promise<AggregateResult> {\n this.ensureTable();\n return aggregate(\n { db: this.db, table: this.name, onPath: this.trackPath },\n args,\n );\n }\n\n async groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]> {\n this.ensureTable();\n return groupBy(\n { db: this.db, table: this.name, onPath: this.trackPath },\n args,\n );\n }\n}\n","import type { Driver } from \"./driver/types.js\";\nimport { pathLiteral } from \"./query/sql.js\";\n\n/**\n * Tracks which JSON paths are queried per collection and silently creates a\n * SQLite expression index once a path crosses the configured threshold.\n */\nexport class AutoIndexer {\n private counts = new Map<string, number>();\n private created = new Set<string>();\n\n constructor(\n private readonly db: Driver,\n private readonly enabled: boolean,\n private readonly threshold: number,\n ) {}\n\n track(collection: string, path: string): void {\n if (!this.enabled) return;\n const key = `${collection}\u0000${path}`;\n if (this.created.has(key)) return;\n\n const next = (this.counts.get(key) ?? 0) + 1;\n this.counts.set(key, next);\n\n if (next >= this.threshold) {\n this.create(collection, path);\n this.created.add(key);\n this.counts.delete(key);\n }\n }\n\n private create(collection: string, path: string): void {\n const safe = path.replace(/[^A-Za-z0-9_]+/g, \"_\");\n const indexName = `idx_${collection}_${safe}`;\n const expr = `json_extract(data, ${pathLiteral(path)})`;\n try {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON \"${collection}\"(${expr})`,\n );\n } catch {\n // Collection may have been dropped between query and index creation.\n }\n }\n\n /** Forget tracking for a collection (or everything when omitted). */\n reset(collection?: string): void {\n if (!collection) {\n this.counts.clear();\n this.created.clear();\n return;\n }\n const prefix = `${collection}\u0000`;\n for (const k of [...this.counts.keys()]) {\n if (k.startsWith(prefix)) this.counts.delete(k);\n }\n for (const k of [...this.created.keys()]) {\n if (k.startsWith(prefix)) this.created.delete(k);\n }\n }\n}\n","import type { Driver, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\n/** Adapter over the `better-sqlite3` native driver. */\nexport class BetterSqlite3Driver implements Driver {\n readonly name = \"better-sqlite3\";\n readonly raw: any;\n private readonly verbose?: (sql: string) => void;\n\n constructor(BetterSqlite3: any, filename: string, options: DriverOpenOptions) {\n this.verbose = options.verbose;\n this.raw = new BetterSqlite3(filename, {\n readonly: options.readonly ?? false,\n });\n if (!options.readonly && (options.wal ?? true)) {\n this.raw.pragma(\"journal_mode = WAL\");\n }\n }\n\n exec(sql: string): void {\n this.verbose?.(sql);\n this.raw.exec(sql);\n }\n\n prepare(sql: string): PreparedStatement {\n this.verbose?.(sql);\n // better-sqlite3 statements already match the PreparedStatement shape.\n return this.raw.prepare(sql);\n }\n\n transaction<T>(fn: () => T): T {\n // Nested calls automatically use SAVEPOINTs in better-sqlite3.\n return this.raw.transaction(fn)();\n }\n\n close(): void {\n this.raw.close();\n }\n}\n","import type { Driver, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\n/**\n * Adapter over Node's built-in `node:sqlite` (Node >= 22.5). Lets monlite run\n * with zero external dependencies. Note: `node:sqlite` is still flagged\n * experimental by Node and prints a one-time ExperimentalWarning.\n *\n * Unlike better-sqlite3 it has no `.transaction()` / `.pragma()` helpers, so\n * transactions are implemented here with BEGIN/COMMIT and nested SAVEPOINTs.\n */\nexport class NodeSqliteDriver implements Driver {\n readonly name = \"node:sqlite\";\n readonly raw: any;\n private readonly verbose?: (sql: string) => void;\n private depth = 0;\n\n constructor(nodeSqlite: any, filename: string, options: DriverOpenOptions) {\n this.verbose = options.verbose;\n const { DatabaseSync } = nodeSqlite;\n this.raw = new DatabaseSync(filename, {\n readOnly: options.readonly ?? false,\n });\n if (!options.readonly && (options.wal ?? true)) {\n this.raw.exec(\"PRAGMA journal_mode = WAL\");\n }\n }\n\n exec(sql: string): void {\n this.verbose?.(sql);\n this.raw.exec(sql);\n }\n\n prepare(sql: string): PreparedStatement {\n this.verbose?.(sql);\n const stmt = this.raw.prepare(sql);\n return {\n run: (...p: any[]) => stmt.run(...p),\n get: (...p: any[]) => stmt.get(...p),\n all: (...p: any[]) => stmt.all(...p),\n };\n }\n\n transaction<T>(fn: () => T): T {\n const savepoint = `monlite_sp_${this.depth}`;\n if (this.depth === 0) this.raw.exec(\"BEGIN\");\n else this.raw.exec(`SAVEPOINT ${savepoint}`);\n this.depth++;\n\n try {\n const result = fn();\n this.depth--;\n if (this.depth === 0) this.raw.exec(\"COMMIT\");\n else this.raw.exec(`RELEASE ${savepoint}`);\n return result;\n } catch (err) {\n this.depth--;\n if (this.depth === 0) this.raw.exec(\"ROLLBACK\");\n else this.raw.exec(`ROLLBACK TO ${savepoint}; RELEASE ${savepoint}`);\n throw err;\n }\n }\n\n close(): void {\n this.raw.close();\n }\n}\n","import { createRequire } from \"node:module\";\nimport { MonliteError } from \"../errors.js\";\nimport type { Driver, DriverName, DriverOpenOptions } from \"./types.js\";\nimport { BetterSqlite3Driver } from \"./better-sqlite3.js\";\nimport { NodeSqliteDriver } from \"./node-sqlite.js\";\n\nexport type { Driver, DriverName, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\n// Resolve relative to this module so optional deps load from the host app.\nconst req = createRequire(import.meta.url);\n\nfunction loadBetterSqlite3(): any | null {\n try {\n const mod = req(\"better-sqlite3\");\n return mod?.default ?? mod;\n } catch {\n return null;\n }\n}\n\nfunction loadNodeSqlite(): any | null {\n try {\n // Only required when actually selected, so better-sqlite3 users never\n // trigger node:sqlite's experimental warning.\n return req(\"node:sqlite\");\n } catch {\n return null;\n }\n}\n\nexport interface CreateDriverOptions extends DriverOpenOptions {\n driver?: DriverName;\n}\n\n/**\n * Build the SQLite driver. With `\"auto\"` (the default) better-sqlite3 is used\n * when installed, otherwise the built-in node:sqlite (Node >= 22.5).\n */\nexport function createDriver(\n filename: string,\n options: CreateDriverOptions = {},\n): Driver {\n const choice = options.driver ?? \"auto\";\n\n if (choice === \"better-sqlite3\") {\n const mod = loadBetterSqlite3();\n if (!mod) {\n throw new MonliteError(\n `driver \"better-sqlite3\" was requested but the package is not installed. ` +\n `Run \\`npm install better-sqlite3\\`.`,\n );\n }\n return new BetterSqlite3Driver(mod, filename, options);\n }\n\n if (choice === \"node:sqlite\") {\n const mod = loadNodeSqlite();\n if (!mod) {\n throw new MonliteError(\n `driver \"node:sqlite\" is unavailable. It requires Node >= 22.5.`,\n );\n }\n return new NodeSqliteDriver(mod, filename, options);\n }\n\n // auto: prefer better-sqlite3 (stable, all Node versions), else node:sqlite.\n const better = loadBetterSqlite3();\n if (better) return new BetterSqlite3Driver(better, filename, options);\n\n const node = loadNodeSqlite();\n if (node) return new NodeSqliteDriver(node, filename, options);\n\n throw new MonliteError(\n `No SQLite driver available. Either install better-sqlite3 ` +\n `(\\`npm install better-sqlite3\\`) or run on Node >= 22.5 for the ` +\n `built-in node:sqlite backend.`,\n );\n}\n","import type { Doc, MonliteOptions } from \"./types.js\";\nimport { Collection } from \"./collection.js\";\nimport { AutoIndexer } from \"./auto-index.js\";\nimport { MonliteError } from \"./errors.js\";\nimport { bindable } from \"./query/sql.js\";\nimport { createDriver } from \"./driver/index.js\";\nimport type { Driver } from \"./driver/types.js\";\n\nfunction validateName(name: string): void {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new MonliteError(\n `Invalid collection name \"${name}\". Names must start with a letter or ` +\n `underscore and contain only letters, digits and underscores.`,\n );\n }\n}\n\nfunction buildTagged(\n strings: TemplateStringsArray,\n values: any[],\n): { sql: string; params: any[] } {\n let sql = \"\";\n const params: any[] = [];\n strings.forEach((part, i) => {\n sql += part;\n if (i < values.length) {\n sql += \"?\";\n params.push(bindable(values[i]));\n }\n });\n return { sql, params };\n}\n\n/**\n * A monlite database — a thin document layer over a single SQLite file.\n * Create one with {@link createDb}.\n */\nexport class Monlite {\n /** @internal The active SQLite driver. */\n readonly driver: Driver;\n /** @internal */\n readonly autoIndexer: AutoIndexer;\n\n private readonly collections = new Map<string, Collection<any>>();\n private closed = false;\n\n constructor(filename: string, options: MonliteOptions = {}) {\n this.driver = createDriver(filename, {\n driver: options.driver,\n readonly: options.readonly,\n wal: options.wal,\n verbose: options.verbose,\n });\n\n this.autoIndexer = new AutoIndexer(\n this.driver,\n options.autoIndex ?? true,\n options.autoIndexAfter ?? 10,\n );\n }\n\n /** The underlying native database handle (escape hatch). */\n get sqlite(): any {\n return this.driver.raw;\n }\n\n /** Name of the active backend: `\"better-sqlite3\"` or `\"node:sqlite\"`. */\n get driverName(): string {\n return this.driver.name;\n }\n\n /** Get (or lazily create) a typed collection handle. */\n collection<T = Doc>(name: string): Collection<T> {\n this.assertOpen();\n validateName(name);\n let col = this.collections.get(name);\n if (!col) {\n col = new Collection<T>(this, name);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\n }\n\n /** Tagged-template SQL query returning rows. Values are safely parameterized. */\n $queryRaw<R = any>(strings: TemplateStringsArray, ...values: any[]): Promise<R[]> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.driver.prepare(sql).all(...params) as R[]);\n }\n\n /** Like {@link $queryRaw} but takes a raw SQL string and positional params. */\n $queryRawUnsafe<R = any>(sql: string, ...params: any[]): Promise<R[]> {\n this.assertOpen();\n return Promise.resolve(\n this.driver.prepare(sql).all(...params.map(bindable)) as R[],\n );\n }\n\n /** Tagged-template SQL statement returning the number of affected rows. */\n $executeRaw(strings: TemplateStringsArray, ...values: any[]): Promise<number> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.driver.prepare(sql).run(...params).changes);\n }\n\n /** Like {@link $executeRaw} but takes a raw SQL string and positional params. */\n $executeRawUnsafe(sql: string, ...params: any[]): Promise<number> {\n this.assertOpen();\n return Promise.resolve(\n this.driver.prepare(sql).run(...params.map(bindable)).changes,\n );\n }\n\n /**\n * Run a function inside a synchronous SQLite transaction. If it throws, the\n * transaction is rolled back.\n */\n async $transaction<R>(fn: (db: this) => R): Promise<R> {\n this.assertOpen();\n // Transactions are synchronous; `fn` must not be async. A throw inside\n // rolls back and (being in an async method) rejects this promise.\n return this.driver.transaction(() => fn(this));\n }\n\n /** List all collection (table) names. */\n $collections(): Promise<string[]> {\n this.assertOpen();\n const rows = this.driver\n .prepare(\n `SELECT name FROM sqlite_master\n WHERE type='table' AND name NOT LIKE 'sqlite_%'\n ORDER BY name`,\n )\n .all() as Array<{ name: string }>;\n return Promise.resolve(rows.map((r) => r.name));\n }\n\n /** Drop a collection and all of its data. */\n $drop(name: string): Promise<void> {\n this.assertOpen();\n validateName(name);\n this.driver.exec(`DROP TABLE IF EXISTS \"${name}\"`);\n this.collections.delete(name);\n this.autoIndexer.reset(name);\n return Promise.resolve();\n }\n\n /** Drop every collection in the database. */\n async $dropAll(): Promise<void> {\n for (const name of await this.$collections()) await this.$drop(name);\n }\n\n /** Close the underlying SQLite connection. */\n $disconnect(): Promise<void> {\n if (!this.closed) {\n this.closed = true;\n this.driver.close();\n }\n return Promise.resolve();\n }\n\n private assertOpen(): void {\n if (this.closed) throw new MonliteError(\"Database connection is closed\");\n }\n}\n\n/**\n * Open (or create) a monlite database backed by a single SQLite file.\n * Use `\":memory:\"` for an in-memory database.\n */\nexport function createDb(filename: string, options?: MonliteOptions): Monlite {\n return new Monlite(filename, options);\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { Database } from 'better-sqlite3';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* Public type surface for monlite.
|
|
5
3
|
*
|
|
@@ -145,7 +143,13 @@ interface GroupByArgs<T = Doc> {
|
|
|
145
143
|
take?: number;
|
|
146
144
|
}
|
|
147
145
|
type GroupByResult = Record<string, any>;
|
|
146
|
+
type DriverName = "auto" | "better-sqlite3" | "node:sqlite";
|
|
148
147
|
interface MonliteOptions {
|
|
148
|
+
/**
|
|
149
|
+
* Which SQLite backend to use. `"auto"` (default) prefers `better-sqlite3`
|
|
150
|
+
* when installed, otherwise the built-in `node:sqlite` (Node >= 22.5).
|
|
151
|
+
*/
|
|
152
|
+
driver?: DriverName;
|
|
149
153
|
/** Auto-create indexes on frequently-queried JSON paths. Default `true`. */
|
|
150
154
|
autoIndex?: boolean;
|
|
151
155
|
/** Number of times a path must be queried before an index is created. Default `10`. */
|
|
@@ -195,6 +199,32 @@ declare class Collection<T = Doc> {
|
|
|
195
199
|
groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]>;
|
|
196
200
|
}
|
|
197
201
|
|
|
202
|
+
/**
|
|
203
|
+
* The minimal SQLite driver surface monlite needs. Implemented by both the
|
|
204
|
+
* better-sqlite3 and the built-in node:sqlite backends so the rest of the
|
|
205
|
+
* codebase is engine-agnostic.
|
|
206
|
+
*/
|
|
207
|
+
interface RunResult {
|
|
208
|
+
changes: number;
|
|
209
|
+
lastInsertRowid: number | bigint;
|
|
210
|
+
}
|
|
211
|
+
interface PreparedStatement {
|
|
212
|
+
run(...params: any[]): RunResult;
|
|
213
|
+
get(...params: any[]): any;
|
|
214
|
+
all(...params: any[]): any[];
|
|
215
|
+
}
|
|
216
|
+
interface Driver {
|
|
217
|
+
/** Backend identifier, e.g. "better-sqlite3" or "node:sqlite". */
|
|
218
|
+
readonly name: string;
|
|
219
|
+
exec(sql: string): void;
|
|
220
|
+
prepare(sql: string): PreparedStatement;
|
|
221
|
+
/** Run `fn` inside a transaction; rolls back and rethrows if it throws. */
|
|
222
|
+
transaction<T>(fn: () => T): T;
|
|
223
|
+
close(): void;
|
|
224
|
+
/** The underlying native handle (better-sqlite3 Database / node:sqlite DatabaseSync). */
|
|
225
|
+
readonly raw: any;
|
|
226
|
+
}
|
|
227
|
+
|
|
198
228
|
/**
|
|
199
229
|
* Tracks which JSON paths are queried per collection and silently creates a
|
|
200
230
|
* SQLite expression index once a path crosses the configured threshold.
|
|
@@ -205,7 +235,7 @@ declare class AutoIndexer {
|
|
|
205
235
|
private readonly threshold;
|
|
206
236
|
private counts;
|
|
207
237
|
private created;
|
|
208
|
-
constructor(db:
|
|
238
|
+
constructor(db: Driver, enabled: boolean, threshold: number);
|
|
209
239
|
track(collection: string, path: string): void;
|
|
210
240
|
private create;
|
|
211
241
|
/** Forget tracking for a collection (or everything when omitted). */
|
|
@@ -217,13 +247,17 @@ declare class AutoIndexer {
|
|
|
217
247
|
* Create one with {@link createDb}.
|
|
218
248
|
*/
|
|
219
249
|
declare class Monlite {
|
|
220
|
-
/** The
|
|
221
|
-
readonly
|
|
250
|
+
/** @internal The active SQLite driver. */
|
|
251
|
+
readonly driver: Driver;
|
|
222
252
|
/** @internal */
|
|
223
253
|
readonly autoIndexer: AutoIndexer;
|
|
224
254
|
private readonly collections;
|
|
225
255
|
private closed;
|
|
226
256
|
constructor(filename: string, options?: MonliteOptions);
|
|
257
|
+
/** The underlying native database handle (escape hatch). */
|
|
258
|
+
get sqlite(): any;
|
|
259
|
+
/** Name of the active backend: `"better-sqlite3"` or `"node:sqlite"`. */
|
|
260
|
+
get driverName(): string;
|
|
227
261
|
/** Get (or lazily create) a typed collection handle. */
|
|
228
262
|
collection<T = Doc>(name: string): Collection<T>;
|
|
229
263
|
/** Tagged-template SQL query returning rows. Values are safely parameterized. */
|
|
@@ -268,4 +302,4 @@ declare function objectId(): string;
|
|
|
268
302
|
/** True when a value looks like a monlite/ObjectId id (24 hex chars). */
|
|
269
303
|
declare function isObjectId(value: unknown): value is string;
|
|
270
304
|
|
|
271
|
-
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
|
305
|
+
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type Driver, type DriverName, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type PreparedStatement, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { Database } from 'better-sqlite3';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* Public type surface for monlite.
|
|
5
3
|
*
|
|
@@ -145,7 +143,13 @@ interface GroupByArgs<T = Doc> {
|
|
|
145
143
|
take?: number;
|
|
146
144
|
}
|
|
147
145
|
type GroupByResult = Record<string, any>;
|
|
146
|
+
type DriverName = "auto" | "better-sqlite3" | "node:sqlite";
|
|
148
147
|
interface MonliteOptions {
|
|
148
|
+
/**
|
|
149
|
+
* Which SQLite backend to use. `"auto"` (default) prefers `better-sqlite3`
|
|
150
|
+
* when installed, otherwise the built-in `node:sqlite` (Node >= 22.5).
|
|
151
|
+
*/
|
|
152
|
+
driver?: DriverName;
|
|
149
153
|
/** Auto-create indexes on frequently-queried JSON paths. Default `true`. */
|
|
150
154
|
autoIndex?: boolean;
|
|
151
155
|
/** Number of times a path must be queried before an index is created. Default `10`. */
|
|
@@ -195,6 +199,32 @@ declare class Collection<T = Doc> {
|
|
|
195
199
|
groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]>;
|
|
196
200
|
}
|
|
197
201
|
|
|
202
|
+
/**
|
|
203
|
+
* The minimal SQLite driver surface monlite needs. Implemented by both the
|
|
204
|
+
* better-sqlite3 and the built-in node:sqlite backends so the rest of the
|
|
205
|
+
* codebase is engine-agnostic.
|
|
206
|
+
*/
|
|
207
|
+
interface RunResult {
|
|
208
|
+
changes: number;
|
|
209
|
+
lastInsertRowid: number | bigint;
|
|
210
|
+
}
|
|
211
|
+
interface PreparedStatement {
|
|
212
|
+
run(...params: any[]): RunResult;
|
|
213
|
+
get(...params: any[]): any;
|
|
214
|
+
all(...params: any[]): any[];
|
|
215
|
+
}
|
|
216
|
+
interface Driver {
|
|
217
|
+
/** Backend identifier, e.g. "better-sqlite3" or "node:sqlite". */
|
|
218
|
+
readonly name: string;
|
|
219
|
+
exec(sql: string): void;
|
|
220
|
+
prepare(sql: string): PreparedStatement;
|
|
221
|
+
/** Run `fn` inside a transaction; rolls back and rethrows if it throws. */
|
|
222
|
+
transaction<T>(fn: () => T): T;
|
|
223
|
+
close(): void;
|
|
224
|
+
/** The underlying native handle (better-sqlite3 Database / node:sqlite DatabaseSync). */
|
|
225
|
+
readonly raw: any;
|
|
226
|
+
}
|
|
227
|
+
|
|
198
228
|
/**
|
|
199
229
|
* Tracks which JSON paths are queried per collection and silently creates a
|
|
200
230
|
* SQLite expression index once a path crosses the configured threshold.
|
|
@@ -205,7 +235,7 @@ declare class AutoIndexer {
|
|
|
205
235
|
private readonly threshold;
|
|
206
236
|
private counts;
|
|
207
237
|
private created;
|
|
208
|
-
constructor(db:
|
|
238
|
+
constructor(db: Driver, enabled: boolean, threshold: number);
|
|
209
239
|
track(collection: string, path: string): void;
|
|
210
240
|
private create;
|
|
211
241
|
/** Forget tracking for a collection (or everything when omitted). */
|
|
@@ -217,13 +247,17 @@ declare class AutoIndexer {
|
|
|
217
247
|
* Create one with {@link createDb}.
|
|
218
248
|
*/
|
|
219
249
|
declare class Monlite {
|
|
220
|
-
/** The
|
|
221
|
-
readonly
|
|
250
|
+
/** @internal The active SQLite driver. */
|
|
251
|
+
readonly driver: Driver;
|
|
222
252
|
/** @internal */
|
|
223
253
|
readonly autoIndexer: AutoIndexer;
|
|
224
254
|
private readonly collections;
|
|
225
255
|
private closed;
|
|
226
256
|
constructor(filename: string, options?: MonliteOptions);
|
|
257
|
+
/** The underlying native database handle (escape hatch). */
|
|
258
|
+
get sqlite(): any;
|
|
259
|
+
/** Name of the active backend: `"better-sqlite3"` or `"node:sqlite"`. */
|
|
260
|
+
get driverName(): string;
|
|
227
261
|
/** Get (or lazily create) a typed collection handle. */
|
|
228
262
|
collection<T = Doc>(name: string): Collection<T>;
|
|
229
263
|
/** Tagged-template SQL query returning rows. Values are safely parameterized. */
|
|
@@ -268,4 +302,4 @@ declare function objectId(): string;
|
|
|
268
302
|
/** True when a value looks like a monlite/ObjectId id (24 hex chars). */
|
|
269
303
|
declare function isObjectId(value: unknown): value is string;
|
|
270
304
|
|
|
271
|
-
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
|
305
|
+
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type Driver, type DriverName, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type PreparedStatement, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|