couchset 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +177 -2
  2. package/dist/database.d.ts +6 -0
  3. package/dist/database.js +51 -2
  4. package/dist/database.js.map +1 -1
  5. package/dist/eventing.d.ts +179 -0
  6. package/dist/eventing.js +822 -0
  7. package/dist/eventing.js.map +1 -0
  8. package/dist/model/include.d.ts +36 -3
  9. package/dist/model/include.js +154 -49
  10. package/dist/model/include.js.map +1 -1
  11. package/dist/model/index.d.ts +4 -1
  12. package/dist/model/index.js +8 -1
  13. package/dist/model/index.js.map +1 -1
  14. package/dist/model/read-helpers.d.ts +6 -2
  15. package/dist/model/read-helpers.js +96 -23
  16. package/dist/model/read-helpers.js.map +1 -1
  17. package/dist/model/read-types.d.ts +51 -0
  18. package/dist/model/read-types.js +3 -0
  19. package/dist/model/read-types.js.map +1 -0
  20. package/dist/model/safe-query.d.ts +3 -0
  21. package/dist/model/safe-query.js +22 -2
  22. package/dist/model/safe-query.js.map +1 -1
  23. package/dist/next.d.ts +20 -2
  24. package/dist/next.js +26 -1
  25. package/dist/next.js.map +1 -1
  26. package/dist/next.types.js +149 -1
  27. package/dist/next.types.js.map +1 -1
  28. package/dist/pagination/pagination.js +3 -1
  29. package/dist/pagination/pagination.js.map +1 -1
  30. package/dist/pagination/types.d.ts +2 -0
  31. package/dist/pagination/types.js.map +1 -1
  32. package/dist/search/customQuery.d.ts +2 -0
  33. package/dist/search/customQuery.js +4 -1
  34. package/dist/search/customQuery.js.map +1 -1
  35. package/docs/beta-migration.md +1 -1
  36. package/docs/document-modeling.md +5 -1
  37. package/docs/joins-and-consistency.md +228 -0
  38. package/docs/next-primitives.md +37 -0
  39. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventing.js","sourceRoot":"","sources":["../src/eventing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2HA,IAAM,iBAAiB,GACnB,8EAA8E,CAAC;AAEnF,IAAM,WAAW,GAAG,cAAsB,OAAA,CAAC;IACvC,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;CACd,CAAC,EAVwC,CAUxC,CAAC;AAEH,IAAM,iBAAiB,GAAG,UAAC,QAA0B,IAAiC,OAAA,CAAC;IACnF,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU;IAC7C,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,UAAU;CACtC,CAAC,EAJoF,CAIpF,CAAC;AAEH,IAAM,cAAc,GAAG,UAAC,IAAsB,EAAE,KAAuB;IACnE,IAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEjD,OAAO,CACH,cAAc,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;QAChD,cAAc,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK;QAC9C,cAAc,CAAC,UAAU,KAAK,eAAe,CAAC,UAAU,CAC3D,CAAC;AACN,CAAC,CAAC;AAEF,IAAM,gBAAgB,GAAG,UAAC,QAA0B,EAAE,KAAa;IAC/D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,UAAG,KAAK,iCAA8B,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAC,KAAU;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED,IAAM,UAAU,GAAQ,EAAE,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACb,IAAI,EAAE;SACN,OAAO,CAAC,UAAC,GAAG;QACT,IAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3B,CAAC;IACL,CAAC,CAAC,CAAC;IACP,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,IAAM,KAAK,GAAG,UAAC,IAAS,EAAE,KAAU;IAChC,OAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAAxE,CAAwE,CAAC;AAE7E,IAAM,aAAa,GAAG,UAClB,IAA8C,EAC9C,OAAsD;IAEtD,IAAM,SAAS,GAAG,OAAO,IAAI,EAAE,CAAC;IAChC,IAAM,cAAc,GAAQ,EAAE,CAAC;IAE/B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;QAC/B,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YAC3D,cAAc,CAAC,GAAG,CAAC,GAAI,IAAY,aAAZ,IAAI,uBAAJ,IAAI,CAAW,GAAG,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAM,iBAAiB,GAAQ,EAAE,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;QAC/B,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YAC3D,iBAAiB,CAAC,GAAG,CAAC,GAAI,SAAiB,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,IAAM,YAAY,GAAG,UACjB,KAAwC,EACxC,kBAAoC;;IAEpC,IAAM,MAAM,GAAG,CAAC,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,MAAM,KAAI,EAAE,CAAC;IAC5C,IAAM,gBAAgB,GAClB,CAAC,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,gBAAgB;SAChC,MAAC,kBAAkB,CAAC,QAAgB,0CAAE,gBAAgB,CAAA;QACtD,EAAE,CAAC;IACP,IAAM,gBAAgB,GAClB,CAAC,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,gBAAgB;SAChC,MAAC,kBAAkB,CAAC,QAAgB,0CAAE,gBAAgB,CAAA;QACtD,EAAE,CAAC;IAEP,OAAO;QACH,QAAQ,EAAE,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,QAAQ,IAAI,gBAAgB,KAAK,UAAU;QACzF,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,gBAAgB,KAAK,QAAQ;QAC5D,YAAY,EACR,MAAM,KAAK,WAAW;YACtB,MAAM,KAAK,aAAa;YACxB,MAAM,KAAK,SAAS;YACpB,gBAAgB,KAAK,WAAW;YAChC,gBAAgB,KAAK,aAAa;KACzC,CAAC;AACN,CAAC,CAAC;AAEF,IAAM,GAAG,GAAG,UAAC,MAAW,EAAE,GAAW;IACjC,OAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAAjD,CAAiD,CAAC;AAEtD;;;GAGG;AACH;IASI,kBAAY,MAAkC,EAAE,OAAwB;QAAxE,iBAwBC;QAhCgB,sBAAiB,GAAG,IAAI,GAAG,EAA8B,CAAC;QASvE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC1E,CAAC;QACD,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;QACxE,IACI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU;YACpC,OAAO,CAAC,gBAAgB,CAAC,UAAU,KAAK,UAAU,EACpD,CAAC;YACC,MAAM,IAAI,KAAK,CACX,mHAAmH,CACtH,CAAC;QACN,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,wBAAwB,gBAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACjF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC5F,IAAI,CAAC,MAAM,GAAG,UAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,OAAI,CAAC;QAE9C,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,UAAU;YAChE,OAAA,KAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAzB,CAAyB,CAC5B,CAAC;IACN,CAAC;IAGD,sBAAW,+BAAS;QADpB,wEAAwE;aACxE;YACI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;;;OAAA;IAED,0EAA0E;IACnE,8BAAW,GAAlB;QACI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,UAAU,IAAK,OAAA,cAAK,UAAU,EAAE,EAAjB,CAAiB,CAAC,CAAC;IAC9F,CAAC;IAED,4EAA4E;IACrE,+BAAY,GAAnB,UAAoB,IAAY;QAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,UAAG,IAAI,CAAC,MAAM,SAAG,IAAI,CAAE,CAAC;IACnC,CAAC;IAED,2EAA2E;IACpE,2BAAQ,GAAf,UAAgB,UAA8B;QAC1C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,eAAM,UAAU,EAAE,CAAC;QAC7D,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,8EAA8E;IACvE,yBAAM,GAAb,UAAc,UAA8B;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAOY,wBAAK,GAAlB;4DACI,mBAA+D,EAC/D,eAA0C;;;;YAA1C,gCAAA,EAAA,oBAA0C;;;;wBAEpC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;wBACnF,OAAO,GAAG,OAAO;4BACnB,CAAC,CAAC,eAAe;4BACjB,CAAC,CAAE,mBAA4C,IAAI,EAAE,CAAC;wBACpD,MAAM,GAAG,WAAW,EAAE,CAAC;wBACb,qBAAM,IAAI,CAAC,OAAO,EAAE,EAAA;;wBAA9B,OAAO,GAAG,SAAoB;wBAEpC,IAAI,OAAO,EAAE,CAAC;4BACV,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;wBAC3B,CAAC;wBAEY,qBAAM,OAAO,CAAC,eAAe,EAAE,EAAA;;wBAAtC,IAAI,GAAG,SAA+B;wBAC7B,qBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA;;wBAAnC,MAAM,GAAG,SAA0B;wBACnC,YAAY,GAAG,IAAI,GAAG,EAAiC,CAAC;wBAC9D,MAAM,CAAC,OAAO,CAAC,UAAC,KAAK,IAAK,OAAA,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAnC,CAAmC,CAAC,CAAC;wBACzD,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;wBACvD,IAAI,CAAC,OAAO,CAAC,UAAC,kBAAkB;4BAC5B,OAAA,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC;wBAA3D,CAA2D,CAC9D,CAAC;wBAEI,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;;;;wBAChC,YAAA,SAAA,OAAO,CAAA;;;;wBAArB,UAAU;wBACjB,qBAAM,IAAI,CAAC,SAAS,CAChB,OAAO,EACP,UAAU,EACV,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAClD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EACpD,OAAO,EACP,MAAM,CACT,EAAA;;wBAPD,SAOC,CAAC;;;;;;;;;;;;;;;;;6BAIF,CAAC,OAAO,EAAR,yBAAQ;wBACF,aAAW,IAAI,GAAG,EAAU,CAAC;wBACnC,OAAO,CAAC,OAAO,CAAC,UAAC,UAAU,IAAK,OAAA,UAAQ,CAAC,GAAG,CAAC,KAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAhD,CAAgD,CAAC,CAAC;;;;wBACjD,SAAA,SAAA,IAAI,CAAA;;;;wBAA1B,kBAAkB;6BACrB,CAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA,EAA5E,yBAA4E;wBAC5E,qBAAM,IAAI,CAAC,KAAK,CACZ,OAAO,EACP,kBAAkB,EAClB,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,EACzC,MAAM,CACT,EAAA;;wBALD,SAKC,CAAC;;;;;;;;;;;;;;;;6BAKd,sBAAO,MAAM,EAAC;;;;KACjB;IAED,kEAAkE;IACrD,wBAAK,GAAlB,UAAmB,IAAY;;;;;;wBACrB,MAAM,GAAG,WAAW,EAAE,CAAC;wBACvB,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;wBAC7B,qBAAM,IAAI,CAAC,OAAO,EAAE,EAAA;;wBAA9B,OAAO,GAAG,SAAoB;wBACvB,qBAAM,OAAO,CAAC,eAAe,EAAE,EAAA;;wBAAtC,IAAI,GAAG,SAA+B;wBACtC,OAAO,GAAG,IAAI,CAAC,MAAM,CACvB,UAAC,kBAAkB,IAAK,OAAA,kBAAkB,CAAC,IAAI,KAAK,YAAY,EAAxC,CAAwC,CACnE,CAAC,CAAC,CAAC,CAAC;wBAEL,IAAI,CAAC,OAAO,EAAE,CAAC;4BACX,IAAI,CAAC,MAAM,CACP,MAAM,EACN,IAAI,CAAC,OAAO,CACR,WAAW,EACX,IAAI,EACJ,CAAC,WAAW,CAAC,EACb,6DAA6D,CAChE,CACJ,CAAC;4BACF,sBAAO,MAAM,EAAC;wBAClB,CAAC;wBAEc,qBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA;;wBAAnC,MAAM,GAAG,SAA0B;wBACnC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,KAAK,YAAY,EAA1B,CAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnD,qBAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EAAA;;wBAA7E,SAAS,GAAG,SAAiE;wBAEnF,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;4BAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;4BACpE,sBAAO,MAAM,EAAC;wBAClB,CAAC;wBAED,qBAAM,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,EAAA;;wBAAzC,SAAyC,CAAC;wBAC1C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAA;;wBAA5D,SAA4D,CAAC;wBAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBAC9D,sBAAO,MAAM,EAAC;;;;KACjB;IAED;;;OAGG;IACU,yBAAM,GAAnB,UAAoB,IAAY;;;;;;wBACtB,MAAM,GAAG,WAAW,EAAE,CAAC;wBACvB,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;wBAC7B,qBAAM,IAAI,CAAC,OAAO,EAAE,EAAA;;wBAA9B,OAAO,GAAG,SAAoB;wBACvB,qBAAM,OAAO,CAAC,eAAe,EAAE,EAAA;;wBAAtC,IAAI,GAAG,SAA+B;wBACtC,OAAO,GAAG,IAAI,CAAC,MAAM,CACvB,UAAC,kBAAkB,IAAK,OAAA,kBAAkB,CAAC,IAAI,KAAK,YAAY,EAAxC,CAAwC,CACnE,CAAC,CAAC,CAAC,CAAC;wBAEL,IAAI,CAAC,OAAO,EAAE,CAAC;4BACX,IAAI,CAAC,MAAM,CACP,MAAM,EACN,IAAI,CAAC,OAAO,CACR,WAAW,EACX,IAAI,EACJ,CAAC,WAAW,CAAC,EACb,6DAA6D,CAChE,CACJ,CAAC;4BACF,sBAAO,MAAM,EAAC;wBAClB,CAAC;wBAEc,qBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA;;wBAAnC,MAAM,GAAG,SAA0B;wBACnC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,KAAK,YAAY,EAA1B,CAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnD,qBAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EAAA;;wBAA7E,SAAS,GAAG,SAAiE;6BAE/E,SAAS,CAAC,QAAQ,EAAlB,wBAAkB;wBAClB,qBAAM,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAA;;wBAA5C,SAA4C,CAAC;wBAC7C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,EAAA;;wBAAhE,SAAgE,CAAC;;4BAErE,qBAAM,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,EAAA;;wBAAxC,SAAwC,CAAC;wBACzC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACpC,IAAI,CAAC,MAAM,CACP,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,QAAQ,CAAC,CACpF,CAAC;wBACF,sBAAO,MAAM,EAAC;;;;KACjB;IAEa,4BAAS,GAAvB,UACI,OAAoC,EACpC,UAA8B,EAC9B,OAAqC,EACrC,KAAwC,EACxC,OAA6B,EAC7B,MAAsB;;;;;;wBAEhB,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;wBAClD,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;6BAE3C,CAAC,OAAO,EAAR,wBAAQ;wBACR,qBAAM,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAA;;wBAArC,SAAqC,CAAC;wBACtC,qBAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;wBAC3C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAA9D,SAA8D,CAAC;wBAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;wBAC3E,sBAAO;4BAGO,qBAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EAAA;;wBAA7E,SAAS,GAAG,SAAiE;wBAC7E,eAAe,GACjB,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC;4BAC/D,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;6BAEpE,eAAe,EAAf,yBAAe;wBACf,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;4BACzB,IAAI,CAAC,MAAM,CACP,MAAM,EACN,IAAI,CAAC,OAAO,CACR,mBAAmB,EACnB,UAAU,CAAC,IAAI,EACf,CAAC,mBAAmB,CAAC,EACrB,UAAG,iBAAiB,6EAA0E,CACjG,CACJ,CAAC;4BACF,sBAAO;wBACX,CAAC;6BAEG,SAAS,CAAC,QAAQ,EAAlB,wBAAkB;wBAClB,qBAAM,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAA;;wBAA5C,SAA4C,CAAC;wBAC7C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,EAAA;;wBAAhE,SAAgE,CAAC;;4BAErE,qBAAM,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAA;;wBAArC,SAAqC,CAAC;wBACtC,qBAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;wBAC3C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAA9D,SAA8D,CAAC;wBAC/D,IAAI,CAAC,MAAM,CACP,MAAM,EACN,IAAI,CAAC,OAAO,CACR,SAAS,EACT,UAAU,CAAC,IAAI,EACf,CAAC,SAAS,CAAC,EACX,iBAAiB,EACjB,SAAS,CAAC,QAAQ,CACrB,CACJ,CAAC;wBACF,sBAAO;;6BAGP,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAA1C,yBAA0C;6BACtC,SAAS,CAAC,MAAM,EAAhB,yBAAgB;wBAChB,qBAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;wBAC3C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAA9D,SAA8D,CAAC;wBAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;;6BACpE,CAAC,SAAS,CAAC,QAAQ,EAAnB,yBAAmB;wBAC1B,qBAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;wBAC3C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAA9D,SAA8D,CAAC;wBAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;;wBAE3E,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;;6BAEnF,sBAAO;;wBAGL,OAAO,GAA4B,EAAE,CAAC;6BACxC,CAAA,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAA,EAAvC,yBAAuC;wBACvC,qBAAM,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,EAAA;;wBAAzC,SAAyC,CAAC;wBAC1C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAA;;wBAA5D,SAA4D,CAAC;wBAC7D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;6BAE3B,qBAAM,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAA;;wBAArC,SAAqC,CAAC;wBACtC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACxB,qBAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,EAAA;;wBAAvE,SAAuE,CAAC;wBACxE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;;;;;KAC1E;IAEa,wBAAK,GAAnB,UACI,OAAoC,EACpC,kBAAoC,EACpC,KAAwC,EACxC,MAAsB;;;;;4BAEJ,qBAAM,IAAI,CAAC,eAAe,CACxC,OAAO,EACP,kBAAkB,CAAC,IAAI,EACvB,kBAAkB,EAClB,KAAK,CACR,EAAA;;wBALK,SAAS,GAAG,SAKjB;6BACG,SAAS,CAAC,QAAQ,EAAlB,wBAAkB;wBAClB,qBAAM,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAA;;wBAAvD,SAAuD,CAAC;wBACxD,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,EAAA;;wBAA3E,SAA2E,CAAC;;4BAEhF,qBAAM,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAA;;wBAAnD,SAAmD,CAAC;wBACpD,IAAI,CAAC,MAAM,CACP,MAAM,EACN,IAAI,CAAC,OAAO,CACR,QAAQ,EACR,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,EACzC,CAAC,QAAQ,CAAC,EACV,iBAAiB,EACjB,SAAS,CAAC,QAAQ,CACrB,CACJ,CAAC;;;;;KACL;IAEO,0BAAO,GAAf,UACI,OAAyB,EACzB,OAAyB,EACzB,UAA8B;QAE9B,OAAO,CACH,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;YAC7B,CAAC,UAAU,CAAC,aAAa,KAAK,SAAS;gBACnC,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC;YACpD,KAAK,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;YACjE,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YAC3D,KAAK,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;YACrE,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CACvD,CAAC;IACN,CAAC;IAEO,gCAAa,GAArB,UAAsB,UAA8B;QAChD,IAAM,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpE,IAAM,cAAc,GAAG,iBAAiB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACpE,IAAM,QAAQ,gBAAY,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAEvD,oFAAoF;QACpF,OAAO,QAAQ,CAAC,gBAAgB,CAAC;QACjC,OAAO,QAAQ,CAAC,gBAAgB,CAAC;QAEjC,OAAO;YACH,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI,EAAE;YAC/C,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,IAAI,EAAE;YACnD,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,gBAAgB,kBAAA;YAChB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;YACxC,QAAQ,UAAA;YACR,cAAc,gBAAA;YACd,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;SACxB,CAAC;IAC1B,CAAC;IAEO,mCAAgB,GAAxB;QACI,yEAAyE;QACzE,4EAA4E;QAC5E,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAEa,0BAAO,GAArB;;;;;;wBACI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;4BACvB,sBAAO,IAAI,CAAC,eAAe,EAAC;wBAChC,CAAC;wBACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;4BACf,MAAM,IAAI,KAAK,CACX,4EAA4E,CAC/E,CAAC;wBACN,CAAC;wBAED,qBAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAA;;wBAAzB,SAAyB,CAAC;wBACpB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC;wBACpD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;4BAC9D,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;wBAC3F,CAAC;wBACD,sBAAO,OAAO,CAAC,iBAAiB,EAAiC,EAAC;;;;KACrE;IAEa,yBAAM,GAApB,UAAqB,OAAoC;;;;;4BACtC,qBAAM,OAAO,CAAC,eAAe,EAAE,EAAA;;wBAAxC,MAAM,GAAG,SAA+B;wBAC9C,sBAAO,MAAM,CAAC,SAAS,IAAI,EAAE,EAAC;;;;KACjC;IAED;;;;OAIG;IACW,mCAAgB,GAA9B,UACI,OAAoC,EACpC,YAAoB,EACpB,QAA8C;;;;;;;wBAExC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;;;6BAE/C,IAAI;wBACQ,qBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA;;wBAAnC,KAAK,GAAG,CAAC,SAA0B,CAAC,CAAC,MAAM,CAC7C,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,KAAK,YAAY,EAA1B,CAA0B,CACvC,CAAC,CAAC,CAAC;wBACE,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,EAAE,EAAqB,CAAC,CAAC;wBACpE,OAAO,GACT,CAAC,CAAC,KAAK;4BACP,CAAC,SAAS,CAAC,YAAY;4BACvB,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gCACjE,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC;gCACjE,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAE5D,IAAI,OAAO,EAAE,CAAC;4BACV,sBAAO;wBACX,CAAC;wBACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;4BACzB,MAAM,IAAI,KAAK,CACX,kDAA2C,YAAY,wBAAc,QAAQ,CAAE,CAClF,CAAC;wBACN,CAAC;wBACD,qBAAM,IAAI,OAAO,CAAO,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,KAAI,CAAC,uBAAuB,CAAC,EAAjD,CAAiD,CAAC,EAAA;;wBAAvF,SAAuF,CAAC;;;;;;KAE/F;IAED;;;;;OAKG;IACW,sCAAmB,GAAjC,UACI,OAAoC,EACpC,YAAoB,EACpB,kBAAoC,EACpC,OAAgC;;;;;4BAEd,qBAAM,IAAI,CAAC,sBAAsB,CAC/C,OAAO,EACP,YAAY,EACZ,kBAAkB,CACrB,EAAA;;wBAJK,SAAS,GAAG,SAIjB;6BAEG,CAAA,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAA,EAAtC,wBAAsC;wBACtC,qBAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;wBAC3C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAA9D,SAA8D,CAAC;wBAC/D,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;;6BACjB,CAAC,SAAS,CAAC,QAAQ,EAAnB,wBAAmB;wBAC1B,qBAAM,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;wBAC3C,qBAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAA9D,SAA8D,CAAC;wBAC/D,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;;;;;KAE/B;IAED;;;;OAIG;IACW,kCAAe,GAA7B,UACI,OAAoC,EACpC,YAAoB,EACpB,kBAAoC,EACpC,YAA+C;;;;;;;wBAE/C,IAAI,YAAY,EAAE,CAAC;4BACT,SAAS,GAAG,YAAY,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;4BACjE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;4BAC3C,sBAAO,SAAS,EAAC;wBACrB,CAAC;wBAEK,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;;;6BAC/C,IAAI;wBACQ,qBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA;;wBAAnC,KAAK,GAAG,CAAC,SAA0B,CAAC,CAAC,MAAM,CAC7C,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,KAAK,YAAY,EAA1B,CAA0B,CACvC,CAAC,CAAC,CAAC;wBACJ,IAAI,KAAK,EAAE,CAAC;4BACF,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;4BAC1D,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;4BAC3C,sBAAO,SAAS,EAAC;wBACrB,CAAC;wBACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;4BACzB,MAAM,IAAI,KAAK,CACX,6DAAsD,YAAY,CAAE,CACvE,CAAC;wBACN,CAAC;wBACD,qBAAM,IAAI,OAAO,CAAO,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,KAAI,CAAC,uBAAuB,CAAC,EAAjD,CAAiD,CAAC,EAAA;;wBAAvF,SAAuF,CAAC;;;;;;KAE/F;IAED,4EAA4E;IAC9D,yCAAsB,GAApC,UACI,OAAoC,EACpC,YAAoB,EACpB,kBAAoC;;;;;;;wBAE9B,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;;;6BAE/C,IAAI;wBACQ,qBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAA;;wBAAnC,KAAK,GAAG,CAAC,SAA0B,CAAC,CAAC,MAAM,CAC7C,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,KAAK,YAAY,EAA1B,CAA0B,CACvC,CAAC,CAAC,CAAC;wBACJ,IAAI,KAAK,EAAE,CAAC;4BACF,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;4BAC1D,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;gCAC1B,sBAAO,SAAS,EAAC;4BACrB,CAAC;wBACL,CAAC;wBACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;4BACzB,MAAM,IAAI,KAAK,CACX,kDAA2C,YAAY,4BAAyB,CACnF,CAAC;wBACN,CAAC;wBACD,qBAAM,IAAI,OAAO,CAAO,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,KAAI,CAAC,uBAAuB,CAAC,EAAjD,CAAiD,CAAC,EAAA;;wBAAvF,SAAuF,CAAC;;;;;;KAE/F;IAEO,yBAAM,GAAd,UAAe,MAAsB,EAAE,OAAwB;QAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5E,OAAO,CAAC,OAAO,CAAC,UAAC,MAAM;YACnB,IAAM,IAAI,GACN,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAE,MAAc,CAAC,MAAM,CAAC,CAAC;YACvF,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,0BAAO,GAAf,UACI,MAA6B,EAC7B,IAAY,EACZ,OAAgC,EAChC,OAAgB,EAChB,cAAwB;QAExB,OAAO;YACH,MAAM,QAAA;YACN,OAAO,SAAA;YACP,OAAO,SAAA;YACP,IAAI,MAAA;YACJ,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACrC,cAAc,gBAAA;SACjB,CAAC;IACN,CAAC;IAEO,uBAAI,GAAZ,UAAa,IAAY;QACrB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC;IAEO,8BAAW,GAAnB,UAAoB,YAAoB;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACX,iEAA0D,IAAI,CAAC,SAAS,CAAE,CAC7E,CAAC;QACN,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEO,mCAAgB,GAAxB,UAAyB,UAA8B;QACnD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,8BAAuB,UAAU,CAAC,IAAI,2BAAwB,CAAC,CAAC;QACpF,CAAC;QACD,gBAAgB,CACZ,UAAU,CAAC,cAAc,EACzB,8BAAuB,UAAU,CAAC,IAAI,oBAAiB,CAC1D,CAAC;QACF,IAAI,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CACX,8BAAuB,UAAU,CAAC,IAAI,8EAA2E,CACpH,CAAC;QACN,CAAC;IACL,CAAC;IAEO,oCAAiB,GAAzB,UAA0B,IAAY;QAClC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC1F,CAAC;IACL,CAAC;IAEO,+BAAY,GAApB,UAAqB,YAAoB,EAAE,SAA4B;QACnE,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACX,4BAAqB,YAAY,0EAAuE,CAC3G,CAAC;QACN,CAAC;IACL,CAAC;IAEO,+BAAY,GAApB,UAAqB,KAAU;QAC3B,OAAO,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC/F,CAAC;IAEO,iCAAc,GAAtB,UAAuB,KAAyB,EAAE,QAAgB;QAC9D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,CAAC;IAEO,oCAAiB,GAAzB,UAA0B,KAAyB,EAAE,QAAgB;QACjE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtE,CAAC;IACL,eAAC;AAAD,CAAC,AAzlBD,IAylBC;AAzlBY,4BAAQ;AA2lBrB;;;GAGG;AACI,IAAM,cAAc,GAAG,UAAC,MAAsB,EAAE,OAAwB;IAC3E,OAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;AAA7B,CAA6B,CAAC;AADrB,QAAA,cAAc,kBACO;AAElC,mFAAmF;AAC5E,IAAM,yBAAyB,GAAG,UAAC,OAAwB;IAC9D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC;AALW,QAAA,yBAAyB,6BAKpC;AAEF,oFAAoF;AAC7E,IAAM,sBAAsB,GAAG,UAAC,UAA8B,IAAyB,OAAA,cACvF,UAAU,EACf,EAF4F,CAE5F,CAAC;AAFU,QAAA,sBAAsB,0BAEhC","sourcesContent":["import type {\n EventingFunction,\n EventingFunctionManager,\n EventingFunctionSettings,\n EventingFunctionState,\n} from 'couchbase';\n\n/** A Couchbase bucket/scope/collection used by an Eventing function. */\nexport interface EventingKeyspace {\n bucket: string;\n scope?: string;\n collection?: string;\n}\n\n/**\n * A declarative Eventing handler. `name` is logical: CouchSet derives the\n * physical Couchbase name from the Eventing namespace.\n */\nexport interface EventingDefinition {\n name: string;\n code: string;\n sourceKeyspace: EventingKeyspace;\n enforceSchema?: boolean;\n bucketBindings?: EventingFunction['bucketBindings'];\n urlBindings?: EventingFunction['urlBindings'];\n constantBindings?: EventingFunction['constantBindings'];\n settings?: Partial<EventingFunctionSettings>;\n}\n\nexport type EventingFunctionDefinition = EventingDefinition;\n\n/**\n * The metadata collection is used only by Couchbase Eventing for checkpoints\n * and timers. CouchSet never opens it as an application collection or writes\n * documents to it.\n */\nexport interface EventingOptions {\n /** Required ownership boundary for physical Couchbase function names. */\n namespace: string;\n /** A dedicated collection reserved for Couchbase Eventing metadata. */\n metadataKeyspace: EventingKeyspace;\n /** Definitions registered when the control plane is constructed. */\n definitions?: EventingDefinition[];\n /** Alias for definitions, useful for manifest-shaped configuration. */\n functions?: EventingDefinition[];\n /** Explicit SDK manager injection, primarily for tests or owned clusters. */\n manager?: EventingFunctionManagerLike;\n /** Maximum time to wait for Couchbase Eventing lifecycle convergence. */\n lifecycleTimeoutMs?: number;\n /** Delay between lifecycle status checks. Defaults to 250ms. */\n lifecyclePollIntervalMs?: number;\n}\n\nexport interface EventingApplyOptions {\n /**\n * Permit source or metadata keyspace changes. Couchbase must undeploy first,\n * which erases the function's timers and checkpoints.\n */\n allowRecreate?: boolean;\n}\n\nexport type EventingOutcomeAction =\n | 'created'\n | 'updated'\n | 'resumed'\n | 'unchanged'\n | 'pruned'\n | 'paused'\n | 'removed'\n | 'requires-recreate';\n\nexport interface EventingOutcome {\n action: EventingOutcomeAction;\n /** Lifecycle operations performed for this function, in order. */\n actions: EventingOutcomeAction[];\n name: string;\n physicalName: string;\n /** Present whenever undeploying can erase Eventing timers/checkpoints. */\n timerStateLost?: boolean;\n message?: string;\n}\n\n/**\n * Each status array contains the matching outcome, so callers can inspect a\n * report directly without parsing text. An update can also be in `paused` and\n * `resumed`, because that is the safe lifecycle used to perform the update.\n */\nexport interface EventingReport {\n outcomes: EventingOutcome[];\n created: EventingOutcome[];\n updated: EventingOutcome[];\n resumed: EventingOutcome[];\n unchanged: EventingOutcome[];\n pruned: EventingOutcome[];\n paused: EventingOutcome[];\n removed: EventingOutcome[];\n requiresRecreate: EventingOutcome[];\n}\n\n/** The portion of SDK 4.7's EventingFunctionManager used by CouchSet. */\nexport interface EventingFunctionManagerLike {\n upsertFunction(functionDefinition: EventingFunction): Promise<void>;\n dropFunction(name: string): Promise<void>;\n getAllFunctions(): Promise<EventingFunction[]>;\n deployFunction(name: string): Promise<void>;\n undeployFunction(name: string): Promise<void>;\n pauseFunction(name: string): Promise<void>;\n resumeFunction(name: string): Promise<void>;\n functionsStatus(): Promise<{functions: EventingFunctionState[]}>;\n}\n\n/** A minimal client shape that lets Eventing acquire the connected SDK cluster. */\nexport interface EventingClient {\n ready(): Promise<any>;\n getConnection(): {cluster: {eventingFunctions?: () => EventingFunctionManager}};\n}\n\ninterface FunctionLifecycle {\n deployed: boolean;\n paused: boolean;\n transitional: boolean;\n}\n\nconst timerStateWarning =\n 'Undeploying an Eventing function erases its Eventing timers and checkpoints.';\n\nconst emptyReport = (): EventingReport => ({\n created: [],\n outcomes: [],\n paused: [],\n pruned: [],\n removed: [],\n requiresRecreate: [],\n resumed: [],\n unchanged: [],\n updated: [],\n});\n\nconst normalizeKeyspace = (keyspace: EventingKeyspace): Required<EventingKeyspace> => ({\n bucket: keyspace.bucket,\n collection: keyspace.collection || '_default',\n scope: keyspace.scope || '_default',\n});\n\nconst keyspaceEquals = (left: EventingKeyspace, right: EventingKeyspace): boolean => {\n const normalizedLeft = normalizeKeyspace(left);\n const normalizedRight = normalizeKeyspace(right);\n\n return (\n normalizedLeft.bucket === normalizedRight.bucket &&\n normalizedLeft.scope === normalizedRight.scope &&\n normalizedLeft.collection === normalizedRight.collection\n );\n};\n\nconst requiredKeyspace = (keyspace: EventingKeyspace, label: string): void => {\n if (!keyspace || !keyspace.bucket) {\n throw new Error(`${label} requires a non-empty bucket`);\n }\n};\n\nconst stableValue = (value: any): any => {\n if (value === undefined) {\n return undefined;\n }\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(stableValue);\n }\n\n const normalized: any = {};\n Object.keys(value)\n .sort()\n .forEach((key) => {\n const item = stableValue(value[key]);\n if (item !== undefined) {\n normalized[key] = item;\n }\n });\n return normalized;\n};\n\nconst equal = (left: any, right: any): boolean =>\n JSON.stringify(stableValue(left)) === JSON.stringify(stableValue(right));\n\nconst settingsMatch = (\n live: EventingFunction['settings'] | undefined,\n desired: Partial<EventingFunctionSettings> | undefined\n): boolean => {\n const requested = desired || {};\n const comparableLive: any = {};\n\n Object.keys(requested).forEach((key) => {\n if (key !== 'deploymentStatus' && key !== 'processingStatus') {\n comparableLive[key] = (live as any)?.[key];\n }\n });\n\n const comparableDesired: any = {};\n Object.keys(requested).forEach((key) => {\n if (key !== 'deploymentStatus' && key !== 'processingStatus') {\n comparableDesired[key] = (requested as any)[key];\n }\n });\n\n return equal(comparableLive, comparableDesired);\n};\n\nconst lifecycleFor = (\n state: EventingFunctionState | undefined,\n functionDefinition: EventingFunction\n): FunctionLifecycle => {\n const status = (state as any)?.status || '';\n const deploymentStatus =\n (state as any)?.deploymentStatus ||\n (functionDefinition.settings as any)?.deploymentStatus ||\n '';\n const processingStatus =\n (state as any)?.processingStatus ||\n (functionDefinition.settings as any)?.processingStatus ||\n '';\n\n return {\n deployed: status === 'deployed' || status === 'paused' || deploymentStatus === 'deployed',\n paused: status === 'paused' || processingStatus === 'paused',\n transitional:\n status === 'deploying' ||\n status === 'undeploying' ||\n status === 'pausing' ||\n deploymentStatus === 'deploying' ||\n deploymentStatus === 'undeploying',\n };\n};\n\nconst own = (object: any, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(object, key);\n\n/**\n * Declarative Eventing reconciler backed by the SDK 4.7 EventingFunctionManager.\n * It only manages names starting with its namespace prefix.\n */\nexport class Eventing {\n private readonly definitionsByName = new Map<string, EventingDefinition>();\n private readonly eventingMetadataKeyspace: EventingKeyspace;\n private readonly lifecyclePollIntervalMs: number;\n private readonly lifecycleTimeoutMs: number;\n private readonly prefix: string;\n private readonly client?: EventingClient;\n private readonly explicitManager?: EventingFunctionManagerLike;\n\n constructor(client: EventingClient | undefined, options: EventingOptions) {\n if (!options || !options.namespace || !options.namespace.trim()) {\n throw new Error('Eventing requires an explicit, non-empty namespace');\n }\n requiredKeyspace(options.metadataKeyspace, 'Eventing metadataKeyspace');\n if (\n !options.metadataKeyspace.collection ||\n options.metadataKeyspace.collection === '_default'\n ) {\n throw new Error(\n 'Eventing metadataKeyspace requires a dedicated non-default collection; CouchSet never uses it as application data'\n );\n }\n\n this.client = client;\n this.explicitManager = options.manager;\n this.eventingMetadataKeyspace = {...options.metadataKeyspace};\n this.lifecycleTimeoutMs = this.positiveNumber(options.lifecycleTimeoutMs, 30000);\n this.lifecyclePollIntervalMs = this.nonNegativeNumber(options.lifecyclePollIntervalMs, 250);\n this.prefix = `${options.namespace.trim()}__`;\n\n (options.definitions || options.functions || []).forEach((definition) =>\n this.register(definition)\n );\n }\n\n /** Logical namespace that owns this controller's physical functions. */\n public get namespace(): string {\n return this.prefix.slice(0, -2);\n }\n\n /** A copy of registered, code-only declarations. This performs no I/O. */\n public definitions(): EventingDefinition[] {\n return Array.from(this.definitionsByName.values()).map((definition) => ({...definition}));\n }\n\n /** Converts a logical declaration name into its Couchbase function name. */\n public physicalName(name: string): string {\n this.assertLogicalName(name);\n return `${this.prefix}${name}`;\n }\n\n /** Registers or replaces an in-memory manifest declaration without I/O. */\n public register(definition: EventingDefinition): EventingDefinition {\n this.assertDefinition(definition);\n this.definitionsByName.set(definition.name, {...definition});\n return definition;\n }\n\n /** Alias for register(), matching the declaration-oriented API vocabulary. */\n public define(definition: EventingDefinition): EventingDefinition {\n return this.register(definition);\n }\n\n public async apply(options?: EventingApplyOptions): Promise<EventingReport>;\n public async apply(\n definition: EventingDefinition,\n options?: EventingApplyOptions\n ): Promise<EventingReport>;\n public async apply(\n definitionOrOptions?: EventingDefinition | EventingApplyOptions,\n possibleOptions: EventingApplyOptions = {}\n ): Promise<EventingReport> {\n const dynamic = this.isDefinition(definitionOrOptions) ? definitionOrOptions : undefined;\n const options = dynamic\n ? possibleOptions\n : (definitionOrOptions as EventingApplyOptions) || {};\n const report = emptyReport();\n const manager = await this.manager();\n\n if (dynamic) {\n this.register(dynamic);\n }\n\n const live = await manager.getAllFunctions();\n const states = await this.states(manager);\n const statesByName = new Map<string, EventingFunctionState>();\n states.forEach((state) => statesByName.set(state.name, state));\n const liveByName = new Map<string, EventingFunction>();\n live.forEach((functionDefinition) =>\n liveByName.set(functionDefinition.name, functionDefinition)\n );\n\n const targets = dynamic ? [dynamic] : this.definitions();\n for (const definition of targets) {\n await this.reconcile(\n manager,\n definition,\n liveByName.get(this.physicalName(definition.name)),\n statesByName.get(this.physicalName(definition.name)),\n options,\n report\n );\n }\n\n // A dynamic apply is intentionally surgical: it never prunes anything.\n if (!dynamic) {\n const declared = new Set<string>();\n targets.forEach((definition) => declared.add(this.physicalName(definition.name)));\n for (const functionDefinition of live) {\n if (this.owns(functionDefinition.name) && !declared.has(functionDefinition.name)) {\n await this.prune(\n manager,\n functionDefinition,\n statesByName.get(functionDefinition.name),\n report\n );\n }\n }\n }\n\n return report;\n }\n\n /** Temporarily disables one namespace-owned Eventing function. */\n public async pause(name: string): Promise<EventingReport> {\n const report = emptyReport();\n const physicalName = this.physicalName(name);\n const manager = await this.manager();\n const live = await manager.getAllFunctions();\n const current = live.filter(\n (functionDefinition) => functionDefinition.name === physicalName\n )[0];\n\n if (!current) {\n this.record(\n report,\n this.outcome(\n 'unchanged',\n name,\n ['unchanged'],\n 'No namespace-owned Eventing function exists with this name.'\n )\n );\n return report;\n }\n\n const states = await this.states(manager);\n const state = states.filter((item) => item.name === physicalName)[0];\n const lifecycle = await this.stableLifecycle(manager, physicalName, current, state);\n\n if (!lifecycle.deployed || lifecycle.paused) {\n this.record(report, this.outcome('unchanged', name, ['unchanged']));\n return report;\n }\n\n await manager.pauseFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'paused');\n this.record(report, this.outcome('paused', name, ['paused']));\n return report;\n }\n\n /**\n * Intentionally undeploys then deletes one namespace-owned function.\n * Undeployment erases Couchbase Eventing timers and checkpoints.\n */\n public async remove(name: string): Promise<EventingReport> {\n const report = emptyReport();\n const physicalName = this.physicalName(name);\n const manager = await this.manager();\n const live = await manager.getAllFunctions();\n const current = live.filter(\n (functionDefinition) => functionDefinition.name === physicalName\n )[0];\n\n if (!current) {\n this.record(\n report,\n this.outcome(\n 'unchanged',\n name,\n ['unchanged'],\n 'No namespace-owned Eventing function exists with this name.'\n )\n );\n return report;\n }\n\n const states = await this.states(manager);\n const state = states.filter((item) => item.name === physicalName)[0];\n const lifecycle = await this.stableLifecycle(manager, physicalName, current, state);\n\n if (lifecycle.deployed) {\n await manager.undeployFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'undeployed');\n }\n await manager.dropFunction(physicalName);\n this.definitionsByName.delete(name);\n this.record(\n report,\n this.outcome('removed', name, ['removed'], timerStateWarning, lifecycle.deployed)\n );\n return report;\n }\n\n private async reconcile(\n manager: EventingFunctionManagerLike,\n definition: EventingDefinition,\n current: EventingFunction | undefined,\n state: EventingFunctionState | undefined,\n options: EventingApplyOptions,\n report: EventingReport\n ): Promise<void> {\n const physicalName = this.physicalName(definition.name);\n const desired = this.sdkDefinition(definition);\n\n if (!current) {\n await manager.upsertFunction(desired);\n await manager.deployFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'deployed');\n this.record(report, this.outcome('created', definition.name, ['created']));\n return;\n }\n\n const lifecycle = await this.stableLifecycle(manager, physicalName, current, state);\n const keyspaceChanged =\n !keyspaceEquals(current.sourceKeyspace, desired.sourceKeyspace) ||\n !keyspaceEquals(current.metadataKeyspace, desired.metadataKeyspace);\n\n if (keyspaceChanged) {\n if (!options.allowRecreate) {\n this.record(\n report,\n this.outcome(\n 'requires-recreate',\n definition.name,\n ['requires-recreate'],\n `${timerStateWarning} Re-run apply with {allowRecreate: true} to permit this keyspace change.`\n )\n );\n return;\n }\n\n if (lifecycle.deployed) {\n await manager.undeployFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'undeployed');\n }\n await manager.upsertFunction(desired);\n await manager.deployFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'deployed');\n this.record(\n report,\n this.outcome(\n 'updated',\n definition.name,\n ['updated'],\n timerStateWarning,\n lifecycle.deployed\n )\n );\n return;\n }\n\n if (this.matches(current, desired, definition)) {\n if (lifecycle.paused) {\n await manager.resumeFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'deployed');\n this.record(report, this.outcome('resumed', definition.name, ['resumed']));\n } else if (!lifecycle.deployed) {\n await manager.deployFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'deployed');\n this.record(report, this.outcome('resumed', definition.name, ['resumed']));\n } else {\n this.record(report, this.outcome('unchanged', definition.name, ['unchanged']));\n }\n return;\n }\n\n const actions: EventingOutcomeAction[] = [];\n if (lifecycle.deployed && !lifecycle.paused) {\n await manager.pauseFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'paused');\n actions.push('paused');\n }\n await manager.upsertFunction(desired);\n actions.push('updated');\n await this.activateAfterUpsert(manager, physicalName, desired, actions);\n this.record(report, this.outcome('updated', definition.name, actions));\n }\n\n private async prune(\n manager: EventingFunctionManagerLike,\n functionDefinition: EventingFunction,\n state: EventingFunctionState | undefined,\n report: EventingReport\n ): Promise<void> {\n const lifecycle = await this.stableLifecycle(\n manager,\n functionDefinition.name,\n functionDefinition,\n state\n );\n if (lifecycle.deployed) {\n await manager.undeployFunction(functionDefinition.name);\n await this.waitForLifecycle(manager, functionDefinition.name, 'undeployed');\n }\n await manager.dropFunction(functionDefinition.name);\n this.record(\n report,\n this.outcome(\n 'pruned',\n this.logicalName(functionDefinition.name),\n ['pruned'],\n timerStateWarning,\n lifecycle.deployed\n )\n );\n }\n\n private matches(\n current: EventingFunction,\n desired: EventingFunction,\n definition: EventingDefinition\n ): boolean {\n return (\n current.code === desired.code &&\n (definition.enforceSchema === undefined ||\n current.enforceSchema === desired.enforceSchema) &&\n equal(current.bucketBindings || [], desired.bucketBindings || []) &&\n equal(current.urlBindings || [], desired.urlBindings || []) &&\n equal(current.constantBindings || [], desired.constantBindings || []) &&\n settingsMatch(current.settings, definition.settings)\n );\n }\n\n private sdkDefinition(definition: EventingDefinition): EventingFunction {\n const metadataKeyspace = normalizeKeyspace(this.metadataKeyspace());\n const sourceKeyspace = normalizeKeyspace(definition.sourceKeyspace);\n const settings: any = {...(definition.settings || {})};\n\n // Lifecycle is controlled through manager methods, never through an upsert payload.\n delete settings.deploymentStatus;\n delete settings.processingStatus;\n\n return {\n bucketBindings: definition.bucketBindings || [],\n code: definition.code,\n constantBindings: definition.constantBindings || [],\n enforceSchema: definition.enforceSchema,\n metadataKeyspace,\n name: this.physicalName(definition.name),\n settings,\n sourceKeyspace,\n urlBindings: definition.urlBindings || [],\n } as EventingFunction;\n }\n\n private metadataKeyspace(): EventingKeyspace {\n // The keyspace has already been validated in the constructor. Keeping it\n // behind this helper prevents accidental exposure as a CouchSet collection.\n return this.eventingMetadataKeyspace;\n }\n\n private async manager(): Promise<EventingFunctionManagerLike> {\n if (this.explicitManager) {\n return this.explicitManager;\n }\n if (!this.client) {\n throw new Error(\n 'Eventing requires a CouchSet client or an explicit EventingFunctionManager'\n );\n }\n\n await this.client.ready();\n const cluster = this.client.getConnection().cluster;\n if (!cluster || typeof cluster.eventingFunctions !== 'function') {\n throw new Error('The connected Couchbase SDK does not expose EventingFunctionManager');\n }\n return cluster.eventingFunctions() as EventingFunctionManagerLike;\n }\n\n private async states(manager: EventingFunctionManagerLike): Promise<EventingFunctionState[]> {\n const result = await manager.functionsStatus();\n return result.functions || [];\n }\n\n /**\n * Management requests acknowledge receipt, not necessarily completion. Do\n * not issue the next incompatible Eventing operation until status confirms\n * that Couchbase has converged.\n */\n private async waitForLifecycle(\n manager: EventingFunctionManagerLike,\n physicalName: string,\n expected: 'deployed' | 'paused' | 'undeployed'\n ): Promise<void> {\n const deadline = Date.now() + this.lifecycleTimeoutMs;\n\n while (true) {\n const state = (await this.states(manager)).filter(\n (item) => item.name === physicalName\n )[0];\n const lifecycle = lifecycleFor(state, {settings: {}} as EventingFunction);\n const reached =\n !!state &&\n !lifecycle.transitional &&\n ((expected === 'deployed' && lifecycle.deployed && !lifecycle.paused) ||\n (expected === 'paused' && lifecycle.deployed && lifecycle.paused) ||\n (expected === 'undeployed' && !lifecycle.deployed));\n\n if (reached) {\n return;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Timed out waiting for Eventing function ${physicalName} to become ${expected}`\n );\n }\n await new Promise<void>((resolve) => setTimeout(resolve, this.lifecyclePollIntervalMs));\n }\n }\n\n /**\n * Couchbase Server may turn a paused function into an undeployed function\n * when upsert persists new code/settings/bindings. Inspect that post-upsert\n * state rather than assuming resume is legal; deploy is the compatible\n * activation operation in that case.\n */\n private async activateAfterUpsert(\n manager: EventingFunctionManagerLike,\n physicalName: string,\n functionDefinition: EventingFunction,\n actions: EventingOutcomeAction[]\n ): Promise<void> {\n const lifecycle = await this.waitForStableLifecycle(\n manager,\n physicalName,\n functionDefinition\n );\n\n if (lifecycle.deployed && lifecycle.paused) {\n await manager.resumeFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'deployed');\n actions.push('resumed');\n } else if (!lifecycle.deployed) {\n await manager.deployFunction(physicalName);\n await this.waitForLifecycle(manager, physicalName, 'deployed');\n actions.push('resumed');\n }\n }\n\n /**\n * A live function with no status row is unknown, not safely undeployed.\n * Poll for a positive row; a known transitional row remains an immediate\n * blocker so callers do not race an operator's in-progress lifecycle call.\n */\n private async stableLifecycle(\n manager: EventingFunctionManagerLike,\n physicalName: string,\n functionDefinition: EventingFunction,\n initialState: EventingFunctionState | undefined\n ): Promise<FunctionLifecycle> {\n if (initialState) {\n const lifecycle = lifecycleFor(initialState, functionDefinition);\n this.assertStable(physicalName, lifecycle);\n return lifecycle;\n }\n\n const deadline = Date.now() + this.lifecycleTimeoutMs;\n while (true) {\n const state = (await this.states(manager)).filter(\n (item) => item.name === physicalName\n )[0];\n if (state) {\n const lifecycle = lifecycleFor(state, functionDefinition);\n this.assertStable(physicalName, lifecycle);\n return lifecycle;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Timed out waiting for Eventing status for function ${physicalName}`\n );\n }\n await new Promise<void>((resolve) => setTimeout(resolve, this.lifecyclePollIntervalMs));\n }\n }\n\n /** Waits for a stable state caused by this controller's own upsert call. */\n private async waitForStableLifecycle(\n manager: EventingFunctionManagerLike,\n physicalName: string,\n functionDefinition: EventingFunction\n ): Promise<FunctionLifecycle> {\n const deadline = Date.now() + this.lifecycleTimeoutMs;\n\n while (true) {\n const state = (await this.states(manager)).filter(\n (item) => item.name === physicalName\n )[0];\n if (state) {\n const lifecycle = lifecycleFor(state, functionDefinition);\n if (!lifecycle.transitional) {\n return lifecycle;\n }\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Timed out waiting for Eventing function ${physicalName} to settle after upsert`\n );\n }\n await new Promise<void>((resolve) => setTimeout(resolve, this.lifecyclePollIntervalMs));\n }\n }\n\n private record(report: EventingReport, outcome: EventingOutcome): void {\n report.outcomes.push(outcome);\n const actions = outcome.actions.length ? outcome.actions : [outcome.action];\n actions.forEach((action) => {\n const list =\n action === 'requires-recreate' ? report.requiresRecreate : (report as any)[action];\n if (list && list.indexOf(outcome) === -1) {\n list.push(outcome);\n }\n });\n }\n\n private outcome(\n action: EventingOutcomeAction,\n name: string,\n actions: EventingOutcomeAction[],\n message?: string,\n timerStateLost?: boolean\n ): EventingOutcome {\n return {\n action,\n actions,\n message,\n name,\n physicalName: this.physicalName(name),\n timerStateLost,\n };\n }\n\n private owns(name: string): boolean {\n return typeof name === 'string' && name.indexOf(this.prefix) === 0;\n }\n\n private logicalName(physicalName: string): string {\n if (!this.owns(physicalName)) {\n throw new Error(\n `Refusing to manage Eventing function outside namespace ${this.namespace}`\n );\n }\n return physicalName.slice(this.prefix.length);\n }\n\n private assertDefinition(definition: EventingDefinition): void {\n if (!definition || !definition.name || !definition.name.trim()) {\n throw new Error('Eventing definitions require a non-empty logical name');\n }\n if (!definition.code || typeof definition.code !== 'string') {\n throw new Error(`Eventing definition ${definition.name} requires handler code`);\n }\n requiredKeyspace(\n definition.sourceKeyspace,\n `Eventing definition ${definition.name} sourceKeyspace`\n );\n if (keyspaceEquals(definition.sourceKeyspace, this.metadataKeyspace())) {\n throw new Error(\n `Eventing definition ${definition.name} must use a dedicated metadata keyspace distinct from its source keyspace`\n );\n }\n }\n\n private assertLogicalName(name: string): void {\n if (!name || !name.trim()) {\n throw new Error('Eventing requires a non-empty logical function name');\n }\n if (name.indexOf(this.prefix) === 0) {\n throw new Error('Pass Eventing logical names, not physical namespace-prefixed names');\n }\n }\n\n private assertStable(physicalName: string, lifecycle: FunctionLifecycle): void {\n if (lifecycle.transitional) {\n throw new Error(\n `Eventing function ${physicalName} is transitioning; wait for Couchbase to settle before reconciling it`\n );\n }\n }\n\n private isDefinition(value: any): value is EventingDefinition {\n return !!value && own(value, 'name') && own(value, 'code') && own(value, 'sourceKeyspace');\n }\n\n private positiveNumber(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && value > 0 ? value : fallback;\n }\n\n private nonNegativeNumber(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && value >= 0 ? value : fallback;\n }\n}\n\n/**\n * Construct an Eventing control plane from a CouchSet client. The client is\n * used only to obtain the SDK EventingFunctionManager after `ready()`.\n */\nexport const createEventing = (client: EventingClient, options: EventingOptions): Eventing =>\n new Eventing(client, options);\n\n/** Construct an Eventing control plane around an application-owned SDK manager. */\nexport const createEventingWithManager = (options: EventingOptions): Eventing => {\n if (!options.manager) {\n throw new Error('createEventingWithManager requires EventingOptions.manager');\n }\n return new Eventing(undefined, options);\n};\n\n/** A small helper that makes Eventing definitions read as manifest declarations. */\nexport const defineEventingFunction = (definition: EventingDefinition): EventingDefinition => ({\n ...definition,\n});\n"]}
@@ -2,22 +2,47 @@ import { LogicalWhereExpr, SortType } from '../query/interface/query.types';
2
2
  export type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';
3
3
  export interface IncludeDefinition {
4
4
  as: string;
5
+ /** ANSI predicate; mutually exclusive with key/keys. */
6
+ on?: JoinPredicate;
7
+ /** Explicit trusted SQL++ escape hatch. Values still use positional placeholders. */
8
+ onRaw?: {
9
+ sql: string;
10
+ values?: readonly unknown[];
11
+ };
12
+ /** Top-level fields retained from the related document. */
13
+ select?: readonly string[];
5
14
  key?: string;
6
15
  keys?: string;
7
16
  keyspace?: string;
8
17
  model?: string | {
9
18
  keyspace: () => string;
19
+ parse?: <T>(data: T) => T;
20
+ parseProjection?: <T>(data: T) => T;
10
21
  };
11
22
  type?: IncludeType;
12
23
  optional?: boolean;
13
24
  }
25
+ /** A field operand is explicit; bare strings are always parameter values. */
26
+ export interface JoinField {
27
+ readonly $field: string;
28
+ }
29
+ export type JoinPredicate = {
30
+ $and: readonly JoinPredicate[];
31
+ } | {
32
+ $or: readonly JoinPredicate[];
33
+ } | {
34
+ left: JoinField;
35
+ op: '$eq' | '$neq' | '$gt' | '$gte' | '$lt' | '$lte';
36
+ right: unknown;
37
+ };
38
+ export declare const joinField: (path: string) => JoinField;
14
39
  export interface IncludedSelectionQueryArgs {
15
40
  keyspace: string;
16
41
  collectionName: string;
17
- select?: any[] | string;
42
+ select?: readonly any[] | string;
18
43
  where?: LogicalWhereExpr;
19
44
  orderBy?: Record<string, SortType>;
20
- include?: IncludeDefinition[];
45
+ include?: readonly IncludeDefinition[];
21
46
  limit?: number;
22
47
  page?: number;
23
48
  offset?: number;
@@ -29,5 +54,13 @@ export interface IncludedSelectionQuery {
29
54
  selectAll: boolean;
30
55
  resultKey?: string;
31
56
  }
32
- export declare const buildIncludeClauses: (keyspace: string, include?: IncludeDefinition[], sourceAlias?: string) => string;
57
+ declare class IncludeParameterStore {
58
+ parameters: Record<string, any>;
59
+ private index;
60
+ add(value: any): string;
61
+ set(key: string, value: any): string;
62
+ }
63
+ export declare const includeOperator: (include: IncludeDefinition) => string;
64
+ export declare const buildIncludeClauses: (keyspace: string, include?: readonly IncludeDefinition[], sourceAlias?: string, store?: IncludeParameterStore) => string;
33
65
  export declare const buildIncludedSelectionQuery: (args: IncludedSelectionQueryArgs) => IncludedSelectionQuery;
66
+ export {};
@@ -25,10 +25,16 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
25
25
  return to.concat(ar || Array.prototype.slice.call(from));
26
26
  };
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = void 0;
29
- var helpers_1 = require("../query/helpers");
30
- var utils_1 = require("../query/utils");
28
+ exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = exports.includeOperator = exports.joinField = void 0;
31
29
  var keyspace_1 = require("./keyspace");
30
+ var joinField = function (path) { return ({ $field: path }); };
31
+ exports.joinField = joinField;
32
+ var identifier = function (name) {
33
+ if (!name || name.indexOf('\0') !== -1)
34
+ throw new Error('Empty or invalid identifier');
35
+ return (0, keyspace_1.escapeIdentifier)(name);
36
+ };
37
+ var fieldPath = function (path) { return path.split('.').map(identifier).join('.'); };
32
38
  var comparisonOperators = {
33
39
  $eq: '=',
34
40
  $neq: '!=',
@@ -74,26 +80,30 @@ var IncludeParameterStore = /** @class */ (function () {
74
80
  };
75
81
  return IncludeParameterStore;
76
82
  }());
77
- var safeAlias = function (alias) {
78
- return /^[A-Za-z_][A-Za-z0-9_]*$/.test(alias) ? alias : (0, keyspace_1.escapeIdentifier)(alias);
83
+ var safeAlias = identifier;
84
+ var safeKeyspace = function (target) {
85
+ // Accept existing model.keyspace() output and simple dotted identifiers, never expressions.
86
+ var token = '(?:`(?:[^`]|``)+`|[A-Za-z_][A-Za-z0-9_-]*)';
87
+ if (!new RegExp("^(?:default:)?".concat(token, "(?:\\.").concat(token, "){0,2}$")).test(target))
88
+ throw new Error('Invalid include keyspace; use a model or identifier path');
89
+ return target.replace(/[A-Za-z_][A-Za-z0-9_-]*|`(?:[^`]|``)+`/g, function (part, offset) {
90
+ return target.slice(offset + part.length, offset + part.length + 1) === ':' || part.startsWith('`')
91
+ ? part
92
+ : identifier(part);
93
+ });
79
94
  };
80
95
  var keyspaceFromInclude = function (include, defaultKeyspace) {
81
- if (include.keyspace) {
82
- return include.keyspace;
83
- }
84
- if (typeof include.model === 'string') {
85
- return include.model;
86
- }
87
- if (include.model) {
88
- return include.model.keyspace();
89
- }
90
- return defaultKeyspace;
96
+ var _a;
97
+ var target = include.keyspace ||
98
+ (typeof include.model === 'string' ? include.model : (_a = include.model) === null || _a === void 0 ? void 0 : _a.keyspace()) ||
99
+ defaultKeyspace;
100
+ return safeKeyspace(target);
91
101
  };
92
102
  var sourceField = function (field, sourceAlias) {
93
- if (field.indexOf("".concat(sourceAlias, ".")) === 0) {
94
- return field;
95
- }
96
- return "".concat(sourceAlias, ".").concat((0, utils_1.escapeReservedWords)(field));
103
+ var prefix = "".concat(sourceAlias, ".");
104
+ return field.indexOf(prefix) === 0
105
+ ? fieldPath(field)
106
+ : "".concat(identifier(sourceAlias), ".").concat(fieldPath(field));
97
107
  };
98
108
  var includeOperator = function (include) {
99
109
  if (include.type === 'leftNest') {
@@ -105,22 +115,92 @@ var includeOperator = function (include) {
105
115
  if (include.type === 'leftJoin') {
106
116
  return 'LEFT JOIN';
107
117
  }
118
+ if (include.type === 'join') {
119
+ return include.optional ? 'LEFT JOIN' : 'JOIN';
120
+ }
108
121
  if (include.keys) {
109
122
  return include.optional ? 'LEFT NEST' : 'NEST';
110
123
  }
111
124
  return include.optional ? 'LEFT JOIN' : 'JOIN';
112
125
  };
113
- var buildIncludeClauses = function (keyspace, include, sourceAlias) {
126
+ exports.includeOperator = includeOperator;
127
+ var predicateExpr = function (predicate, store, aliases) {
128
+ if (!predicate || typeof predicate !== 'object')
129
+ throw new Error('Invalid ON predicate');
130
+ var keys = Object.keys(predicate);
131
+ if (keys.length === 1 && (keys[0] === '$and' || keys[0] === '$or')) {
132
+ var children = predicate[keys[0]];
133
+ if (!Array.isArray(children) || !children.length)
134
+ throw new Error('ON logical groups must be nonempty');
135
+ return "(".concat(children
136
+ .map(function (child) { return predicateExpr(child, store, aliases); })
137
+ .join(keys[0] === '$and' ? ' AND ' : ' OR '), ")");
138
+ }
139
+ var comparison = predicate;
140
+ if (keys.length !== 3 ||
141
+ !keys.includes('left') ||
142
+ !keys.includes('right') ||
143
+ !keys.includes('op') ||
144
+ !Object.prototype.hasOwnProperty.call(comparisonOperators, comparison.op))
145
+ throw new Error('Unsupported ON comparison');
146
+ var reference = function (value) {
147
+ if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)
148
+ throw new Error('Expected explicit joinField reference');
149
+ var parts = value.$field.split('.');
150
+ if (parts.length < 2 || !aliases.has(parts[0]))
151
+ throw new Error("Unknown ON alias: ".concat(parts[0]));
152
+ return fieldPath(value.$field);
153
+ };
154
+ var right = comparison.right;
155
+ return "".concat(reference(comparison.left), " ").concat(comparisonOperators[comparison.op], " ").concat(right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')
156
+ ? reference(right)
157
+ : store.add(right));
158
+ };
159
+ var buildIncludeClauses = function (keyspace, include, sourceAlias, store) {
114
160
  if (include === void 0) { include = []; }
115
161
  if (sourceAlias === void 0) { sourceAlias = 'doc'; }
162
+ if (store === void 0) { store = new IncludeParameterStore(); }
163
+ var aliases = new Set([sourceAlias]);
164
+ var reservedAliases = new Set(['__cs_root', '__proto__', 'constructor', 'prototype']);
165
+ var modes = new Set(include.map(function (item) { return (item.on || item.onRaw ? 'ansi' : 'keys'); }));
166
+ // Couchbase does not permit mixing lookup and ANSI joins in the same FROM clause.
167
+ if (modes.size > 1)
168
+ throw new Error('Cannot mix ANSI ON and ON KEYS includes');
116
169
  return include
117
170
  .map(function (item) {
118
- var key = item.key || item.keys;
119
- if (!key) {
120
- throw new Error("include ".concat(item.as, " requires key or keys"));
171
+ if (aliases.has(item.as) || reservedAliases.has(item.as))
172
+ throw new Error("Duplicate or reserved include alias: ".concat(item.as));
173
+ aliases.add(item.as);
174
+ if (item.type && !['join', 'leftJoin', 'nest', 'leftNest'].includes(item.type))
175
+ throw new Error('Unsupported include type');
176
+ if ([
177
+ item.key !== undefined,
178
+ item.keys !== undefined,
179
+ item.on !== undefined,
180
+ item.onRaw !== undefined,
181
+ ].filter(Boolean).length !== 1) {
182
+ throw new Error("include ".concat(item.as, " requires exactly one of key, keys, on, onRaw"));
183
+ }
184
+ var condition;
185
+ if (item.on)
186
+ condition = "ON ".concat(predicateExpr(item.on, store, aliases));
187
+ else if (item.onRaw) {
188
+ var values_1 = item.onRaw.values || [];
189
+ var index_1 = 0;
190
+ if (!item.onRaw.sql.trim())
191
+ throw new Error('onRaw requires SQL');
192
+ var sql = item.onRaw.sql.replace(/\?/g, function () {
193
+ if (index_1 >= values_1.length)
194
+ throw new Error('onRaw placeholder/value mismatch');
195
+ return store.add(values_1[index_1++]);
196
+ });
197
+ if (index_1 !== values_1.length)
198
+ throw new Error('onRaw placeholder/value mismatch');
199
+ condition = "ON (".concat(sql, ")");
121
200
  }
122
- var alias = safeAlias(item.as);
123
- return "".concat(includeOperator(item), " ").concat(keyspaceFromInclude(item, keyspace), " AS ").concat(alias, " ON KEYS ").concat(sourceField(key, sourceAlias));
201
+ else
202
+ condition = "ON KEYS ".concat(sourceField((item.key || item.keys), sourceAlias));
203
+ return "".concat((0, exports.includeOperator)(item), " ").concat(keyspaceFromInclude(item, keyspace), " AS ").concat(safeAlias(item.as), " ").concat(condition);
124
204
  })
125
205
  .join(' ');
126
206
  };
@@ -201,46 +281,71 @@ var buildWhereExpr = function (expr, store, sourceAlias) {
201
281
  var buildOrderByExpr = function (orderBy, sourceAlias) {
202
282
  return orderBy
203
283
  ? " ORDER BY ".concat(Object.keys(orderBy)
204
- .map(function (field) { return "".concat(sourceField(field, sourceAlias), " ").concat(orderBy[field]); })
284
+ .map(function (field) {
285
+ if (!['ASC', 'DESC'].includes(orderBy[field]))
286
+ throw new Error('Unsupported order direction');
287
+ return "".concat(sourceField(field, sourceAlias), " ").concat(orderBy[field]);
288
+ })
205
289
  .join(','))
206
290
  : '';
207
291
  };
292
+ var selectedObject = function (alias, fields) {
293
+ if (!fields)
294
+ return identifier(alias);
295
+ if (!fields.length || new Set(fields).size !== fields.length)
296
+ throw new Error('Projection must contain distinct fields');
297
+ return "{".concat(fields
298
+ .map(function (field) {
299
+ if (field.includes('.'))
300
+ throw new Error('Include projections support top-level fields only');
301
+ return "".concat(JSON.stringify(field), ": ").concat(identifier(alias), ".").concat(identifier(field));
302
+ })
303
+ .join(', '), "}");
304
+ };
208
305
  var buildSelectExpr = function (select, include, sourceAlias) {
209
- if (!select || select === '*') {
210
- var aliases = include.map(function (item) { return safeAlias(item.as); });
211
- var mergeObject = aliases.map(function (alias) { return "".concat(JSON.stringify(alias), ": ").concat(alias); }).join(',');
306
+ var all = !select || select === '*';
307
+ var structured = Array.isArray(select) &&
308
+ select.every(function (field) { return typeof field === 'string' && !field.includes('.'); });
309
+ var root = all
310
+ ? identifier(sourceAlias)
311
+ : structured
312
+ ? selectedObject(sourceAlias, select)
313
+ : undefined;
314
+ var relations = include.map(function (item) {
315
+ var alias = identifier(item.as);
316
+ if (!item.select)
317
+ return "".concat(alias, " AS ").concat(alias);
318
+ var object = selectedObject('__cs_item', item.select);
319
+ var expression = (0, exports.includeOperator)(item).includes('NEST')
320
+ ? "ARRAY ".concat(object, " FOR ").concat(identifier('__cs_item'), " IN ").concat(alias, " END")
321
+ : "CASE WHEN ".concat(alias, " IS MISSING THEN MISSING WHEN ").concat(alias, " IS NULL THEN NULL ELSE ").concat(selectedObject(item.as, item.select), " END");
322
+ return "".concat(expression, " AS ").concat(alias);
323
+ });
324
+ if (structured &&
325
+ select.some(function (field) { return include.some(function (item) { return item.as === field; }); }))
326
+ throw new Error('Include alias conflicts with projected root field');
327
+ if (root)
212
328
  return {
213
- expr: "OBJECT_CONCAT(".concat(sourceAlias, ", {").concat(mergeObject, "}) AS ").concat(sourceAlias),
214
- selectAll: true,
215
- resultKey: sourceAlias,
329
+ expr: __spreadArray(["".concat(root, " AS __cs_root")], __read(relations), false).join(', '),
330
+ selectAll: all,
331
+ resultKey: '__cs_root',
216
332
  };
217
- }
218
- var includeSelect = include.map(function (item) {
219
- var alias = safeAlias(item.as);
220
- return "".concat(alias, " AS ").concat(alias);
221
- });
222
- if (typeof select === 'string') {
223
- return { expr: __spreadArray([select], __read(includeSelect), false).join(','), selectAll: false };
224
- }
225
- var modelSelect = select.map(function (item) {
226
- return typeof item === 'string'
227
- ? sourceField(item, sourceAlias)
228
- : (0, helpers_1.buildSelectArrayExpr)([item]);
229
- });
230
- return { expr: __spreadArray(__spreadArray([], __read(modelSelect), false), __read(includeSelect), false).join(','), selectAll: false };
333
+ throw new Error('Includes support only * or top-level field-array projections; use queryRows for arbitrary SQL++ projections');
231
334
  };
232
335
  var buildIncludedSelectionQuery = function (args) {
233
- var sourceAlias = safeAlias(args.sourceAlias || 'doc');
336
+ var sourceAlias = args.sourceAlias || 'doc';
337
+ if (sourceAlias === '__cs_root')
338
+ throw new Error('Reserved source alias');
234
339
  var include = args.include || [];
235
340
  var store = new IncludeParameterStore();
236
341
  var limit = typeof args.limit === 'number' ? args.limit : 10;
237
342
  var page = typeof args.page === 'number' ? args.page : 0;
238
343
  var offset = typeof args.offset === 'number' ? args.offset : page * limit;
239
344
  var _a = buildSelectExpr(args.select, include, sourceAlias), expr = _a.expr, selectAll = _a.selectAll, resultKey = _a.resultKey;
240
- var joins = (0, exports.buildIncludeClauses)(args.keyspace, include, sourceAlias);
345
+ var joins = (0, exports.buildIncludeClauses)(args.keyspace, include, sourceAlias, store);
241
346
  var limitExpr = " LIMIT ".concat(store.set('cs_limit', limit), " OFFSET ").concat(store.set('cs_offset', offset));
242
347
  return {
243
- query: "SELECT ".concat(expr, " FROM ").concat(args.keyspace, " AS ").concat(sourceAlias, " ").concat(joins).concat(buildWhereExpr(args.where, store, sourceAlias)).concat(buildOrderByExpr(args.orderBy, sourceAlias)).concat(limitExpr),
348
+ query: "SELECT ".concat(expr, " FROM ").concat(args.keyspace, " AS ").concat(identifier(sourceAlias), " ").concat(joins).concat(buildWhereExpr(args.where, store, sourceAlias)).concat(buildOrderByExpr(args.orderBy, sourceAlias)).concat(limitExpr),
244
349
  parameters: store.parameters,
245
350
  resultKey: resultKey,
246
351
  selectAll: selectAll,
@@ -1 +1 @@
1
- {"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAsD;AAEtD,wCAAmD;AAEnD,uCAA4C;AAkC5C,IAAM,mBAAmB,GAA2B;IAChD,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;CACb,CAAC;AAEF,IAAM,yBAAyB,GAA2B;IACtD,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,UAAU;CACvB,CAAC;AAEF,IAAM,wBAAwB,GAA2B;IACrD,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,eAAe;CAChC,CAAC;AAEF,IAAM,2BAA2B,GAA2B;IACxD,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,aAAa;CACzB,CAAC;AAEF,IAAM,gBAAgB,GAA2B;IAC7C,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,IAAI;CACZ,CAAC;AAEF;IAAA;QACW,eAAU,GAAwB,EAAE,CAAC;QACpC,UAAK,GAAG,CAAC,CAAC;IAetB,CAAC;IAbU,mCAAG,GAAV,UAAW,KAAU;QACjB,IAAM,GAAG,GAAG,mBAAY,IAAI,CAAC,KAAK,CAAE,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAE7B,OAAO,WAAI,GAAG,CAAE,CAAC;IACrB,CAAC;IAEM,mCAAG,GAAV,UAAW,GAAW,EAAE,KAAU;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAE7B,OAAO,WAAI,GAAG,CAAE,CAAC;IACrB,CAAC;IACL,4BAAC;AAAD,CAAC,AAjBD,IAiBC;AAED,IAAM,SAAS,GAAG,UAAC,KAAa;IAC5B,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UAAC,OAA0B,EAAE,eAAuB;IAC5E,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,eAAe,CAAC;AAC3B,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAC,KAAa,EAAE,WAAmB;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAG,WAAW,MAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,UAAG,WAAW,cAAI,IAAA,2BAAmB,EAAC,KAAK,CAAC,CAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,IAAM,eAAe,GAAG,UAAC,OAA0B;IAC/C,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC,CAAC;AAEK,IAAM,mBAAmB,GAAG,UAC/B,QAAgB,EAChB,OAAiC,EACjC,WAAmB;IADnB,wBAAA,EAAA,YAAiC;IACjC,4BAAA,EAAA,mBAAmB;IAEnB,OAAO,OAAO;SACT,GAAG,CAAC,UAAC,IAAI;QACN,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;QAElC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,kBAAW,IAAI,CAAC,EAAE,0BAAuB,CAAC,CAAC;QAC/D,CAAC;QAED,IAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjC,OAAO,UAAG,eAAe,CAAC,IAAI,CAAC,cAAI,mBAAmB,CAClD,IAAI,EACJ,QAAQ,CACX,iBAAO,KAAK,sBAAY,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAE,CAAC;IAC7D,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AArBW,QAAA,mBAAmB,uBAqB9B;AAEF,IAAM,kBAAkB,GAAG,UAAC,MAA2B;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAArC,CAAqC,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UACxB,SAAiB,EACjB,UAA+B,EAC/B,KAA4B,EAC5B,WAAmB;IAEnB,IAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAClD,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;SAC/B,GAAG,CAAC,UAAC,QAAQ;QACV,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3E,OAAO,UAAG,KAAK,cAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAE,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtE,OAAO,UAAG,KAAK,SAAG,mBAAmB,CAAC,QAAQ,CAAC,SAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QACxF,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5E,OAAO,UAAG,KAAK,cAAI,yBAAyB,CAAC,QAAQ,CAAC,cAAI,KAAK,CAAC,GAAG,CAC/D,UAAU,CAAC,QAAQ,CAAC,CACvB,CAAE,CAAC;QACR,CAAC;QAED,IACI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAA2B,EAAE,QAAQ,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EACrC,CAAC;YACO,IAAA,KAAA,OAAa,UAAU,CAAC,QAAQ,CAAC,IAAA,EAAhC,IAAI,QAAA,EAAE,EAAE,QAAwB,CAAC;YAExC,OAAO,UAAG,KAAK,cAAI,2BAA2B,CAAC,QAAQ,CAAC,cAAI,KAAK,CAAC,GAAG,CACjE,IAAI,CACP,kBAAQ,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8CAAuC,QAAQ,CAAE,CAAC,CAAC;IACvE,CAAC,CAAC;SACD,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAI,IAAI,MAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UACnB,KAA0B,EAC1B,KAA4B,EAC5B,WAAmB;IAEnB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACpB,GAAG,CAAC,UAAC,SAAS;QACX,IAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE/B,IACI,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAA3B,CAA2B,CAAC,EACpE,CAAC;YACC,OAAO,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAChC,OAAO,UAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,cAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAE,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,2CAAoC,SAAS,CAAE,CAAC,CAAC;IACrE,CAAC,CAAC;SACD,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,IAAM,oBAAoB,GAAG,UACzB,MAAwB,EACxB,KAA4B,EAC5B,WAAmB;IAEnB,IAAI,CAAC,kBAAkB,CAAC,MAA6B,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC,MAA6B,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACrB,GAAG,CAAC,UAAC,GAAG;;QACL,IAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE1B,IACI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAC7D,CAAC;YACC,OAAO,WAAI,KAAK;iBACX,GAAG,CAAC,UAAC,IAAI;gBACN,OAAA,oBAAoB,CAAC,IAAwB,EAAE,KAAK,EAAE,WAAW,CAAC;YAAlE,CAAkE,CACrE;iBACA,IAAI,CAAC,WAAI,gBAAgB,CAAC,GAAG,CAAC,MAAG,CAAC,MAAG,CAAC;QAC/C,CAAC;QAED,IAAI,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,eAAQ,KAAK;iBACf,GAAG,CAAC,UAAC,IAAI;gBACN,OAAA,oBAAoB,CAAC,IAAwB,EAAE,KAAK,EAAE,WAAW,CAAC;YAAlE,CAAkE,CACrE;iBACA,IAAI,CAAC,OAAO,CAAC,MAAG,CAAC;QAC1B,CAAC;QAED,OAAO,oBAAoB,CAAC,CAAA,SAAC,GAAC,GAAG,IAAG,KAAK,IAAqB,CAAA,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACxF,CAAC,CAAC;SACD,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UACnB,IAAkC,EAClC,KAA4B,EAC5B,WAAmB;IAEnB,OAAO,IAAI,CAAC,CAAC,CAAC,iBAAU,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC,CAAC;AAEF,IAAM,gBAAgB,GAAG,UACrB,OAA6C,EAC7C,WAAmB;IAEnB,OAAO,OAAO;QACV,CAAC,CAAC,oBAAa,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aAC5B,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,UAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,cAAI,OAAO,CAAC,KAAK,CAAC,CAAE,EAAtD,CAAsD,CAAC;aACtE,IAAI,CAAC,GAAG,CAAC,CAAE;QAClB,CAAC,CAAC,EAAE,CAAC;AACb,CAAC,CAAC;AAEF,IAAM,eAAe,GAAG,UACpB,MAAkC,EAClC,OAA4B,EAC5B,WAAmB;IAEnB,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAlB,CAAkB,CAAC,CAAC;QAC1D,IAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,UAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAK,KAAK,CAAE,EAApC,CAAoC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3F,OAAO;YACH,IAAI,EAAE,wBAAiB,WAAW,gBAAM,WAAW,mBAAS,WAAW,CAAE;YACzE,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,WAAW;SACzB,CAAC;IACN,CAAC;IAED,IAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,IAAI;QACnC,IAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjC,OAAO,UAAG,KAAK,iBAAO,KAAK,CAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAC,IAAI,EAAE,eAAC,MAAM,UAAK,aAAa,UAAE,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;IAC1E,CAAC;IAED,IAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,UAAC,IAAI;QAChC,OAAO,OAAO,IAAI,KAAK,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC;YAChC,CAAC,CAAC,IAAA,8BAAoB,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,OAAO,EAAC,IAAI,EAAE,uCAAI,WAAW,kBAAK,aAAa,UAAE,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;AAClF,CAAC,CAAC;AAEK,IAAM,2BAA2B,GAAG,UACvC,IAAgC;IAEhC,IAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IACzD,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,IAAM,KAAK,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC1C,IAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,IAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACtE,IAAA,KAA+B,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAhF,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,SAAS,eAAsD,CAAC;IACxF,IAAM,KAAK,GAAG,IAAA,2BAAmB,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACvE,IAAM,SAAS,GAAG,iBAAU,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,qBAAW,KAAK,CAAC,GAAG,CACxE,WAAW,EACX,MAAM,CACT,CAAE,CAAC;IAEJ,OAAO;QACH,KAAK,EAAE,iBAAU,IAAI,mBAAS,IAAI,CAAC,QAAQ,iBAAO,WAAW,cAAI,KAAK,SAAG,cAAc,CACnF,IAAI,CAAC,KAAK,EACV,KAAK,EACL,WAAW,CACd,SAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,SAAG,SAAS,CAAE;QAC7D,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,WAAA;QACT,SAAS,WAAA;KACZ,CAAC;AACN,CAAC,CAAC;AA1BW,QAAA,2BAA2B,+BA0BtC","sourcesContent":["import {buildSelectArrayExpr} from '../query/helpers';\nimport {LogicalWhereExpr, SortType} from '../query/interface/query.types';\nimport {escapeReservedWords} from '../query/utils';\n\nimport {escapeIdentifier} from './keyspace';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n key?: string;\n keys?: string;\n keyspace?: string;\n model?: string | {keyspace: () => string};\n type?: IncludeType;\n optional?: boolean;\n}\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = (alias: string): string => {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(alias) ? alias : escapeIdentifier(alias);\n};\n\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n if (include.keyspace) {\n return include.keyspace;\n }\n\n if (typeof include.model === 'string') {\n return include.model;\n }\n\n if (include.model) {\n return include.model.keyspace();\n }\n\n return defaultKeyspace;\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n if (field.indexOf(`${sourceAlias}.`) === 0) {\n return field;\n }\n\n return `${sourceAlias}.${escapeReservedWords(field)}`;\n};\n\nconst includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: IncludeDefinition[] = [],\n sourceAlias = 'doc'\n): string => {\n return include\n .map((item) => {\n const key = item.key || item.keys;\n\n if (!key) {\n throw new Error(`include ${item.as} requires key or keys`);\n }\n\n const alias = safeAlias(item.as);\n\n return `${includeOperator(item)} ${keyspaceFromInclude(\n item,\n keyspace\n )} AS ${alias} ON KEYS ${sourceField(key, sourceAlias)}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => `${sourceField(field, sourceAlias)} ${orderBy[field]}`)\n .join(',')}`\n : '';\n};\n\nconst buildSelectExpr = (\n select: any[] | string | undefined,\n include: IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n if (!select || select === '*') {\n const aliases = include.map((item) => safeAlias(item.as));\n const mergeObject = aliases.map((alias) => `${JSON.stringify(alias)}: ${alias}`).join(',');\n\n return {\n expr: `OBJECT_CONCAT(${sourceAlias}, {${mergeObject}}) AS ${sourceAlias}`,\n selectAll: true,\n resultKey: sourceAlias,\n };\n }\n\n const includeSelect = include.map((item) => {\n const alias = safeAlias(item.as);\n\n return `${alias} AS ${alias}`;\n });\n\n if (typeof select === 'string') {\n return {expr: [select, ...includeSelect].join(','), selectAll: false};\n }\n\n const modelSelect = select.map((item) => {\n return typeof item === 'string'\n ? sourceField(item, sourceAlias)\n : buildSelectArrayExpr([item]);\n });\n\n return {expr: [...modelSelect, ...includeSelect].join(','), selectAll: false};\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = safeAlias(args.sourceAlias || 'doc');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${sourceAlias} ${joins}${buildWhereExpr(\n args.where,\n store,\n sourceAlias\n )}${buildOrderByExpr(args.orderBy, sourceAlias)}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}
1
+ {"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":"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","sourcesContent":["import {LogicalWhereExpr, SortType} from '../query/interface/query.types';\n\nimport {escapeIdentifier} from './keyspace';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n /** ANSI predicate; mutually exclusive with key/keys. */\n on?: JoinPredicate;\n /** Explicit trusted SQL++ escape hatch. Values still use positional placeholders. */\n onRaw?: {sql: string; values?: readonly unknown[]};\n /** Top-level fields retained from the related document. */\n select?: readonly string[];\n key?: string;\n keys?: string;\n keyspace?: string;\n model?:\n | string\n | {keyspace: () => string; parse?: <T>(data: T) => T; parseProjection?: <T>(data: T) => T};\n type?: IncludeType;\n optional?: boolean;\n}\n\n/** A field operand is explicit; bare strings are always parameter values. */\nexport interface JoinField {\n readonly $field: string;\n}\nexport type JoinPredicate =\n | {$and: readonly JoinPredicate[]}\n | {$or: readonly JoinPredicate[]}\n | {left: JoinField; op: '$eq' | '$neq' | '$gt' | '$gte' | '$lt' | '$lte'; right: unknown};\nexport const joinField = (path: string): JoinField => ({$field: path});\n\nconst identifier = (name: string): string => {\n if (!name || name.indexOf('\\0') !== -1) throw new Error('Empty or invalid identifier');\n return escapeIdentifier(name);\n};\nconst fieldPath = (path: string): string => path.split('.').map(identifier).join('.');\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: readonly any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: readonly IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = identifier;\n\nconst safeKeyspace = (target: string): string => {\n // Accept existing model.keyspace() output and simple dotted identifiers, never expressions.\n const token = '(?:`(?:[^`]|``)+`|[A-Za-z_][A-Za-z0-9_-]*)';\n if (!new RegExp(`^(?:default:)?${token}(?:\\\\.${token}){0,2}$`).test(target))\n throw new Error('Invalid include keyspace; use a model or identifier path');\n return target.replace(/[A-Za-z_][A-Za-z0-9_-]*|`(?:[^`]|``)+`/g, (part, offset) =>\n target.slice(offset + part.length, offset + part.length + 1) === ':' || part.startsWith('`')\n ? part\n : identifier(part)\n );\n};\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n const target =\n include.keyspace ||\n (typeof include.model === 'string' ? include.model : include.model?.keyspace()) ||\n defaultKeyspace;\n return safeKeyspace(target);\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n const prefix = `${sourceAlias}.`;\n return field.indexOf(prefix) === 0\n ? fieldPath(field)\n : `${identifier(sourceAlias)}.${fieldPath(field)}`;\n};\n\nexport const includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.type === 'join') {\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nconst predicateExpr = (\n predicate: JoinPredicate,\n store: IncludeParameterStore,\n aliases: Set<string>\n): string => {\n if (!predicate || typeof predicate !== 'object') throw new Error('Invalid ON predicate');\n const keys = Object.keys(predicate);\n if (keys.length === 1 && (keys[0] === '$and' || keys[0] === '$or')) {\n const children = (predicate as any)[keys[0]];\n if (!Array.isArray(children) || !children.length)\n throw new Error('ON logical groups must be nonempty');\n return `(${children\n .map((child) => predicateExpr(child, store, aliases))\n .join(keys[0] === '$and' ? ' AND ' : ' OR ')})`;\n }\n const comparison = predicate as any;\n if (\n keys.length !== 3 ||\n !keys.includes('left') ||\n !keys.includes('right') ||\n !keys.includes('op') ||\n !Object.prototype.hasOwnProperty.call(comparisonOperators, comparison.op)\n )\n throw new Error('Unsupported ON comparison');\n const reference = (value: any): string => {\n if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)\n throw new Error('Expected explicit joinField reference');\n const parts = value.$field.split('.');\n if (parts.length < 2 || !aliases.has(parts[0]))\n throw new Error(`Unknown ON alias: ${parts[0]}`);\n return fieldPath(value.$field);\n };\n const right = comparison.right;\n return `${reference(comparison.left)} ${comparisonOperators[comparison.op]} ${\n right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')\n ? reference(right)\n : store.add(right)\n }`;\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: readonly IncludeDefinition[] = [],\n sourceAlias = 'doc',\n store = new IncludeParameterStore()\n): string => {\n const aliases = new Set([sourceAlias]);\n const reservedAliases = new Set(['__cs_root', '__proto__', 'constructor', 'prototype']);\n const modes = new Set(include.map((item) => (item.on || item.onRaw ? 'ansi' : 'keys')));\n // Couchbase does not permit mixing lookup and ANSI joins in the same FROM clause.\n if (modes.size > 1) throw new Error('Cannot mix ANSI ON and ON KEYS includes');\n return include\n .map((item) => {\n if (aliases.has(item.as) || reservedAliases.has(item.as))\n throw new Error(`Duplicate or reserved include alias: ${item.as}`);\n aliases.add(item.as);\n if (item.type && !['join', 'leftJoin', 'nest', 'leftNest'].includes(item.type))\n throw new Error('Unsupported include type');\n if (\n [\n item.key !== undefined,\n item.keys !== undefined,\n item.on !== undefined,\n item.onRaw !== undefined,\n ].filter(Boolean).length !== 1\n ) {\n throw new Error(`include ${item.as} requires exactly one of key, keys, on, onRaw`);\n }\n let condition: string;\n if (item.on) condition = `ON ${predicateExpr(item.on, store, aliases)}`;\n else if (item.onRaw) {\n const values = item.onRaw.values || [];\n let index = 0;\n if (!item.onRaw.sql.trim()) throw new Error('onRaw requires SQL');\n const sql = item.onRaw.sql.replace(/\\?/g, () => {\n if (index >= values.length) throw new Error('onRaw placeholder/value mismatch');\n return store.add(values[index++]);\n });\n if (index !== values.length) throw new Error('onRaw placeholder/value mismatch');\n condition = `ON (${sql})`;\n } else\n condition = `ON KEYS ${sourceField(\n (item.key || item.keys) as string,\n sourceAlias\n )}`;\n return `${includeOperator(item)} ${keyspaceFromInclude(item, keyspace)} AS ${safeAlias(\n item.as\n )} ${condition}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => {\n if (!['ASC', 'DESC'].includes(orderBy[field]))\n throw new Error('Unsupported order direction');\n return `${sourceField(field, sourceAlias)} ${orderBy[field]}`;\n })\n .join(',')}`\n : '';\n};\n\nconst selectedObject = (alias: string, fields?: readonly string[]): string => {\n if (!fields) return identifier(alias);\n if (!fields.length || new Set(fields).size !== fields.length)\n throw new Error('Projection must contain distinct fields');\n return `{${fields\n .map((field) => {\n if (field.includes('.'))\n throw new Error('Include projections support top-level fields only');\n return `${JSON.stringify(field)}: ${identifier(alias)}.${identifier(field)}`;\n })\n .join(', ')}}`;\n};\n\nconst buildSelectExpr = (\n select: readonly any[] | string | undefined,\n include: readonly IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n const all = !select || select === '*';\n const structured =\n Array.isArray(select) &&\n select.every((field) => typeof field === 'string' && !field.includes('.'));\n const root = all\n ? identifier(sourceAlias)\n : structured\n ? selectedObject(sourceAlias, select as string[])\n : undefined;\n const relations = include.map((item) => {\n const alias = identifier(item.as);\n if (!item.select) return `${alias} AS ${alias}`;\n const object = selectedObject('__cs_item', item.select);\n const expression = includeOperator(item).includes('NEST')\n ? `ARRAY ${object} FOR ${identifier('__cs_item')} IN ${alias} END`\n : `CASE WHEN ${alias} IS MISSING THEN MISSING WHEN ${alias} IS NULL THEN NULL ELSE ${selectedObject(\n item.as,\n item.select\n )} END`;\n return `${expression} AS ${alias}`;\n });\n if (\n structured &&\n (select as string[]).some((field) => include.some((item) => item.as === field))\n )\n throw new Error('Include alias conflicts with projected root field');\n if (root)\n return {\n expr: [`${root} AS __cs_root`, ...relations].join(', '),\n selectAll: all,\n resultKey: '__cs_root',\n };\n throw new Error(\n 'Includes support only * or top-level field-array projections; use queryRows for arbitrary SQL++ projections'\n );\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = args.sourceAlias || 'doc';\n if (sourceAlias === '__cs_root') throw new Error('Reserved source alias');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias, store);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${identifier(\n sourceAlias\n )} ${joins}${buildWhereExpr(args.where, store, sourceAlias)}${buildOrderByExpr(\n args.orderBy,\n sourceAlias\n )}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}
@@ -27,7 +27,8 @@ export type { ModelPageResult, ModelReadArgs } from './read-helpers';
27
27
  export type { QueryLogger, QueryPageOptions, QueryPageResult, QueryParameters, SafeQueryOptions, } from './safe-query';
28
28
  export type { FindByIdWithMetaResult, PatchByIdArgs } from './write-helpers';
29
29
  export type { Hydrated } from './hydrated-document';
30
- export type { IncludeDefinition, IncludeType } from './include';
30
+ export type { IncludeDefinition, IncludeType, JoinField, JoinPredicate } from './include';
31
+ export { joinField } from './include';
31
32
  export type { EnsureIndexOptions, ModelIndexDefinition } from './indexes';
32
33
  export type { TtlOptions } from './ttl';
33
34
  export type { ParseHook, ValidationHook } from './validation';
@@ -234,6 +235,8 @@ export declare class Model {
234
235
  id: string;
235
236
  }>(data: T & AutoModelFields): Hydrated<T>;
236
237
  parse<T>(data: T): T;
238
+ /** Decode present projection fields without invoking full-document parse hooks. */
239
+ parseProjection<T>(data: T): T;
237
240
  /** @internal Used by the typed client before a document reaches the SDK. */
238
241
  serialize<T>(data: T): T;
239
242
  /** @internal Used by patch helpers and transaction-bound models. */