@noy-db/hub 0.7.1-pre.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +147 -14
- package/LICENSE +202 -21
- package/NOTICE +1 -0
- package/README.md +5 -5
- package/codemods/0.8.0-pre.json +61 -0
- package/dist/api-OS747DS4.js +18 -0
- package/dist/as/index.js +11 -12
- package/dist/as/index.js.map +1 -1
- package/dist/at/index.js +9 -10
- package/dist/attestation/index.js +37 -26
- package/dist/attestation/index.js.map +1 -1
- package/dist/{backup-XKCXVKV3.js → backup-YE2VQ26S.js} +15 -16
- package/dist/backup-YE2VQ26S.js.map +1 -0
- package/dist/blobs/index.js +13 -14
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +12 -13
- package/dist/broker/index.js.map +1 -1
- package/dist/by/index.js +2 -2
- package/dist/capsule/contract.d.ts +159 -0
- package/dist/capsule/contract.js +95 -0
- package/dist/capsule/enclave-aes/bound.d.ts +52 -0
- package/dist/capsule/enclave-aes/capabilities.d.ts +2 -0
- package/dist/capsule/enclave-aes/classify/compare.d.ts +20 -0
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/find.d.ts +1 -1
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/reveal.d.ts +1 -1
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/verify.d.ts +2 -2
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/write.d.ts +1 -1
- package/dist/{kernel/enclave → capsule/enclave-aes}/crypto.d.ts +33 -129
- package/dist/capsule/enclave-aes/index.d.ts +113 -0
- package/dist/capsule/enclave-aes/index.js +335 -0
- package/dist/capsule/enclave-aes/index.js.map +1 -0
- package/dist/capsule/enclave-aes/primitives.d.ts +29 -0
- package/dist/capsule/index.d.ts +27 -0
- package/dist/capsule/plumbing/ct-equal.d.ts +11 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/deterministic.d.ts +8 -21
- package/dist/capsule/plumbing/digest.d.ts +122 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/envelope-body.d.ts +44 -48
- package/dist/capsule/plumbing/index.d.ts +100 -0
- package/dist/capsule/plumbing/lifecycle.d.ts +50 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/record-codec.d.ts +80 -20
- package/dist/{kernel/enclave → capsule/plumbing}/record-envelope.d.ts +1 -1
- package/dist/capsule/plumbing/rekey-blob.d.ts +33 -0
- package/dist/capsule/plumbing/rekey.d.ts +44 -0
- package/dist/capsule/plumbing/sealed-slot.d.ts +22 -0
- package/dist/capsule/plumbing/sealed-slots.d.ts +37 -0
- package/dist/capsule/plumbing/sealing.d.ts +29 -0
- package/dist/capsule/plumbing/sign.d.ts +9 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/tombstone.d.ts +2 -2
- package/dist/capsule-VOLX3QRQ.js +209 -0
- package/dist/cargo/index.js +39 -36
- package/dist/{chunk-Q2MPFCQ7.js → chunk-23D6M6VM.js} +5 -5
- package/dist/chunk-23D6M6VM.js.map +1 -0
- package/dist/{chunk-R7BX2NB3.js → chunk-244QBK7Z.js} +4 -4
- package/dist/chunk-244QBK7Z.js.map +1 -0
- package/dist/chunk-2AFX33YA.js +936 -0
- package/dist/chunk-2AFX33YA.js.map +1 -0
- package/dist/{chunk-MVMXZYXT.js → chunk-2GHDLTPE.js} +2 -2
- package/dist/{chunk-GYGLAVCX.js → chunk-2MG3SW7Q.js} +6 -2
- package/dist/chunk-2MG3SW7Q.js.map +1 -0
- package/dist/{chunk-XLMEZIAJ.js → chunk-2ODVB6LZ.js} +2 -2
- package/dist/{chunk-HJUWN7JN.js → chunk-2PVXF5CS.js} +33 -8
- package/dist/chunk-2PVXF5CS.js.map +1 -0
- package/dist/{chunk-YJRT5UQM.js → chunk-2RH777HH.js} +21 -20
- package/dist/{chunk-YJRT5UQM.js.map → chunk-2RH777HH.js.map} +1 -1
- package/dist/{chunk-7O3Y4PPD.js → chunk-37EPTBBR.js} +153 -16
- package/dist/chunk-37EPTBBR.js.map +1 -0
- package/dist/{chunk-2ENE6445.js → chunk-3A5DUZ56.js} +102 -16
- package/dist/chunk-3A5DUZ56.js.map +1 -0
- package/dist/chunk-3EWS67C7.js +461 -0
- package/dist/chunk-3EWS67C7.js.map +1 -0
- package/dist/{chunk-SGZAIJCV.js → chunk-3L2NBKDR.js} +4 -8
- package/dist/chunk-3L2NBKDR.js.map +1 -0
- package/dist/{chunk-YMUFFJCO.js → chunk-3TDUWVWB.js} +5 -2
- package/dist/chunk-3TDUWVWB.js.map +1 -0
- package/dist/{chunk-4GVM6QZA.js → chunk-3XJQBBZD.js} +26 -28
- package/dist/chunk-3XJQBBZD.js.map +1 -0
- package/dist/{chunk-4ZS56W5S.js → chunk-42ALPZ2B.js} +672 -664
- package/dist/chunk-42ALPZ2B.js.map +1 -0
- package/dist/chunk-4CIQDWRB.js +524 -0
- package/dist/chunk-4CIQDWRB.js.map +1 -0
- package/dist/{chunk-RMS3NEA3.js → chunk-4JPMZTJY.js} +2 -2
- package/dist/{chunk-P3MG6QCN.js → chunk-4T3SE27M.js} +5 -9
- package/dist/chunk-4T3SE27M.js.map +1 -0
- package/dist/chunk-4V3Q35WG.js +204 -0
- package/dist/chunk-4V3Q35WG.js.map +1 -0
- package/dist/{chunk-NQKIUNW5.js → chunk-52MGURXO.js} +2 -2
- package/dist/{chunk-EQEYOJBM.js → chunk-5A4345TG.js} +4 -4
- package/dist/chunk-5A4345TG.js.map +1 -0
- package/dist/{chunk-334WSVOW.js → chunk-5FE75J4S.js} +6 -6
- package/dist/chunk-5FE75J4S.js.map +1 -0
- package/dist/chunk-5KC7QYEC.js +565 -0
- package/dist/chunk-5KC7QYEC.js.map +1 -0
- package/dist/{chunk-RSGLUIO6.js → chunk-5UMK7GRI.js} +13 -12
- package/dist/chunk-5UMK7GRI.js.map +1 -0
- package/dist/chunk-5WWDGFOS.js +275 -0
- package/dist/chunk-5WWDGFOS.js.map +1 -0
- package/dist/{chunk-QPQUVOZ2.js → chunk-6QVKPHBF.js} +3 -5
- package/dist/chunk-6QVKPHBF.js.map +1 -0
- package/dist/{chunk-ACAQ2DSG.js → chunk-747G6CT3.js} +2 -2
- package/dist/chunk-747G6CT3.js.map +1 -0
- package/dist/{chunk-QTQUH4DS.js → chunk-7R2Q7CPL.js} +16 -16
- package/dist/chunk-7R2Q7CPL.js.map +1 -0
- package/dist/{chunk-UGTBXF5U.js → chunk-7XMHMVTS.js} +3 -3
- package/dist/{chunk-YJX7EOJD.js → chunk-A4XMIZT3.js} +6 -6
- package/dist/{chunk-YJX7EOJD.js.map → chunk-A4XMIZT3.js.map} +1 -1
- package/dist/{chunk-A66I4JOA.js → chunk-AEQGFRU4.js} +4 -4
- package/dist/chunk-AEQGFRU4.js.map +1 -0
- package/dist/chunk-AL6ML4LA.js +1558 -0
- package/dist/chunk-AL6ML4LA.js.map +1 -0
- package/dist/{chunk-BZ3534YM.js → chunk-AUKKUPVB.js} +2 -2
- package/dist/{chunk-CUZLNGD5.js → chunk-B2YY6WDD.js} +1 -1
- package/dist/chunk-B2YY6WDD.js.map +1 -0
- package/dist/chunk-BKT776R5.js +1 -0
- package/dist/chunk-BNWA3WG5.js +22 -0
- package/dist/chunk-BNWA3WG5.js.map +1 -0
- package/dist/{chunk-VXANTWBJ.js → chunk-BPWYQ25R.js} +92 -6
- package/dist/{chunk-VXANTWBJ.js.map → chunk-BPWYQ25R.js.map} +1 -1
- package/dist/{chunk-6LKOJBV6.js → chunk-BVCUTXE3.js} +2 -2
- package/dist/chunk-CY2CYVWZ.js +41 -0
- package/dist/chunk-CY2CYVWZ.js.map +1 -0
- package/dist/{chunk-M4YPHYEH.js → chunk-DHHGL42E.js} +70 -25
- package/dist/chunk-DHHGL42E.js.map +1 -0
- package/dist/{chunk-VTFVLCUH.js → chunk-DIZLQVAA.js} +2 -2
- package/dist/{chunk-G73UVHCA.js → chunk-DLD5LGDS.js} +11 -12
- package/dist/chunk-DLD5LGDS.js.map +1 -0
- package/dist/{chunk-WQBG4SZS.js → chunk-DQESF6RP.js} +60 -49
- package/dist/chunk-DQESF6RP.js.map +1 -0
- package/dist/{chunk-LWBCUYZW.js → chunk-E2N2T5ZO.js} +2 -2
- package/dist/{chunk-3PGS7TYR.js → chunk-EGVJ7TM4.js} +29 -32
- package/dist/chunk-EGVJ7TM4.js.map +1 -0
- package/dist/{chunk-JVIBCBC7.js → chunk-EJLV62NI.js} +2 -2
- package/dist/{chunk-KKEESNPE.js → chunk-EYG2CY2X.js} +126 -19
- package/dist/chunk-EYG2CY2X.js.map +1 -0
- package/dist/{enclave-55PAM4YO.js → chunk-EZGV6F47.js} +83 -56
- package/dist/chunk-EZGV6F47.js.map +1 -0
- package/dist/{chunk-CHQCZZWC.js → chunk-EZOAKKTB.js} +36 -27
- package/dist/chunk-EZOAKKTB.js.map +1 -0
- package/dist/chunk-F6NCB7KT.js +13 -0
- package/dist/chunk-F6NCB7KT.js.map +1 -0
- package/dist/chunk-FFJFE4T7.js +100 -0
- package/dist/chunk-FFJFE4T7.js.map +1 -0
- package/dist/{chunk-JMGDHKQF.js → chunk-FLPCETP6.js} +2 -2
- package/dist/chunk-FOEDQATO.js +53 -0
- package/dist/chunk-FOEDQATO.js.map +1 -0
- package/dist/{chunk-DGOZ4UZD.js → chunk-FVH5QYY2.js} +2 -2
- package/dist/{chunk-HIWCKBEY.js → chunk-G2MVBDFP.js} +54 -28
- package/dist/chunk-G2MVBDFP.js.map +1 -0
- package/dist/chunk-GMKGGY7V.js +234 -0
- package/dist/chunk-GMKGGY7V.js.map +1 -0
- package/dist/{chunk-EIPVYUEP.js → chunk-GQ4MF3CM.js} +3 -3
- package/dist/chunk-GQ4MF3CM.js.map +1 -0
- package/dist/{chunk-PEOZ34EM.js → chunk-GSAK56VF.js} +1 -1
- package/dist/chunk-GSAK56VF.js.map +1 -0
- package/dist/{chunk-5VCRVKOZ.js → chunk-GUZET4SG.js} +12 -4
- package/dist/chunk-GUZET4SG.js.map +1 -0
- package/dist/{chunk-JBDFMYKQ.js → chunk-GZT3NQRA.js} +2 -2
- package/dist/{chunk-K23VKTN4.js → chunk-H23XHRTT.js} +19 -34
- package/dist/chunk-H23XHRTT.js.map +1 -0
- package/dist/{chunk-TFR7DSOV.js → chunk-H427H63K.js} +2 -2
- package/dist/{chunk-DFMWUOU5.js → chunk-H7JBY4P7.js} +23 -32
- package/dist/chunk-H7JBY4P7.js.map +1 -0
- package/dist/{chunk-SKGMN35F.js → chunk-HS554XAF.js} +3 -3
- package/dist/chunk-HS554XAF.js.map +1 -0
- package/dist/{chunk-HK67PX4J.js → chunk-HW7CMKUG.js} +1 -1
- package/dist/chunk-HW7CMKUG.js.map +1 -0
- package/dist/{chunk-3BVH633C.js → chunk-IMQKWR46.js} +5 -7
- package/dist/chunk-IMQKWR46.js.map +1 -0
- package/dist/{chunk-R42NSZI6.js → chunk-IUBMZPHM.js} +7 -7
- package/dist/chunk-IUBMZPHM.js.map +1 -0
- package/dist/{chunk-CUQPWYRX.js → chunk-IUT3GWP3.js} +75 -386
- package/dist/chunk-IUT3GWP3.js.map +1 -0
- package/dist/{chunk-RF6D3Y5E.js → chunk-JDEYF3PJ.js} +4 -8
- package/dist/{chunk-RF6D3Y5E.js.map → chunk-JDEYF3PJ.js.map} +1 -1
- package/dist/{chunk-PPTHY5QO.js → chunk-JIBUPZHA.js} +99 -8
- package/dist/chunk-JIBUPZHA.js.map +1 -0
- package/dist/{chunk-SMH6SRX7.js → chunk-JOSPH3E5.js} +2 -2
- package/dist/chunk-JQYKPKG6.js +193 -0
- package/dist/chunk-JQYKPKG6.js.map +1 -0
- package/dist/{chunk-7APJ6CO6.js → chunk-JSMTXZR3.js} +45 -13
- package/dist/chunk-JSMTXZR3.js.map +1 -0
- package/dist/chunk-JWWYRR4Q.js +12 -0
- package/dist/chunk-JWWYRR4Q.js.map +1 -0
- package/dist/{chunk-BVN6KXL2.js → chunk-KZXDLBY6.js} +14 -9
- package/dist/chunk-KZXDLBY6.js.map +1 -0
- package/dist/chunk-LGNDFRYC.js +23 -0
- package/dist/chunk-LGNDFRYC.js.map +1 -0
- package/dist/{chunk-XKWGNJ26.js → chunk-LIOVX5TJ.js} +7 -11
- package/dist/chunk-LIOVX5TJ.js.map +1 -0
- package/dist/{chunk-AYX7AINO.js → chunk-LNSVGRHO.js} +5 -7
- package/dist/chunk-LNSVGRHO.js.map +1 -0
- package/dist/chunk-M5B2W6YY.js +293 -0
- package/dist/chunk-M5B2W6YY.js.map +1 -0
- package/dist/chunk-MBMTND6D.js +456 -0
- package/dist/chunk-MBMTND6D.js.map +1 -0
- package/dist/{chunk-3BZZJJMQ.js → chunk-MILI22XQ.js} +3 -3
- package/dist/{chunk-A2HKRLPV.js → chunk-MXKI4ABF.js} +18 -59
- package/dist/chunk-MXKI4ABF.js.map +1 -0
- package/dist/{chunk-ZYIYHJ5R.js → chunk-MXOQ5JCG.js} +869 -238
- package/dist/chunk-MXOQ5JCG.js.map +1 -0
- package/dist/{chunk-V7ZRRCRJ.js → chunk-N7EVQD5S.js} +9 -13
- package/dist/chunk-N7EVQD5S.js.map +1 -0
- package/dist/chunk-N7UDP5VU.js +757 -0
- package/dist/chunk-N7UDP5VU.js.map +1 -0
- package/dist/chunk-NBQ3KK6X.js +270 -0
- package/dist/chunk-NBQ3KK6X.js.map +1 -0
- package/dist/{chunk-ZORTV6NH.js → chunk-NCO25JZO.js} +88 -4
- package/dist/chunk-NCO25JZO.js.map +1 -0
- package/dist/chunk-NH2UOV3B.js +18 -0
- package/dist/chunk-NH2UOV3B.js.map +1 -0
- package/dist/chunk-NYMLINRP.js +28 -0
- package/dist/chunk-NYMLINRP.js.map +1 -0
- package/dist/{chunk-YYP7WSEB.js → chunk-O2IMQSNA.js} +2 -2
- package/dist/chunk-O46CHQT7.js +215 -0
- package/dist/chunk-O46CHQT7.js.map +1 -0
- package/dist/chunk-OIEO4WDL.js +27 -0
- package/dist/chunk-OIEO4WDL.js.map +1 -0
- package/dist/{chunk-TRGTKX5E.js → chunk-OKSTSITU.js} +27 -4
- package/dist/chunk-OKSTSITU.js.map +1 -0
- package/dist/chunk-OYW3I5M4.js +31 -0
- package/dist/chunk-OYW3I5M4.js.map +1 -0
- package/dist/{chunk-Q7HZX3IF.js → chunk-PD64727P.js} +2 -2
- package/dist/chunk-PD64727P.js.map +1 -0
- package/dist/{chunk-FET5XCAT.js → chunk-PP3K67AJ.js} +34 -6
- package/dist/chunk-PP3K67AJ.js.map +1 -0
- package/dist/chunk-Q2XRFWOI.js +40 -0
- package/dist/chunk-Q2XRFWOI.js.map +1 -0
- package/dist/{chunk-QIZPZMUI.js → chunk-Q4UHJ5SN.js} +2 -2
- package/dist/{chunk-FAHMLERK.js → chunk-QBLT6POL.js} +2 -2
- package/dist/chunk-QMWY2FDS.js +157 -0
- package/dist/chunk-QMWY2FDS.js.map +1 -0
- package/dist/{chunk-LH5A3ZPG.js → chunk-RB4DOPGZ.js} +150 -22
- package/dist/chunk-RB4DOPGZ.js.map +1 -0
- package/dist/chunk-RHVMZSUU.js +7 -0
- package/dist/chunk-RHVMZSUU.js.map +1 -0
- package/dist/{chunk-BUE2D7PX.js → chunk-SMV2HRDU.js} +2 -2
- package/dist/chunk-SUZKW6UR.js +25 -0
- package/dist/chunk-SUZKW6UR.js.map +1 -0
- package/dist/{chunk-7MG7SJT7.js → chunk-SV2PM2OY.js} +1 -1
- package/dist/chunk-SV2PM2OY.js.map +1 -0
- package/dist/{chunk-UXVWEX5L.js → chunk-SYNY3VB5.js} +6 -2
- package/dist/chunk-SYNY3VB5.js.map +1 -0
- package/dist/{chunk-4GFX6MPA.js → chunk-TEHHROZL.js} +6 -8
- package/dist/chunk-TEHHROZL.js.map +1 -0
- package/dist/chunk-TKVUE4JF.js +1289 -0
- package/dist/chunk-TKVUE4JF.js.map +1 -0
- package/dist/{chunk-SFAWCTEM.js → chunk-TZZBXPZK.js} +2 -2
- package/dist/{chunk-F3W6YMDC.js → chunk-U2FZNEWJ.js} +4 -4
- package/dist/chunk-U2FZNEWJ.js.map +1 -0
- package/dist/{chunk-BLN54W3L.js → chunk-UA372JHH.js} +56 -3
- package/dist/chunk-UA372JHH.js.map +1 -0
- package/dist/{chunk-6YXCPL4T.js → chunk-UEFOQH74.js} +2 -2
- package/dist/chunk-UEFOQH74.js.map +1 -0
- package/dist/{chunk-2N5ML6HT.js → chunk-UIYESRD6.js} +9 -11
- package/dist/chunk-UIYESRD6.js.map +1 -0
- package/dist/{chunk-UHHPLO3I.js → chunk-V3RWOOSO.js} +4 -4
- package/dist/{chunk-KTFRCC5C.js → chunk-V7ADQF5O.js} +82 -8
- package/dist/chunk-V7ADQF5O.js.map +1 -0
- package/dist/{chunk-453F654R.js → chunk-VAORSCSU.js} +3 -3
- package/dist/chunk-VAORSCSU.js.map +1 -0
- package/dist/{chunk-GPNTB4Y7.js → chunk-VFHCKG5M.js} +6 -10
- package/dist/chunk-VFHCKG5M.js.map +1 -0
- package/dist/{chunk-2577DKXB.js → chunk-VHBKYN2J.js} +3 -3
- package/dist/chunk-VHBKYN2J.js.map +1 -0
- package/dist/chunk-VHM7HCKB.js +220 -0
- package/dist/chunk-VHM7HCKB.js.map +1 -0
- package/dist/{chunk-ZHKOPKE3.js → chunk-VKI2EB3N.js} +3 -3
- package/dist/chunk-VKI2EB3N.js.map +1 -0
- package/dist/{chunk-UDHWDSRL.js → chunk-VMV5SBE4.js} +16 -17
- package/dist/chunk-VMV5SBE4.js.map +1 -0
- package/dist/{chunk-SPYWXKJN.js → chunk-VQDZYB2B.js} +3 -3
- package/dist/chunk-VQDZYB2B.js.map +1 -0
- package/dist/{chunk-Q2PU57HC.js → chunk-VVOLDVIR.js} +2 -2
- package/dist/{chunk-3VF3WQ4F.js → chunk-WPOYWFSE.js} +7 -7
- package/dist/{chunk-3VF3WQ4F.js.map → chunk-WPOYWFSE.js.map} +1 -1
- package/dist/{chunk-OTQZ7ZWU.js → chunk-WXE4W2U6.js} +7 -11
- package/dist/chunk-WXE4W2U6.js.map +1 -0
- package/dist/chunk-XBKH4FOC.js +195 -0
- package/dist/chunk-XBKH4FOC.js.map +1 -0
- package/dist/{chunk-TUFM4UZP.js → chunk-XQRFSKYM.js} +2 -2
- package/dist/{chunk-3V4KWFX7.js → chunk-XSPFDUDG.js} +58 -53
- package/dist/chunk-XSPFDUDG.js.map +1 -0
- package/dist/{chunk-GY4WYNNG.js → chunk-Y2RKVFKR.js} +2 -2
- package/dist/{chunk-UP4BECPY.js → chunk-Y3LPTBG7.js} +89 -27
- package/dist/chunk-Y3LPTBG7.js.map +1 -0
- package/dist/{chunk-4OZNXTO4.js → chunk-YRXFFWG4.js} +2 -2
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-BWOFVYAC.js → classified-marker-SIYKUU5L.js} +3 -3
- package/dist/classified-marker-SIYKUU5L.js.map +1 -0
- package/dist/collection-facade-CS7CA2XO.js +47 -0
- package/dist/{computed-VPOKQK4N.js → computed-FAD7SED4.js} +3 -3
- package/dist/consent/index.js +10 -11
- package/dist/consent/index.js.map +1 -1
- package/dist/cover/index.js +10 -11
- package/dist/coverage/index.js +306 -0
- package/dist/coverage/index.js.map +1 -0
- package/dist/custody/index.js +12 -13
- package/dist/{dead-filter-PKQDLOT4.js → dead-filter-4F3LWYKH.js} +11 -3
- package/dist/dead-filter-4F3LWYKH.js.map +1 -0
- package/dist/debug/index.js +11 -2
- package/dist/debug/index.js.map +1 -1
- package/dist/{delegation-DS5NRILW.js → delegation-NANZDG4N.js} +13 -16
- package/dist/delegation-NANZDG4N.js.map +1 -0
- package/dist/derivations/index.js +25 -23
- package/dist/derive-XLOJVXPU.js +20 -0
- package/dist/directory/index.js +10 -11
- package/dist/{dispatch-IEPAVQUM.js → dispatch-H4HV32AM.js} +5 -5
- package/dist/{dispatch-Q6MWLOJY.js → dispatch-JDZNGEB3.js} +20 -21
- package/dist/dispatch-JDZNGEB3.js.map +1 -0
- package/dist/executor-FMPVN6DT.js +35 -0
- package/dist/executor-LBBBRTN5.js +8 -0
- package/dist/executor-OSRZST2U.js +8 -0
- package/dist/export-accessible-RAOJAAU5.js +22 -0
- package/dist/extract-partition-JD5CUSTG.js +37 -0
- package/dist/{fanout-sidecar-S3QL53YX.js → fanout-sidecar-L7NHPIOC.js} +13 -15
- package/dist/fanout-sidecar-L7NHPIOC.js.map +1 -0
- package/dist/find-JRN4RNQ5.js +10 -0
- package/dist/forget/index.js +9 -10
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +4 -4
- package/dist/history/index.js +13 -14
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +14 -15
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.d.ts +36 -14
- package/dist/index.js +970 -163
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +13 -5
- package/dist/indexing/index.js.map +1 -1
- package/dist/introspection/index.js +11 -12
- package/dist/issue-YIVBZUTH.js +19 -0
- package/dist/ivf-flat-UZ6DQDLS.js +314 -0
- package/dist/ivf-flat-UZ6DQDLS.js.map +1 -0
- package/dist/{json-schema-V3M5MUCM.js → json-schema-3SHX72CC.js} +2 -1
- package/dist/json-schema-3SHX72CC.js.map +1 -0
- package/dist/kernel/attestation-types.d.ts +62 -0
- package/dist/kernel/collection-config.d.ts +5 -68
- package/dist/kernel/collection.d.ts +30 -9
- package/dist/kernel/cutover-transform.d.ts +1 -1
- package/dist/kernel/errors.d.ts +257 -38
- package/dist/kernel/generation-map.d.ts +48 -0
- package/dist/kernel/merge-authority.d.ts +1 -1
- package/dist/kernel/noydb.d.ts +6 -1
- package/dist/kernel/paths.d.ts +29 -5
- package/dist/kernel/prepared-write.d.ts +1 -1
- package/dist/kernel/present-cache.d.ts +58 -0
- package/dist/kernel/query/all.d.ts +7 -0
- package/dist/kernel/query/builder.d.ts +601 -270
- package/dist/kernel/query/civil-date.d.ts +64 -0
- package/dist/kernel/query/cursor.d.ts +40 -0
- package/dist/kernel/query/distinct-key.d.ts +98 -0
- package/dist/kernel/query/hydration.d.ts +76 -0
- package/dist/kernel/query/index.d.ts +31 -15
- package/dist/kernel/query/internal/core.d.ts +30 -0
- package/dist/kernel/query/internal/hooks.d.ts +22 -0
- package/dist/kernel/query/internal/maintenance.d.ts +43 -0
- package/dist/kernel/query/live/incremental.d.ts +314 -0
- package/dist/kernel/query/live/index.d.ts +22 -0
- package/dist/kernel/query/live/install.d.ts +2 -0
- package/dist/kernel/query/{live.d.ts → live/live.d.ts} +39 -9
- package/dist/kernel/query/live/methods.d.ts +107 -0
- package/dist/kernel/query/predicate.d.ts +119 -1
- package/dist/kernel/query/reduce/date-trunc.d.ts +75 -0
- package/dist/kernel/query/reduce/index.d.ts +36 -0
- package/dist/kernel/query/reduce/install.d.ts +2 -0
- package/dist/kernel/query/reduce/methods.d.ts +259 -0
- package/dist/kernel/query/reduce/scan-methods.d.ts +121 -0
- package/dist/kernel/query/relate/explain.d.ts +199 -0
- package/dist/kernel/query/relate/index.d.ts +48 -0
- package/dist/kernel/query/relate/install.d.ts +2 -0
- package/dist/kernel/query/relate/join-on.d.ts +126 -0
- package/dist/kernel/query/relate/join-reduce.d.ts +16 -0
- package/dist/kernel/query/relate/join.d.ts +452 -0
- package/dist/kernel/query/relate/methods.d.ts +426 -0
- package/dist/kernel/query/relate/partition.d.ts +87 -0
- package/dist/kernel/query/relate/scan-methods.d.ts +163 -0
- package/dist/kernel/query/relate/traverse.d.ts +109 -0
- package/dist/kernel/query/scan-builder.d.ts +79 -176
- package/dist/kernel/query/sort-key.d.ts +52 -0
- package/dist/kernel/secret-mode.d.ts +1 -1
- package/dist/kernel/tx-write-gate.d.ts +77 -0
- package/dist/kernel/types.d.ts +113 -8
- package/dist/kernel/validation.d.ts +27 -10
- package/dist/kernel/vault.d.ts +11 -6
- package/dist/kernel/via/compose.d.ts +3 -0
- package/dist/kernel/via/index.d.ts +56 -0
- package/dist/kernel/via/pipeline.d.ts +48 -0
- package/dist/kernel/write-queue.d.ts +17 -0
- package/dist/{ledger-EDXFFZQL.js → ledger-5ZMGE44K.js} +11 -12
- package/dist/liberate-WZSZM2W6.js +24 -0
- package/dist/link-set-MFXC24VK.js +29 -0
- package/dist/{managed-secret-NCWEMPUQ.js → managed-secret-MFTFT22X.js} +10 -11
- package/dist/materialized-views/index.js +30 -24
- package/dist/{migrate-cek-5ENH64AA.js → migrate-cek-DZRFFOHW.js} +2 -2
- package/dist/money/index.js +5 -5
- package/dist/noydb-ITIGNKUF.js +96 -0
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +12 -13
- package/dist/pod/index.js +74 -67
- package/dist/{pod-handle-ECVCDIXW.js → pod-handle-A3LET7NO.js} +10 -11
- package/dist/pod-handle-A3LET7NO.js.map +1 -0
- package/dist/policy/index.js +10 -11
- package/dist/port/on/index.d.ts +1 -1
- package/dist/port/to/index.d.ts +1 -1
- package/dist/port/with/blob-strategy.d.ts +10 -1
- package/dist/port/with/classified-strategy.d.ts +1 -1
- package/dist/port/with/collection-options.d.ts +6 -1
- package/dist/port/with/collection-registries.d.ts +1 -1
- package/dist/port/with/coverage-strategy.d.ts +83 -0
- package/dist/port/with/lookup-strategy.d.ts +2 -2
- package/dist/port/with/service-bus.d.ts +46 -0
- package/dist/port/with/strategies.d.ts +2 -0
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-3IPCSG6Q.js → post-register-7ND27CF2.js} +6 -6
- package/dist/post-register-7ND27CF2.js.map +1 -0
- package/dist/query/all/index.js +31 -0
- package/dist/query/index.js +20 -32
- package/dist/query/live/index.js +21 -0
- package/dist/query/live/index.js.map +1 -0
- package/dist/query/reduce/index.js +33 -0
- package/dist/query/reduce/index.js.map +1 -0
- package/dist/query/relate/index.js +56 -0
- package/dist/query/relate/index.js.map +1 -0
- package/dist/reduce/index.js +72 -18
- package/dist/reduce/index.js.map +1 -1
- package/dist/register-DT5HZ2LZ.js +30 -0
- package/dist/registry-BHRZGZHF.js +8 -0
- package/dist/registry-ET6ZFFWA.js +34 -0
- package/dist/registry-HXFGLGTG.js +8 -0
- package/dist/registry-THCPDEOD.js +23 -0
- package/dist/request-withdrawal-AV2MJJKY.js +30 -0
- package/dist/{reveal-QZDHSGD4.js → reveal-B2TLP4JQ.js} +10 -9
- package/dist/reveal-B2TLP4JQ.js.map +1 -0
- package/dist/revoke-6DWIEOCV.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +2 -2
- package/dist/sealed-record/index.js +16 -18
- package/dist/sealed-record/index.js.map +1 -1
- package/dist/search/index.js +11 -5
- package/dist/{seed-X5CC22CQ.js → seed-XNSE4U3S.js} +15 -18
- package/dist/seed-XNSE4U3S.js.map +1 -0
- package/dist/sequence/index.js +9 -10
- package/dist/session/index.js +9 -10
- package/dist/session/index.js.map +1 -1
- package/dist/shadow/index.js +2 -2
- package/dist/signer-MHGW3OIL.js +23 -0
- package/dist/snapshots/index.js +11 -11
- package/dist/stale-6GCFMOOR.js +28 -0
- package/dist/storage-BYN5LO6Z.js +21 -0
- package/dist/storage-BYN5LO6Z.js.map +1 -0
- package/dist/store/index.js +1 -1
- package/dist/{store-coordination-provider-4WZAIRHC.js → store-coordination-provider-C4BPT5XF.js} +11 -12
- package/dist/store-coordination-provider-C4BPT5XF.js.map +1 -0
- package/dist/sync/index.js +10 -11
- package/dist/sync/index.js.map +1 -1
- package/dist/team/index.js +17 -16
- package/dist/tiers/index.js +13 -12
- package/dist/to/index.js +2 -2
- package/dist/transactions/index.js +3 -3
- package/dist/util/index.js +1 -1
- package/dist/vault-head/index.js +11 -14
- package/dist/vault-head/index.js.map +1 -1
- package/dist/{verify-6MDTIUEV.js → verify-UKALW7C2.js} +14 -12
- package/dist/verify-UKALW7C2.js.map +1 -0
- package/dist/via/blob/index.d.ts +1 -0
- package/dist/via/classified/binding.d.ts +2 -2
- package/dist/via/classified/config-drift.d.ts +2 -2
- package/dist/via/classified/errors.d.ts +1 -1
- package/dist/via/geo/binding.d.ts +31 -0
- package/dist/via/geo/descriptor.d.ts +54 -0
- package/dist/via/geo/geohash.d.ts +95 -0
- package/dist/via/geo/index.d.ts +13 -0
- package/dist/via/geo/where.d.ts +50 -0
- package/dist/via/i18n/core.d.ts +1 -1
- package/dist/via/lookup/handle.d.ts +4 -4
- package/dist/via/lookup/registry.d.ts +1 -1
- package/dist/via/lookup/snapshot.d.ts +3 -3
- package/dist/walk-4VPK7AS4.js +20 -0
- package/dist/walk-4VPK7AS4.js.map +1 -0
- package/dist/with-audit/attestation/index.d.ts +2 -1
- package/dist/with-audit/attestation/issue.d.ts +2 -2
- package/dist/with-audit/attestation/revoke.d.ts +2 -2
- package/dist/with-audit/attestation/scheme.d.ts +7 -0
- package/dist/with-audit/attestation/signer.d.ts +1 -1
- package/dist/with-audit/attestation/strategy.d.ts +2 -2
- package/dist/with-audit/attestation/types.d.ts +10 -0
- package/dist/with-audit/attestation/vault-facade.d.ts +2 -2
- package/dist/with-audit/attestation/verifier.d.ts +6 -0
- package/dist/with-audit/consent/consent.d.ts +1 -1
- package/dist/with-audit/consent/strategy.d.ts +1 -1
- package/dist/with-audit/coverage/accounting.d.ts +112 -0
- package/dist/with-audit/coverage/active.d.ts +29 -0
- package/dist/with-audit/coverage/index.d.ts +61 -0
- package/dist/with-audit/coverage/sketch.d.ts +75 -0
- package/dist/with-audit/forget/subject-index.d.ts +1 -1
- package/dist/with-audit/periods/periods.d.ts +55 -7
- package/dist/with-audit/periods/reserved-collections.d.ts +3 -0
- package/dist/with-audit/periods/vault-facade.d.ts +18 -1
- package/dist/with-audit/sealed-record/index.d.ts +2 -2
- package/dist/with-audit/sealed-record/strategy.d.ts +1 -1
- package/dist/with-audit/tiers/index.d.ts +53 -2
- package/dist/with-audit/tiers/strategy.d.ts +8 -0
- package/dist/with-cargo/adopt-partition.d.ts +1 -1
- package/dist/with-cargo/extract-partition.d.ts +1 -1
- package/dist/with-cargo/floor.d.ts +3 -3
- package/dist/with-commit/history/history.d.ts +2 -2
- package/dist/with-commit/history/index.d.ts +1 -1
- package/dist/with-commit/history/ledger/store.d.ts +1 -1
- package/dist/with-commit/history/strategy.d.ts +1 -1
- package/dist/with-commit/history/time-machine.d.ts +1 -1
- package/dist/with-commit/numbering/index.d.ts +1 -1
- package/dist/with-commit/sequence/index.d.ts +1 -1
- package/dist/with-commit/tx/invariants.d.ts +1 -1
- package/dist/with-commit/tx/transaction.d.ts +13 -3
- package/dist/with-commit/vault-head/head.d.ts +1 -1
- package/dist/with-commit/vault-head/index.d.ts +1 -1
- package/dist/with-commit/vault-head/strategy.d.ts +1 -1
- package/dist/with-commit/vault-head/verify.d.ts +1 -1
- package/dist/with-formula/derivations/dispatch.d.ts +1 -1
- package/dist/with-formula/derivations/fanout-sidecar.d.ts +1 -1
- package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +4 -3
- package/dist/with-formula/materialized-views/emit-memo.d.ts +40 -0
- package/dist/with-formula/materialized-views/executor.d.ts +8 -0
- package/dist/with-formula/materialized-views/index.d.ts +1 -1
- package/dist/with-formula/materialized-views/registry.d.ts +15 -0
- package/dist/with-formula/materialized-views/types.d.ts +106 -14
- package/dist/with-formula/materialized-views/window-stage.d.ts +11 -0
- package/dist/with-formula/overlay-views/types.d.ts +1 -1
- package/dist/with-formula/overlay-views/virtual-collection.d.ts +13 -4
- package/dist/with-lookup/embeddings/chunks.d.ts +79 -0
- package/dist/with-lookup/embeddings/descriptor.d.ts +21 -0
- package/dist/with-lookup/embeddings/index.d.ts +3 -0
- package/dist/with-lookup/embeddings/ivf-flat.d.ts +93 -0
- package/dist/with-lookup/embeddings/vector-index.d.ts +73 -0
- package/dist/with-lookup/embeddings/vector-set.d.ts +94 -1
- package/dist/with-lookup/embeddings/with-vector-index.d.ts +67 -0
- package/dist/with-lookup/indexing/collection-facade.d.ts +86 -3
- package/dist/with-lookup/indexing/compound-indexes.d.ts +129 -0
- package/dist/with-lookup/indexing/eager-indexes.d.ts +170 -1
- package/dist/with-lookup/indexing/index-snapshot.d.ts +62 -0
- package/dist/with-lookup/indexing/lazy-builder.d.ts +33 -0
- package/dist/with-lookup/indexing/persisted-field-indexes.d.ts +104 -0
- package/dist/with-lookup/indexing/persisted-indexes.d.ts +12 -0
- package/dist/with-lookup/indexing/sorted-indexes.d.ts +117 -0
- package/dist/with-lookup/indexing/unique-constraints.d.ts +106 -23
- package/dist/with-lookup/reduce/active.d.ts +2 -24
- package/dist/with-lookup/reduce/group-core.d.ts +43 -0
- package/dist/with-lookup/reduce/groupby.d.ts +195 -36
- package/dist/with-lookup/reduce/incremental-group.d.ts +153 -0
- package/dist/with-lookup/reduce/index.d.ts +26 -5
- package/dist/with-lookup/reduce/reducers.d.ts +255 -1
- package/dist/with-lookup/reduce/reduction.d.ts +44 -13
- package/dist/with-lookup/reduce/strategy.d.ts +43 -3
- package/dist/with-lookup/reduce/window.d.ts +262 -0
- package/dist/with-lookup/search/collection-facade.d.ts +45 -9
- package/dist/with-lookup/search/index-store.d.ts +5 -3
- package/dist/with-lookup/search/index.d.ts +4 -2
- package/dist/with-lookup/search/inverted-index.d.ts +38 -2
- package/dist/with-lookup/search/persisted-index-store.d.ts +5 -2
- package/dist/with-lookup/search/phrase.d.ts +28 -0
- package/dist/with-lookup/search/retrieve-types.d.ts +57 -1
- package/dist/with-lookup/search/serialize.d.ts +29 -3
- package/dist/with-lookup/search/strategy.d.ts +2 -6
- package/dist/with-party/broker/index.d.ts +3 -3
- package/dist/with-party/directory/cover/index.d.ts +1 -1
- package/dist/with-party/directory/cover/storage.d.ts +1 -1
- package/dist/with-party/directory/cover/types.d.ts +1 -1
- package/dist/with-party/directory/index.d.ts +1 -1
- package/dist/with-party/directory/types.d.ts +1 -1
- package/dist/with-party/directory/user-envelope/api.d.ts +1 -1
- package/dist/with-party/directory/user-envelope/storage.d.ts +1 -1
- package/dist/with-party/policy/engine.d.ts +1 -1
- package/dist/with-party/policy/index.d.ts +1 -1
- package/dist/with-party/policy/presets.d.ts +1 -1
- package/dist/with-party/team/authenticators.d.ts +91 -1
- package/dist/with-party/team/delegation.d.ts +1 -1
- package/dist/with-party/team/echo-secret.d.ts +2 -2
- package/dist/with-party/team/index.d.ts +4 -3
- package/dist/with-party/team/keyring.d.ts +2 -2
- package/dist/with-party/team/magic-link-grant.d.ts +1 -1
- package/dist/with-party/team/managed-secret.d.ts +1 -1
- package/dist/with-party/team/noydb-facade.d.ts +12 -3
- package/dist/with-party/team/recovery.d.ts +1 -1
- package/dist/with-party/team/roster-tag.d.ts +1 -1
- package/dist/with-party/team/rotate-recover.d.ts +1 -1
- package/dist/with-party/team/wrapped-deks.d.ts +1 -1
- package/dist/with-pod/format.d.ts +1 -1
- package/dist/with-pod/index.d.ts +1 -1
- package/dist/with-pod/pod.d.ts +1 -1
- package/dist/with-shape/blobs/blob-compaction.d.ts +17 -1
- package/dist/with-shape/blobs/blob-intent.d.ts +1 -1
- package/dist/with-shape/blobs/blob-set.d.ts +23 -4
- package/dist/with-shape/blobs/legacy-sweep.d.ts +35 -0
- package/dist/with-shape/introspection/describe.d.ts +7 -1
- package/dist/with-shape/introspection/field-meta.d.ts +18 -0
- package/dist/with-shape/introspection/types.d.ts +57 -1
- package/dist/with-shape/introspection/walk.d.ts +1 -1
- package/dist/with-shape/links/lazy-handle.d.ts +1 -1
- package/dist/with-shape/links/link-set.d.ts +1 -1
- package/dist/with-shape/links/vault-facade.d.ts +1 -1
- package/dist/with-shape/manifest/derive.d.ts +1 -1
- package/dist/with-shape/manifest/storage.d.ts +1 -1
- package/dist/with-shape/persisted-schemas/register.d.ts +1 -1
- package/dist/with-shape/persisted-schemas/storage.d.ts +1 -1
- package/dist/with-shape/satellites/dead-filter.d.ts +1 -1
- package/dist/with-shape/satellites/declare.d.ts +1 -1
- package/dist/with-shape/satellites/marker.d.ts +1 -1
- package/dist/with-shape/satellites/post-register.d.ts +1 -1
- package/dist/with-store/partitioned/index.d.ts +337 -0
- package/dist/with-sync/change-broadcast.d.ts +153 -0
- package/dist/with-sync/presence.d.ts +5 -10
- package/dist/withdraw-accessible-HL7GACUE.js +27 -0
- package/dist/withdraw-accessible-HL7GACUE.js.map +1 -0
- package/package.json +48 -12
- package/dist/api-WYW4YEQG.js +0 -19
- package/dist/backup-XKCXVKV3.js.map +0 -1
- package/dist/chunk-2577DKXB.js.map +0 -1
- package/dist/chunk-2ENE6445.js.map +0 -1
- package/dist/chunk-2N5ML6HT.js.map +0 -1
- package/dist/chunk-334WSVOW.js.map +0 -1
- package/dist/chunk-3BVH633C.js.map +0 -1
- package/dist/chunk-3PGS7TYR.js.map +0 -1
- package/dist/chunk-3V4KWFX7.js.map +0 -1
- package/dist/chunk-453F654R.js.map +0 -1
- package/dist/chunk-4GFX6MPA.js.map +0 -1
- package/dist/chunk-4GVM6QZA.js.map +0 -1
- package/dist/chunk-4ZS56W5S.js.map +0 -1
- package/dist/chunk-5VCRVKOZ.js.map +0 -1
- package/dist/chunk-6YXCPL4T.js.map +0 -1
- package/dist/chunk-7APJ6CO6.js.map +0 -1
- package/dist/chunk-7MG2LHO5.js +0 -1616
- package/dist/chunk-7MG2LHO5.js.map +0 -1
- package/dist/chunk-7MG7SJT7.js.map +0 -1
- package/dist/chunk-7O3Y4PPD.js.map +0 -1
- package/dist/chunk-A2HKRLPV.js.map +0 -1
- package/dist/chunk-A66I4JOA.js.map +0 -1
- package/dist/chunk-ACAQ2DSG.js.map +0 -1
- package/dist/chunk-ATL3ZVXT.js +0 -151
- package/dist/chunk-ATL3ZVXT.js.map +0 -1
- package/dist/chunk-AYX7AINO.js.map +0 -1
- package/dist/chunk-BLN54W3L.js.map +0 -1
- package/dist/chunk-BRLKZUBT.js +0 -95
- package/dist/chunk-BRLKZUBT.js.map +0 -1
- package/dist/chunk-BTDR2PXY.js +0 -29
- package/dist/chunk-BTDR2PXY.js.map +0 -1
- package/dist/chunk-BVN6KXL2.js.map +0 -1
- package/dist/chunk-CHQCZZWC.js.map +0 -1
- package/dist/chunk-CUQPWYRX.js.map +0 -1
- package/dist/chunk-CUZLNGD5.js.map +0 -1
- package/dist/chunk-DFMWUOU5.js.map +0 -1
- package/dist/chunk-EIPVYUEP.js.map +0 -1
- package/dist/chunk-EQEYOJBM.js.map +0 -1
- package/dist/chunk-F3W6YMDC.js.map +0 -1
- package/dist/chunk-FET5XCAT.js.map +0 -1
- package/dist/chunk-G73UVHCA.js.map +0 -1
- package/dist/chunk-GPNTB4Y7.js.map +0 -1
- package/dist/chunk-GYGLAVCX.js.map +0 -1
- package/dist/chunk-HIWCKBEY.js.map +0 -1
- package/dist/chunk-HJUWN7JN.js.map +0 -1
- package/dist/chunk-HK67PX4J.js.map +0 -1
- package/dist/chunk-HPVZCW43.js +0 -479
- package/dist/chunk-HPVZCW43.js.map +0 -1
- package/dist/chunk-I3ISCYT7.js +0 -159
- package/dist/chunk-I3ISCYT7.js.map +0 -1
- package/dist/chunk-K23VKTN4.js.map +0 -1
- package/dist/chunk-KKEESNPE.js.map +0 -1
- package/dist/chunk-KTFRCC5C.js.map +0 -1
- package/dist/chunk-LH5A3ZPG.js.map +0 -1
- package/dist/chunk-LP7BEXCT.js +0 -32
- package/dist/chunk-LP7BEXCT.js.map +0 -1
- package/dist/chunk-M4YPHYEH.js.map +0 -1
- package/dist/chunk-NSITFOCJ.js +0 -99
- package/dist/chunk-NSITFOCJ.js.map +0 -1
- package/dist/chunk-OTQZ7ZWU.js.map +0 -1
- package/dist/chunk-P3MG6QCN.js.map +0 -1
- package/dist/chunk-PEOZ34EM.js.map +0 -1
- package/dist/chunk-PPTHY5QO.js.map +0 -1
- package/dist/chunk-Q2MPFCQ7.js.map +0 -1
- package/dist/chunk-Q7HZX3IF.js.map +0 -1
- package/dist/chunk-QPQUVOZ2.js.map +0 -1
- package/dist/chunk-QTQUH4DS.js.map +0 -1
- package/dist/chunk-R42NSZI6.js.map +0 -1
- package/dist/chunk-R7BX2NB3.js.map +0 -1
- package/dist/chunk-RSGLUIO6.js.map +0 -1
- package/dist/chunk-RTBJ5IOO.js +0 -87
- package/dist/chunk-RTBJ5IOO.js.map +0 -1
- package/dist/chunk-SGZAIJCV.js.map +0 -1
- package/dist/chunk-SKGMN35F.js.map +0 -1
- package/dist/chunk-SPYWXKJN.js.map +0 -1
- package/dist/chunk-SZJ3DLZA.js +0 -66
- package/dist/chunk-SZJ3DLZA.js.map +0 -1
- package/dist/chunk-TRGTKX5E.js.map +0 -1
- package/dist/chunk-UDHWDSRL.js.map +0 -1
- package/dist/chunk-UP4BECPY.js.map +0 -1
- package/dist/chunk-UXVWEX5L.js.map +0 -1
- package/dist/chunk-V7ZRRCRJ.js.map +0 -1
- package/dist/chunk-WQBG4SZS.js.map +0 -1
- package/dist/chunk-XKWGNJ26.js.map +0 -1
- package/dist/chunk-YMUFFJCO.js.map +0 -1
- package/dist/chunk-ZHKOPKE3.js.map +0 -1
- package/dist/chunk-ZN4FD4PE.js +0 -364
- package/dist/chunk-ZN4FD4PE.js.map +0 -1
- package/dist/chunk-ZORTV6NH.js.map +0 -1
- package/dist/chunk-ZYIYHJ5R.js.map +0 -1
- package/dist/classified-marker-BWOFVYAC.js.map +0 -1
- package/dist/collection-facade-JSJYIKS4.js +0 -45
- package/dist/dead-filter-PKQDLOT4.js.map +0 -1
- package/dist/delegation-DS5NRILW.js.map +0 -1
- package/dist/derive-E642AOUB.js +0 -21
- package/dist/dispatch-Q6MWLOJY.js.map +0 -1
- package/dist/executor-5NIMLSKZ.js +0 -8
- package/dist/executor-7UQ3BZ4F.js +0 -29
- package/dist/executor-AQVXV5GZ.js +0 -8
- package/dist/export-accessible-ORMKLA3E.js +0 -22
- package/dist/extract-partition-NKYO3WNG.js +0 -37
- package/dist/fanout-sidecar-S3QL53YX.js.map +0 -1
- package/dist/find-NOGJ25VX.js +0 -10
- package/dist/issue-3DTQ7VJJ.js +0 -18
- package/dist/json-schema-V3M5MUCM.js.map +0 -1
- package/dist/kernel/enclave/classify/compare.d.ts +0 -10
- package/dist/kernel/enclave/index.d.ts +0 -87
- package/dist/kernel/enclave/record-keys/lifecycle.d.ts +0 -124
- package/dist/kernel/enclave/record-keys/rekey-blob.d.ts +0 -88
- package/dist/kernel/enclave/record-keys/rekey.d.ts +0 -91
- package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +0 -14
- package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +0 -123
- package/dist/kernel/enclave/record-keys/sealing.d.ts +0 -70
- package/dist/kernel/query/join.d.ts +0 -232
- package/dist/liberate-V35QUHJP.js +0 -24
- package/dist/link-set-2TTM3IZC.js +0 -30
- package/dist/noydb-62MX4QUG.js +0 -90
- package/dist/pod-handle-ECVCDIXW.js.map +0 -1
- package/dist/post-register-3IPCSG6Q.js.map +0 -1
- package/dist/register-HHLXEQDN.js +0 -31
- package/dist/registry-23WF3TGH.js +0 -8
- package/dist/registry-4AYVUNXK.js +0 -8
- package/dist/registry-JS3YFQQM.js +0 -18
- package/dist/registry-XX2Z7B46.js +0 -32
- package/dist/request-withdrawal-CHPATE4G.js +0 -30
- package/dist/reveal-QZDHSGD4.js.map +0 -1
- package/dist/revoke-7M2VW4ON.js +0 -23
- package/dist/seed-X5CC22CQ.js.map +0 -1
- package/dist/signer-SJQJVSM6.js +0 -24
- package/dist/stale-BZS6H2RY.js +0 -29
- package/dist/storage-RW4QBS23.js +0 -22
- package/dist/store-coordination-provider-4WZAIRHC.js.map +0 -1
- package/dist/verify-6MDTIUEV.js.map +0 -1
- package/dist/walk-ZURCH6RZ.js +0 -21
- package/dist/withdraw-accessible-PXR4IXDX.js +0 -27
- /package/dist/{api-WYW4YEQG.js.map → api-OS747DS4.js.map} +0 -0
- /package/dist/{computed-VPOKQK4N.js.map → capsule/contract.js.map} +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/broker/proof.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/bidx.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/digest.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/vdig.d.ts +0 -0
- /package/dist/{kernel/enclave/classify → capsule/plumbing}/kofn.d.ts +0 -0
- /package/dist/{kernel/enclave/classify → capsule/plumbing}/normalize.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/plumbing}/record-aad.d.ts +0 -0
- /package/dist/{collection-facade-JSJYIKS4.js.map → capsule-VOLX3QRQ.js.map} +0 -0
- /package/dist/{chunk-MVMXZYXT.js.map → chunk-2GHDLTPE.js.map} +0 -0
- /package/dist/{chunk-XLMEZIAJ.js.map → chunk-2ODVB6LZ.js.map} +0 -0
- /package/dist/{chunk-RMS3NEA3.js.map → chunk-4JPMZTJY.js.map} +0 -0
- /package/dist/{chunk-NQKIUNW5.js.map → chunk-52MGURXO.js.map} +0 -0
- /package/dist/{chunk-UGTBXF5U.js.map → chunk-7XMHMVTS.js.map} +0 -0
- /package/dist/{chunk-BZ3534YM.js.map → chunk-AUKKUPVB.js.map} +0 -0
- /package/dist/{derive-E642AOUB.js.map → chunk-BKT776R5.js.map} +0 -0
- /package/dist/{chunk-6LKOJBV6.js.map → chunk-BVCUTXE3.js.map} +0 -0
- /package/dist/{chunk-VTFVLCUH.js.map → chunk-DIZLQVAA.js.map} +0 -0
- /package/dist/{chunk-LWBCUYZW.js.map → chunk-E2N2T5ZO.js.map} +0 -0
- /package/dist/{chunk-JVIBCBC7.js.map → chunk-EJLV62NI.js.map} +0 -0
- /package/dist/{chunk-JMGDHKQF.js.map → chunk-FLPCETP6.js.map} +0 -0
- /package/dist/{chunk-DGOZ4UZD.js.map → chunk-FVH5QYY2.js.map} +0 -0
- /package/dist/{chunk-JBDFMYKQ.js.map → chunk-GZT3NQRA.js.map} +0 -0
- /package/dist/{chunk-TFR7DSOV.js.map → chunk-H427H63K.js.map} +0 -0
- /package/dist/{chunk-SMH6SRX7.js.map → chunk-JOSPH3E5.js.map} +0 -0
- /package/dist/{chunk-3BZZJJMQ.js.map → chunk-MILI22XQ.js.map} +0 -0
- /package/dist/{chunk-YYP7WSEB.js.map → chunk-O2IMQSNA.js.map} +0 -0
- /package/dist/{chunk-QIZPZMUI.js.map → chunk-Q4UHJ5SN.js.map} +0 -0
- /package/dist/{chunk-FAHMLERK.js.map → chunk-QBLT6POL.js.map} +0 -0
- /package/dist/{chunk-BUE2D7PX.js.map → chunk-SMV2HRDU.js.map} +0 -0
- /package/dist/{chunk-SFAWCTEM.js.map → chunk-TZZBXPZK.js.map} +0 -0
- /package/dist/{chunk-UHHPLO3I.js.map → chunk-V3RWOOSO.js.map} +0 -0
- /package/dist/{chunk-Q2PU57HC.js.map → chunk-VVOLDVIR.js.map} +0 -0
- /package/dist/{chunk-TUFM4UZP.js.map → chunk-XQRFSKYM.js.map} +0 -0
- /package/dist/{chunk-GY4WYNNG.js.map → chunk-Y2RKVFKR.js.map} +0 -0
- /package/dist/{chunk-4OZNXTO4.js.map → chunk-YRXFFWG4.js.map} +0 -0
- /package/dist/{enclave-55PAM4YO.js.map → collection-facade-CS7CA2XO.js.map} +0 -0
- /package/dist/{executor-5NIMLSKZ.js.map → computed-FAD7SED4.js.map} +0 -0
- /package/dist/{executor-7UQ3BZ4F.js.map → derive-XLOJVXPU.js.map} +0 -0
- /package/dist/{dispatch-IEPAVQUM.js.map → dispatch-H4HV32AM.js.map} +0 -0
- /package/dist/{executor-AQVXV5GZ.js.map → executor-FMPVN6DT.js.map} +0 -0
- /package/dist/{export-accessible-ORMKLA3E.js.map → executor-LBBBRTN5.js.map} +0 -0
- /package/dist/{extract-partition-NKYO3WNG.js.map → executor-OSRZST2U.js.map} +0 -0
- /package/dist/{find-NOGJ25VX.js.map → export-accessible-RAOJAAU5.js.map} +0 -0
- /package/dist/{issue-3DTQ7VJJ.js.map → extract-partition-JD5CUSTG.js.map} +0 -0
- /package/dist/{ledger-EDXFFZQL.js.map → find-JRN4RNQ5.js.map} +0 -0
- /package/dist/{liberate-V35QUHJP.js.map → issue-YIVBZUTH.js.map} +0 -0
- /package/dist/{link-set-2TTM3IZC.js.map → ledger-5ZMGE44K.js.map} +0 -0
- /package/dist/{managed-secret-NCWEMPUQ.js.map → liberate-WZSZM2W6.js.map} +0 -0
- /package/dist/{noydb-62MX4QUG.js.map → link-set-MFXC24VK.js.map} +0 -0
- /package/dist/{register-HHLXEQDN.js.map → managed-secret-MFTFT22X.js.map} +0 -0
- /package/dist/{migrate-cek-5ENH64AA.js.map → migrate-cek-DZRFFOHW.js.map} +0 -0
- /package/dist/{registry-23WF3TGH.js.map → noydb-ITIGNKUF.js.map} +0 -0
- /package/dist/{registry-4AYVUNXK.js.map → query/all/index.js.map} +0 -0
- /package/dist/{registry-JS3YFQQM.js.map → register-DT5HZ2LZ.js.map} +0 -0
- /package/dist/{registry-XX2Z7B46.js.map → registry-BHRZGZHF.js.map} +0 -0
- /package/dist/{request-withdrawal-CHPATE4G.js.map → registry-ET6ZFFWA.js.map} +0 -0
- /package/dist/{revoke-7M2VW4ON.js.map → registry-HXFGLGTG.js.map} +0 -0
- /package/dist/{signer-SJQJVSM6.js.map → registry-THCPDEOD.js.map} +0 -0
- /package/dist/{stale-BZS6H2RY.js.map → request-withdrawal-AV2MJJKY.js.map} +0 -0
- /package/dist/{storage-RW4QBS23.js.map → revoke-6DWIEOCV.js.map} +0 -0
- /package/dist/{walk-ZURCH6RZ.js.map → signer-MHGW3OIL.js.map} +0 -0
- /package/dist/{withdraw-accessible-PXR4IXDX.js.map → stale-6GCFMOOR.js.map} +0 -0
|
@@ -7,13 +7,15 @@
|
|
|
7
7
|
import type { QueryField } from '../types.js';
|
|
8
8
|
import type { Clause, Operator } from './predicate.js';
|
|
9
9
|
import type { CollectionIndexes } from '../../with-lookup/indexing/eager-indexes.js';
|
|
10
|
-
import type { JoinContext, JoinLeg
|
|
11
|
-
import type {
|
|
12
|
-
import type {
|
|
13
|
-
import type { ReducerBuilder } from '../../with-lookup/reduce/reducers.js';
|
|
14
|
-
import type { GroupedQuery, GroupedQueryN } from '../../with-lookup/reduce/groupby.js';
|
|
10
|
+
import type { JoinContext, JoinLeg } from './relate/join.js';
|
|
11
|
+
import type { HydrationGate } from './hydration.js';
|
|
12
|
+
import type { SourceChange } from './live/incremental.js';
|
|
15
13
|
import { type ReduceStrategy } from '../../with-lookup/reduce/strategy.js';
|
|
16
14
|
import type { ViaPipeline } from '../via/pipeline.js';
|
|
15
|
+
export declare function splitAroundJoins(clauses: readonly Clause[], joins: readonly JoinLeg[]): {
|
|
16
|
+
readonly preJoin: readonly Clause[];
|
|
17
|
+
readonly postJoin: readonly Clause[];
|
|
18
|
+
};
|
|
17
19
|
export interface OrderBy {
|
|
18
20
|
readonly field: string;
|
|
19
21
|
readonly direction: 'asc' | 'desc';
|
|
@@ -41,6 +43,16 @@ export interface QueryPlan {
|
|
|
41
43
|
readonly orderBy: readonly OrderBy[];
|
|
42
44
|
readonly limit: number | undefined;
|
|
43
45
|
readonly offset: number;
|
|
46
|
+
/**
|
|
47
|
+
* Opaque keyset cursor from `.after(cursor)` (#1346). When present, the
|
|
48
|
+
* window starts strictly after the `(sortKey, id)` the cursor names,
|
|
49
|
+
* instead of at a positional offset.
|
|
50
|
+
*
|
|
51
|
+
* OPTIONAL, unlike its `limit`/`offset` neighbours: `QueryPlan` is an
|
|
52
|
+
* exported type that consumers construct, so a required new property would
|
|
53
|
+
* be a breaking change where an optional one is additive.
|
|
54
|
+
*/
|
|
55
|
+
readonly after?: string | undefined;
|
|
44
56
|
/**
|
|
45
57
|
* Zero-or-more join legs to apply after where/orderBy/limit/offset.
|
|
46
58
|
* Each leg attaches a resolved right-side record (or null) under its
|
|
@@ -48,8 +60,72 @@ export interface QueryPlan {
|
|
|
48
60
|
*/
|
|
49
61
|
readonly joins: readonly JoinLeg[];
|
|
50
62
|
}
|
|
51
|
-
/**
|
|
52
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Guard for the terminals that reduce rather than project (#1030). Grouping
|
|
65
|
+
* or aggregating over a joined alias silently bucketed every row under
|
|
66
|
+
* `undefined`, because these terminals never apply join legs at all.
|
|
67
|
+
*
|
|
68
|
+
* ⭐ **`aggregate()` and `groupBy()` NO LONGER CALL THIS — #1338 supplied the
|
|
69
|
+
* work the analysis below specifies, and they route instead of refusing.**
|
|
70
|
+
* The remaining caller is `distinct()`, whose Via question is a different one
|
|
71
|
+
* (`distinctKeyOf` canonicalises through the LEFT pipeline's index key, so an
|
|
72
|
+
* aliased value would dedup on the wrong canonicaliser) and which no issue has
|
|
73
|
+
* asked for. Everything below is the analysis #1338 was built from; it is kept
|
|
74
|
+
* because it names WHICH properties had to hold, and `join-reduce.ts` is where
|
|
75
|
+
* each one is now discharged:
|
|
76
|
+
*
|
|
77
|
+
* - the right side's reducer rewrite AND its posture gate, in one call —
|
|
78
|
+
* `joinAliasBinding` hands each aliased reducer to the right collection's
|
|
79
|
+
* own `wrapReducers` under its bare field name;
|
|
80
|
+
* - right-side change streams merged into the live upstreams —
|
|
81
|
+
* `Query.rightSideUpstreams()`, shared with `live()`;
|
|
82
|
+
* - and the case the analysis could not see, because the grouped terminal
|
|
83
|
+
* is one object further along the chain than `Query.aggregate()`: a
|
|
84
|
+
* reducer over an alias under a LEFT group key, which returned a confident
|
|
85
|
+
* `0`. `refuseAliasBinding` refuses it.
|
|
86
|
+
*
|
|
87
|
+
* Refusing rather than reordering was a DELIBERATE, REVIEWED DECISION
|
|
88
|
+
* (2026-08-10), not an oversight. What follows is why, so it is not
|
|
89
|
+
* re-litigated from scratch — and so nobody "fixes" it for the wrong reason.
|
|
90
|
+
*
|
|
91
|
+
* It is NOT a cardinality problem. A ref join is an equi-join on the target's
|
|
92
|
+
* PRIMARY KEY, so every left row matches at most one right record and the row
|
|
93
|
+
* count is constant across legs (see `join.ts`). Aggregating over joined rows
|
|
94
|
+
* is perfectly well-defined; `count()` is unambiguous. Anyone who reads this
|
|
95
|
+
* guard as "the semantics are unclear" has the wrong model.
|
|
96
|
+
*
|
|
97
|
+
* The actual blocker is that the Via pipeline is LEFT-SCOPED. `aggregate()`
|
|
98
|
+
* runs `this.source.via.wrapReducers(spec)`, which resolves `postureFor(field)`
|
|
99
|
+
* against the LEFT collection's field map. For `sum('client.balance')` that map
|
|
100
|
+
* has no entry, so two things silently do not happen:
|
|
101
|
+
*
|
|
102
|
+
* - money's exact-BigInt reducer rewrite is skipped, and a generic sum runs
|
|
103
|
+
* over stored scaled-integer strings — silently wrong numbers;
|
|
104
|
+
* - `refuseUnqueryableReducers` does not fire, so the `queryable: 'none'`
|
|
105
|
+
* gate that would refuse the field never applies.
|
|
106
|
+
*
|
|
107
|
+
* A gate that silently does not apply is worse than a missing feature, which
|
|
108
|
+
* is why this refuses instead of guessing. Supporting joined aggregation means
|
|
109
|
+
* resolving a joined field's posture and reducers from the RIGHT collection's
|
|
110
|
+
* Via pipeline (via `joinContext.resolveSource`), plus merging right-side
|
|
111
|
+
* change streams into the live-reduction upstreams the way `Query.live()`
|
|
112
|
+
* already does — otherwise a live joined aggregate silently stops updating.
|
|
113
|
+
* That is the work. It is not "apply the legs here".
|
|
114
|
+
*
|
|
115
|
+
* Two things that are already handled, so they are not reasons to defer: the
|
|
116
|
+
* MV dependency analyzer already treats `plan.joins` targets as sources and
|
|
117
|
+
* folds them into the queryHash, and `.crossJoin()` — whose clause lives in
|
|
118
|
+
* the clause list — already aggregates correctly today. The error below points
|
|
119
|
+
* there because it is a real answer, not a consolation.
|
|
120
|
+
*
|
|
121
|
+
* Deliberately NOT tracked as an issue: no consumer has asked, and #984 is the
|
|
122
|
+
* cautionary tale — a speculative deferral whose premises had drifted out of
|
|
123
|
+
* sync with the code by the time anyone re-read it. Build this when a real
|
|
124
|
+
* query needs it, and design it against that query.
|
|
125
|
+
* ⭐ It was tracked as one three weeks later (#1338, the accounting-report
|
|
126
|
+
* shape) and built against that query — which is the paragraph above working,
|
|
127
|
+
* not failing.
|
|
128
|
+
*/
|
|
53
129
|
/**
|
|
54
130
|
* Source of records that a query executes against.
|
|
55
131
|
*
|
|
@@ -64,8 +140,15 @@ export declare const DEFAULT_CROSS_JOIN_MAX_ROWS = 50000;
|
|
|
64
140
|
export interface QuerySource<T> {
|
|
65
141
|
/** Snapshot of all current records. The query never mutates this array. */
|
|
66
142
|
snapshot(): readonly T[];
|
|
67
|
-
/**
|
|
68
|
-
|
|
143
|
+
/**
|
|
144
|
+
* Subscribe to mutations; returns an unsubscribe function.
|
|
145
|
+
*
|
|
146
|
+
* A source that knows WHICH record changed passes the delta (#1341) so
|
|
147
|
+
* `.live()` can patch its result set rather than re-run the plan. Calling
|
|
148
|
+
* `cb()` with no argument stays valid — it means "something changed", and
|
|
149
|
+
* the live query answers with a full re-run.
|
|
150
|
+
*/
|
|
151
|
+
subscribe?(cb: (change?: SourceChange) => void): () => void;
|
|
69
152
|
/** Index store for the indexed-fast-path. Optional. */
|
|
70
153
|
getIndexes?(): CollectionIndexes | null;
|
|
71
154
|
/** O(1) record lookup by id, used to materialize index hits. */
|
|
@@ -84,22 +167,52 @@ export interface QuerySource<T> {
|
|
|
84
167
|
id: string;
|
|
85
168
|
record: T;
|
|
86
169
|
}[];
|
|
170
|
+
/**
|
|
171
|
+
* #1414 — cold-collection gate. Present only on collection-backed eager
|
|
172
|
+
* sources. While `isHydrated()` is false the collection's snapshot is empty
|
|
173
|
+
* by ABSENCE, not by content, so every terminal returns a pending result
|
|
174
|
+
* (awaitable, and throwing on synchronous use) instead of a confident empty.
|
|
175
|
+
* See `query/hydration.ts`.
|
|
176
|
+
*/
|
|
177
|
+
hydration?: HydrationGate;
|
|
178
|
+
/**
|
|
179
|
+
* Stable name for this source (`<vault>/<collection>`), used to bind a
|
|
180
|
+
* keyset cursor to the query that minted it (#1346) so a cursor replayed
|
|
181
|
+
* against another collection is refused rather than silently mis-paged.
|
|
182
|
+
*/
|
|
183
|
+
identity?: string;
|
|
184
|
+
/**
|
|
185
|
+
* #1417 — monotonic mutation counter for the backing cache. Two reads
|
|
186
|
+
* returning the same number means nothing changed between them, which is
|
|
187
|
+
* what lets `page()`/`after()` reuse one sort across a page walk instead of
|
|
188
|
+
* re-sorting the whole collection per page.
|
|
189
|
+
*
|
|
190
|
+
* Optional, and absence is safe: a source that does not supply it simply
|
|
191
|
+
* gets no memo. It is a CHANGE COUNTER, never a content hash — see
|
|
192
|
+
* `kernel/generation-map.ts` for why it is maintained by the container
|
|
193
|
+
* rather than at the mutation sites.
|
|
194
|
+
*/
|
|
195
|
+
snapshotVersion?(): number;
|
|
87
196
|
}
|
|
88
197
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* `
|
|
92
|
-
*
|
|
93
|
-
* Type parameter T flows through the public API for ergonomics, but the
|
|
94
|
-
* internal storage uses `unknown` so Collection<T> stays covariant.
|
|
95
|
-
*
|
|
96
|
-
* The optional `joinContext` is attached when the Query is constructed
|
|
97
|
-
* via `Collection.query()` (Collection passes in a context built from
|
|
98
|
-
* the Vault's join resolver). A Query constructed via `new Query`
|
|
99
|
-
* directly — e.g. from tests with a plain-object source — has no
|
|
100
|
-
* joinContext, and calling `.join()` on it throws with an actionable
|
|
101
|
-
* error. See `query/join.ts` for the full design.
|
|
198
|
+
* @internal #1458 — exported so the extension mixins in `query/{live,reduce,
|
|
199
|
+
* relate}/` can name the source they read. Not part of the published surface:
|
|
200
|
+
* `QuerySource<T>` above is what a consumer implements.
|
|
102
201
|
*/
|
|
202
|
+
export interface InternalSource {
|
|
203
|
+
snapshot(): readonly unknown[];
|
|
204
|
+
subscribe?(cb: (change?: SourceChange) => void): () => void;
|
|
205
|
+
getIndexes?(): CollectionIndexes | null;
|
|
206
|
+
lookupById?(id: string): unknown;
|
|
207
|
+
via?: ViaPipeline;
|
|
208
|
+
snapshotEntries?(): readonly {
|
|
209
|
+
id: string;
|
|
210
|
+
record: unknown;
|
|
211
|
+
}[];
|
|
212
|
+
hydration?: HydrationGate;
|
|
213
|
+
identity?: string;
|
|
214
|
+
snapshotVersion?(): number;
|
|
215
|
+
}
|
|
103
216
|
/**
|
|
104
217
|
* Declared deterministic predicate. Carries the consumer's
|
|
105
218
|
* stable `hash` (for function-body identity), the function itself,
|
|
@@ -110,6 +223,67 @@ export interface DeclaredPredicate {
|
|
|
110
223
|
hash: string;
|
|
111
224
|
fn: (record: unknown, ctx?: unknown) => boolean;
|
|
112
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* The chainable query builder over an eager collection's decrypted cache.
|
|
228
|
+
*
|
|
229
|
+
* ## Its terminals are SYNCHRONOUS (#1413)
|
|
230
|
+
*
|
|
231
|
+
* `toArray()`, `ids()`, `page()`, `first()`, `count()` and `exists()` return
|
|
232
|
+
* their value directly — `T[]`, `string[]`, `{ rows, nextCursor }`, `T | null`,
|
|
233
|
+
* `number`, `boolean` — **not** a `Promise` of it. That is the architecture
|
|
234
|
+
* showing through, not an oversight: `Query` runs over `source.snapshot()`, an
|
|
235
|
+
* already-decrypted in-memory view. Decryption happened at hydration, so by the
|
|
236
|
+
* time a plan executes there is nothing left to await. Making these async would
|
|
237
|
+
* break every call site and erase the one property that distinguishes a cached
|
|
238
|
+
* query from a fetch.
|
|
239
|
+
*
|
|
240
|
+
* ⚠️ **So `.catch()` / `.then()` on a terminal's result is not part of the
|
|
241
|
+
* contract.** `query().toArray().catch(fn)` fails with *"catch is not a
|
|
242
|
+
* function"* on a loaded collection. Handle errors with `try` / `catch` around
|
|
243
|
+
* the call.
|
|
244
|
+
*
|
|
245
|
+
* `await` is always safe, though — awaiting a plain array yields the array —
|
|
246
|
+
* and on an unhydrated collection it is REQUIRED. See below.
|
|
247
|
+
*
|
|
248
|
+
* ## The one exception, and it is not an async terminal (#1414)
|
|
249
|
+
*
|
|
250
|
+
* On a collection that has never been loaded, a terminal cannot answer: the
|
|
251
|
+
* snapshot is empty by ABSENCE, not by content. Rather than return a confident
|
|
252
|
+
* `[]` / `0` / `false`, it returns a **pending result** — a thenable that
|
|
253
|
+
* hydrates and re-runs the terminal when awaited, and throws
|
|
254
|
+
* {@link CollectionNotHydratedError} on every use that READS it — `.length`,
|
|
255
|
+
* indexing, iteration, spread, `JSON.stringify`, any property access.
|
|
256
|
+
* `Array.isArray` answers `true`, so the ordinary defensive guard for a `T[]`
|
|
257
|
+
* reaches that throw rather than silently substituting `[]` (#1462); `typeof`
|
|
258
|
+
* and truthiness are the two uses that cannot throw, and
|
|
259
|
+
* `query/hydration.ts` enumerates why. It is deliberately NOT a
|
|
260
|
+
* promise-shaped array: the moment the collection is hydrated the very same
|
|
261
|
+
* call returns the plain synchronous value again. Write
|
|
262
|
+
* `await collection.query().toArray()` — correct in both states — or
|
|
263
|
+
* `await collection.list()` first and then read synchronously.
|
|
264
|
+
* See `query/hydration.ts`.
|
|
265
|
+
*
|
|
266
|
+
* ## Where the same name IS async
|
|
267
|
+
*
|
|
268
|
+
* `PartitionedQuery.toArray()` (`with-store/partitioned/index.ts`) and the lazy
|
|
269
|
+
* builder's `LazyQuery.toArray()` (`with-lookup/indexing/lazy-builder.ts`)
|
|
270
|
+
* return `Promise<T[]>`. Both genuinely fetch — across partition legs, or
|
|
271
|
+
* through the persisted `_idx/` side-car — so both genuinely await. Same
|
|
272
|
+
* method name, different contract, because the surface underneath differs.
|
|
273
|
+
*
|
|
274
|
+
* ---
|
|
275
|
+
*
|
|
276
|
+
* All non-terminal methods return a NEW Query — the original is unchanged.
|
|
277
|
+
* Type parameter T flows through the public API for ergonomics, but the
|
|
278
|
+
* internal storage uses `unknown` so `Collection<T>` stays covariant.
|
|
279
|
+
*
|
|
280
|
+
* The optional `joinContext` is attached when the Query is constructed via
|
|
281
|
+
* `Collection.query()` (Collection passes in a context built from the Vault's
|
|
282
|
+
* join resolver). A Query constructed via `new Query` directly — e.g. from
|
|
283
|
+
* tests with a plain-object source — has no joinContext, and calling `.join()`
|
|
284
|
+
* on it throws with an actionable error. See `query/join.ts` for the full
|
|
285
|
+
* design.
|
|
286
|
+
*/
|
|
113
287
|
export declare class Query<T, S extends keyof T = never, Q extends keyof T & string = never, M extends keyof T & string = never> {
|
|
114
288
|
private readonly source;
|
|
115
289
|
private readonly plan;
|
|
@@ -129,6 +303,23 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
129
303
|
* queries constructed without a Collection backing).
|
|
130
304
|
*/
|
|
131
305
|
_joinContext(): JoinContext | undefined;
|
|
306
|
+
/**
|
|
307
|
+
* @internal #1414 — clone this Query with the cold-collection gate REMOVED.
|
|
308
|
+
*
|
|
309
|
+
* For engine-internal readers only. The materialized-view engine reads its
|
|
310
|
+
* source collections through the public `collection.query()` on paths that
|
|
311
|
+
* are synchronous by construction (registration inspects the plan; the
|
|
312
|
+
* executor's row scan is called from inside a write commit), and it has
|
|
313
|
+
* always read whatever the in-memory cache held. Gating those would turn a
|
|
314
|
+
* pre-existing read into a throw for consumers who never asked a question —
|
|
315
|
+
* so this preserves that behaviour EXACTLY, and confines #1414's change to
|
|
316
|
+
* the surface a consumer or a guard actually calls.
|
|
317
|
+
*
|
|
318
|
+
* ⚠️ It does not make an unhydrated read correct — an MV computed over a
|
|
319
|
+
* cold source is the same defect wearing a different hat. That is tracked
|
|
320
|
+
* separately; do not reach for this to silence the gate in new code.
|
|
321
|
+
*/
|
|
322
|
+
_ungated(): Query<T, S, Q, M>;
|
|
132
323
|
/**
|
|
133
324
|
* @internal — clone this Query with a declared-predicate map
|
|
134
325
|
* attached. Used by the materialized-view registry to enable
|
|
@@ -145,6 +336,32 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
145
336
|
* Throws if the source is not collection-backed (no `snapshotEntries`).
|
|
146
337
|
*/
|
|
147
338
|
_idArray(): string[];
|
|
339
|
+
/**
|
|
340
|
+
* The ids of the records this query matches (#1351) — the public spelling
|
|
341
|
+
* of {@link _idArray}, and the eager half of the subquery operand:
|
|
342
|
+
* `where(f, 'in', inner.ids())` and `where(f, 'in', inner)` build the SAME
|
|
343
|
+
* clause. Reach for the explicit form when you want to reuse the id set, or
|
|
344
|
+
* to see it.
|
|
345
|
+
*
|
|
346
|
+
* Requires a collection-backed query (`collection.query()`); a `crossJoin`
|
|
347
|
+
* plan is refused, because it produces new row objects and there is no id
|
|
348
|
+
* to recover.
|
|
349
|
+
*
|
|
350
|
+
* **Synchronous** (#1413) — returns `string[]`, not a promise; the cache it reads is
|
|
351
|
+
* already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
|
|
352
|
+
* (#1414); `.catch()` is not available. See the {@link Query} class doc.
|
|
353
|
+
*/
|
|
354
|
+
ids(): string[];
|
|
355
|
+
/**
|
|
356
|
+
* @internal — the id-operand contract `normalizeSubqueryOperand()`
|
|
357
|
+
* (`predicate.ts`) duck-types when this Query is passed as the operand of
|
|
358
|
+
* `in`/`!in`. Separate from {@link ids} so the failure a subquery hits is
|
|
359
|
+
* phrased as a subquery failure rather than as a `retrieve({ within })` one.
|
|
360
|
+
*/
|
|
361
|
+
_asIdOperand(): {
|
|
362
|
+
readonly ids: readonly string[];
|
|
363
|
+
readonly from: string;
|
|
364
|
+
};
|
|
148
365
|
/**
|
|
149
366
|
* Filter by a registered deterministic predicate. Requires
|
|
150
367
|
* the Query to have been augmented with a predicates map (typically
|
|
@@ -200,6 +417,28 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
200
417
|
}): Query<T, S, Q, M>;
|
|
201
418
|
/** Cap the result size. */
|
|
202
419
|
limit(n: number): Query<T, S, Q, M>;
|
|
420
|
+
/**
|
|
421
|
+
* Resume strictly after the row an opaque keyset cursor names (#1346).
|
|
422
|
+
*
|
|
423
|
+
* ```ts
|
|
424
|
+
* const first = people.query().orderBy('name').limit(20).page()
|
|
425
|
+
* const next = people.query().orderBy('name').limit(20).after(first.nextCursor!).page()
|
|
426
|
+
* ```
|
|
427
|
+
*
|
|
428
|
+
* Unlike `offset(n)`, the window is anchored to a `(sortKey, id)` position,
|
|
429
|
+
* so a record inserted or deleted before it — including the cursor's own
|
|
430
|
+
* row — cannot re-serve or skip a record.
|
|
431
|
+
*
|
|
432
|
+
* The cursor is OPAQUE: pass back a `nextCursor` from `.page()` verbatim
|
|
433
|
+
* and do not parse it. It is validated when the query executes (not here —
|
|
434
|
+
* the sort spec it is bound to may still be added to the chain), and a
|
|
435
|
+
* cursor from a different collection or a different `orderBy(...)` spec is
|
|
436
|
+
* REFUSED rather than mis-paged.
|
|
437
|
+
*
|
|
438
|
+
* Requires at least one `orderBy(...)`, an id-paired (collection-backed)
|
|
439
|
+
* source, no join legs and no `offset()`; each is a loud error at execution.
|
|
440
|
+
*/
|
|
441
|
+
after(cursor: string): Query<T, S, Q, M>;
|
|
203
442
|
/** Skip the first N matching records (after ordering). */
|
|
204
443
|
offset(n: number): Query<T, S, Q, M>;
|
|
205
444
|
/**
|
|
@@ -260,89 +499,69 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
260
499
|
* correlation goes through `Noydb.queryAcross`, not
|
|
261
500
|
* `.join()`.
|
|
262
501
|
*/
|
|
263
|
-
join<As extends string, R = unknown>(field: QueryField<T, S>, opts: {
|
|
264
|
-
as: As;
|
|
265
|
-
strategy?: JoinStrategy;
|
|
266
|
-
maxRows?: number;
|
|
267
|
-
}): Query<T & Record<As, R | null>, S, Q, M>;
|
|
268
|
-
/**
|
|
269
|
-
* Cartesian-product cross-join against `target` collection. Each result row
|
|
270
|
-
* carries the original `T` fields plus `result[as]` populated from every
|
|
271
|
-
* right-side row (or the filtered subset when `on:` is supplied).
|
|
272
|
-
*
|
|
273
|
-
* **⚠️ INNER-join semantics — an empty right subset DROPS the left row.**
|
|
274
|
-
* Each left row is emitted once per matching right row, so when `on:`
|
|
275
|
-
* yields nothing the row vanishes with no error, no warning and no count
|
|
276
|
-
* mismatch. This bites hardest on a reverse FK, where `.join()` (which is
|
|
277
|
-
* forward-only, and already a genuine LEFT outer join) does not apply and
|
|
278
|
-
* `.crossJoin()` is the only tool. To keep the row, return a one-element
|
|
279
|
-
* array holding `null`:
|
|
280
|
-
*
|
|
281
|
-
* ```ts
|
|
282
|
-
* .crossJoin('clients', { as: 'client', on: (b) => byEntity.get(b.entityId) ?? [null] })
|
|
283
|
-
* // ^^^^^^^^
|
|
284
|
-
* // the ONLY thing preserving the row
|
|
285
|
-
* ```
|
|
286
|
-
*
|
|
287
|
-
* **Prefer `outer: true`**, which does exactly this and types the alias as
|
|
288
|
-
* `TTarget | null`:
|
|
289
|
-
*
|
|
290
|
-
* ```ts
|
|
291
|
-
* .crossJoin('clients', { as: 'client', outer: true, on: (b) => byEntity.get(b.entityId) ?? [] })
|
|
292
|
-
* ```
|
|
293
|
-
*
|
|
294
|
-
* The `?? [null]` form remains valid and is what `outer` does internally, but
|
|
295
|
-
* it is invisible intent: it types the alias as non-null while the row can
|
|
296
|
-
* hold null, and a later "simplification" that drops it silently
|
|
297
|
-
* reintroduces the row loss.
|
|
298
|
-
*
|
|
299
|
-
* **Order matters:** `.where().crossJoin()` filters BEFORE expanding (cheaper);
|
|
300
|
-
* `.crossJoin().where('alias.field', ...)` filters AFTER (required when the
|
|
301
|
-
* where clause references the aliased fields).
|
|
302
|
-
*
|
|
303
|
-
* **Cost ceiling:** `CrossJoinTooLargeError` fires before allocation when
|
|
304
|
-
* `leftRows × rightRows` (or the cumulative lateral count) exceeds the limit.
|
|
305
|
-
* Default: 50,000 rows. Override per-clause with `{ maxRows: N }`.
|
|
306
|
-
*
|
|
307
|
-
* **`on:` shapes:**
|
|
308
|
-
* - `on: (left) => TTarget[]` — subset form (most efficient)
|
|
309
|
-
* - `on: (left) => (right) => boolean` — predicate form
|
|
310
|
-
* - `on: { predicate: 'name' }` — MV-safe, hash-tracked form
|
|
311
|
-
* (requires the Query to have been augmented via `_withPredicates`)
|
|
312
|
-
*
|
|
313
|
-
* Requires a JoinContext (constructed via `collection.query()`).
|
|
314
|
-
*/
|
|
315
|
-
crossJoin<TTarget = unknown, As extends string = string, TOuter extends boolean = false>(target: string, opts: {
|
|
316
|
-
as: As;
|
|
317
|
-
on?: ((left: T) => unknown[] | ((right: TTarget) => boolean)) | {
|
|
318
|
-
readonly predicate: string;
|
|
319
|
-
};
|
|
320
|
-
maxRows?: number;
|
|
321
|
-
/**
|
|
322
|
-
* Keep the left row when its right side is empty, with `null` under
|
|
323
|
-
* `as`, instead of dropping it (#1130). Widens the alias to
|
|
324
|
-
* `TTarget | null` — which is why it is a type parameter rather than a
|
|
325
|
-
* plain boolean: `outer: false` must not pay for a null the row can
|
|
326
|
-
* never hold.
|
|
327
|
-
*/
|
|
328
|
-
outer?: TOuter;
|
|
329
|
-
}): Query<T & {
|
|
330
|
-
[K in As]: TOuter extends true ? TTarget | null : TTarget;
|
|
331
|
-
}, S, Q, M>;
|
|
332
502
|
/**
|
|
333
503
|
* Execute the plan and return the matching records. When the plan
|
|
334
504
|
* carries any join legs, they are applied after `where` / `orderBy`
|
|
335
|
-
* / `limit` / `offset` narrow the left set
|
|
336
|
-
*
|
|
505
|
+
* / `limit` / `offset` narrow the left set — UNLESS a clause (#1030) or
|
|
506
|
+
* the ordering (#1337) addresses a join alias, in which case the legs run
|
|
507
|
+
* first and the sort/page observe the joined relation. See the `.join()`
|
|
508
|
+
* doc for the ordering rationale, and `.explain()` for which one a given
|
|
509
|
+
* plan gets.
|
|
337
510
|
*
|
|
338
511
|
* `opts.locale` resolves JOINED right-side i18n fields at the
|
|
339
512
|
* `join` layer to that locale; without it, the owning collection's default
|
|
340
513
|
* locale applies, and a locale-less query leaves joined i18n fields raw.
|
|
341
514
|
* (Left/base i18n fields are resolved by `get`/`list`, not here.)
|
|
515
|
+
*
|
|
516
|
+
* **Synchronous** (#1413) — returns `T[]`, not a promise; the cache it reads is
|
|
517
|
+
* already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
|
|
518
|
+
* (#1414); `.catch()` is not available. See the {@link Query} class doc.
|
|
342
519
|
*/
|
|
343
520
|
toArray(opts?: {
|
|
344
521
|
locale?: string;
|
|
345
522
|
}): T[];
|
|
523
|
+
/**
|
|
524
|
+
* Apply each aliased side's OWN Via result decode, in place of the
|
|
525
|
+
* top-level decode that cannot reach it (#1289, and the fix for #1335).
|
|
526
|
+
*
|
|
527
|
+
* `decodeVia` keys by bare field name, so it dresses exactly the fields
|
|
528
|
+
* sitting at the top of the row. Everything a join puts under an alias —
|
|
529
|
+
* a `.join()`/`.rightJoin()` right record, a `.crossJoin()` right record,
|
|
530
|
+
* and BOTH sides of a `.crossJoinWith()` pair — is therefore invisible to
|
|
531
|
+
* it, and was served raw: a self cross-join returned `"10.00"` on the left
|
|
532
|
+
* and `"1000"` on the right of the same field (#1335).
|
|
533
|
+
*
|
|
534
|
+
* Runs LAST, after every filter, sort and page. That is deliberate: a
|
|
535
|
+
* `where()` operand is built in raw stored space, so dressing earlier would
|
|
536
|
+
* make a post-join predicate compare a decoded string against a raw one.
|
|
537
|
+
* Dressing is presentation; it belongs after the plan has finished.
|
|
538
|
+
*
|
|
539
|
+
* Each alias is decoded by the Via pipeline of the collection the record
|
|
540
|
+
* came FROM — money on the right side is the right side's declaration, not
|
|
541
|
+
* this collection's. A source that declares no result decode returns the
|
|
542
|
+
* record unchanged, so the whole pass is a no-op for the common query and
|
|
543
|
+
* is skipped entirely when the plan has no aliases.
|
|
544
|
+
*/
|
|
545
|
+
private dressAliases;
|
|
546
|
+
/**
|
|
547
|
+
* Alias → the Via pipeline of the collection whose records sit under it
|
|
548
|
+
* (#1337). Every alias this plan can produce: a `.join()`/`.rightJoin()`
|
|
549
|
+
* leg, a `.crossJoin()` right side, and both sides of `.crossJoinWith()`.
|
|
550
|
+
*
|
|
551
|
+
* ⭐ **Ordering compares in RAW STORED SPACE, never in dressed space, and
|
|
552
|
+
* that is what forces this map to exist.** `dressAliases` runs LAST — after
|
|
553
|
+
* every filter, sort and page — because a `where` operand is built raw. So
|
|
554
|
+
* the sort sees money as its stored scaled integer, where a generic compare
|
|
555
|
+
* is lexical and gets `'9882'` vs `'10004'` backwards. The left side has
|
|
556
|
+
* always avoided that by asking `source.via.compareForOrder`; an aliased
|
|
557
|
+
* field needs the same question asked of the RIGHT side's pipeline, keyed
|
|
558
|
+
* by the field name WITHOUT the alias prefix (a pipeline covers bare field
|
|
559
|
+
* names — that is the whole of #1335's shape).
|
|
560
|
+
*
|
|
561
|
+
* Empty when no alias resolves a pipeline, in which case the comparator
|
|
562
|
+
* falls back to exactly what it did before.
|
|
563
|
+
*/
|
|
564
|
+
private aliasVia;
|
|
346
565
|
/**
|
|
347
566
|
* Joins need a `JoinContext`. Unreachable in practice — `.join()` throws
|
|
348
567
|
* when one is missing — but belt-and-braces for a plan built through the
|
|
@@ -350,21 +569,97 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
350
569
|
*/
|
|
351
570
|
private requireJoinContext;
|
|
352
571
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
*
|
|
358
|
-
*
|
|
359
|
-
* `
|
|
360
|
-
*
|
|
361
|
-
*
|
|
362
|
-
*
|
|
363
|
-
*
|
|
364
|
-
* `
|
|
572
|
+
* Present this source's Via-covered fields on read, so `query().toArray()`
|
|
573
|
+
* agrees with `get()`/`list()` about what a record contains (#1416).
|
|
574
|
+
*
|
|
575
|
+
* ⛔ THIS USED TO RUN `decodeResults`, WHICH IS NOT THE SAME QUESTION. That
|
|
576
|
+
* hook is money's stored→canonical decode and nothing else, so a
|
|
577
|
+
* `computed({ mode: 'virtual' })` field read `undefined` on a query row while
|
|
578
|
+
* `get()` returned it — the same record with two shapes depending on which
|
|
579
|
+
* verb produced it, and a caller summing that field over a query result got
|
|
580
|
+
* `NaN` with no error. Reported at `receiptAmount get=84715.00 query=undefined`.
|
|
581
|
+
*
|
|
582
|
+
* The old doc comment defended the omission of money's `<field>Formatted` /
|
|
583
|
+
* `<field>Number` virtuals on the grounds that "the query layer carries no
|
|
584
|
+
* locale context", and that reasoning was right: fabricating a guessed-locale
|
|
585
|
+
* string here would make it-IT via `get()` disagree with en-US here. ⚠️ But
|
|
586
|
+
* the premise had gone stale — `toArray({ locale })` exists and threads its
|
|
587
|
+
* locale into `executePlanWithSource`, `applyJoins` and `applyOrderAndPage`.
|
|
588
|
+
* This was the one call site that never received it, which is also why joined
|
|
589
|
+
* ALIASES were dressed while the base row was not.
|
|
590
|
+
*
|
|
591
|
+
* So this presents at `'raw'`: values — money's canonical decode and every
|
|
592
|
+
* virtual computed field — while money's binding gates the locale-formatted
|
|
593
|
+
* virtuals on `locale !== 'raw'`, so nothing is guessed.
|
|
594
|
+
*
|
|
595
|
+
* ⛔ HONOURING `toArray({ locale })` HERE IS A SEPARATE CHANGE, and the
|
|
596
|
+
* obvious implementation is measurably wrong. Presenting twice — once raw for
|
|
597
|
+
* the plan, once at the locale for output — silently yields the RAW result:
|
|
598
|
+
*
|
|
599
|
+
* presentSync(stored, raw) -> { amount: "84715.00" }
|
|
600
|
+
* presentSync(that, 'en-US') -> { amount: "84715.00" } <-- no siblings
|
|
601
|
+
* presentSync(stored, 'en-US') -> { amount: "84715.00",
|
|
602
|
+
* amountFormatted: "THB 84,715.00", ... }
|
|
603
|
+
*
|
|
604
|
+
* because the second pass sees an already-decoded value and re-emits no
|
|
605
|
+
* siblings. So formatting has to happen in ONE pass at the final locale —
|
|
606
|
+
* and one of this method's call sites runs BEFORE the post-join filter,
|
|
607
|
+
* where a formatted value would change what a `where()` predicate compares
|
|
608
|
+
* against. That is the same rule `dressAliases` states: dressing is
|
|
609
|
+
* presentation and belongs after the plan has finished. Deciding it needs
|
|
610
|
+
* its own change; leaving `toArray({ locale })` inert for base rows is the
|
|
611
|
+
* status quo, not a new hole.
|
|
612
|
+
*
|
|
613
|
+
* ⚠️ SYNCHRONOUS, so it folds only the bindings that declared
|
|
614
|
+
* `presentIsSync` — money and computed. A collection also using i18n or
|
|
615
|
+
* lookup keeps those fields undressed here, exactly as today; `presentSync`
|
|
616
|
+
* reports them and `explain()` says so rather than leaving a silent hole.
|
|
617
|
+
* Making this complete would mean making `toArray()` async, which is the
|
|
618
|
+
* contract #1413 deliberately established.
|
|
365
619
|
*/
|
|
366
620
|
private decodeVia;
|
|
367
|
-
/**
|
|
621
|
+
/**
|
|
622
|
+
* Terminal sibling of `toArray()` that also returns the cursor for the next
|
|
623
|
+
* page (#1346): `{ rows, nextCursor }`, where `nextCursor` is `null` once
|
|
624
|
+
* the last page has been served.
|
|
625
|
+
*
|
|
626
|
+
* ```ts
|
|
627
|
+
* const { rows, nextCursor } = people.query().orderBy('name').limit(20).page()
|
|
628
|
+
* ```
|
|
629
|
+
*
|
|
630
|
+
* Without a sorted index this is still a scan with a keyset filter — stable,
|
|
631
|
+
* not fast. The fast path is a separate concern (#1344).
|
|
632
|
+
*
|
|
633
|
+
* Same requirements as `.after()`: at least one `orderBy(...)`, an id-paired
|
|
634
|
+
* (collection-backed) source, no join legs, no `offset()`.
|
|
635
|
+
*
|
|
636
|
+
* **Synchronous** (#1413) — returns `{ rows, nextCursor }`, not a promise; the cache it reads is
|
|
637
|
+
* already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
|
|
638
|
+
* (#1414); `.catch()` is not available. See the {@link Query} class doc.
|
|
639
|
+
*/
|
|
640
|
+
page(opts?: {
|
|
641
|
+
locale?: string;
|
|
642
|
+
}): {
|
|
643
|
+
rows: T[];
|
|
644
|
+
nextCursor: string | null;
|
|
645
|
+
};
|
|
646
|
+
/**
|
|
647
|
+
* The keyset engine behind `page()` / `after()`.
|
|
648
|
+
*
|
|
649
|
+
* It deliberately does NOT reuse `applyOrderAndPage`: paging by keyset needs
|
|
650
|
+
* a TOTAL order (the id breaks ties that the ordinary sort leaves to input
|
|
651
|
+
* order) and needs the id alongside each row to mint the cursor. Both are
|
|
652
|
+
* properties of this path only, so the ordinary read path is untouched.
|
|
653
|
+
*/
|
|
654
|
+
private executeKeyset;
|
|
655
|
+
/**
|
|
656
|
+
* Return the first matching record, or null. Joins are applied. `opts.locale`
|
|
657
|
+
* resolves joined i18n fields.
|
|
658
|
+
*
|
|
659
|
+
* **Synchronous** (#1413) — returns `T | null`, not a promise; the cache it reads is
|
|
660
|
+
* already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
|
|
661
|
+
* (#1414); `.catch()` is not available. See the {@link Query} class doc.
|
|
662
|
+
*/
|
|
368
663
|
first(opts?: {
|
|
369
664
|
locale?: string;
|
|
370
665
|
}): T | null;
|
|
@@ -383,173 +678,45 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
383
678
|
* A strict-mode `DanglingReferenceError` becomes reachable from `count()`
|
|
384
679
|
* in exactly that case, which is acceptable: the caller asked to filter on
|
|
385
680
|
* the joined side, so they asked for the join.
|
|
681
|
+
*
|
|
682
|
+
* **Synchronous** (#1413) — returns `number`, not a promise; the cache it reads is
|
|
683
|
+
* already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
|
|
684
|
+
* (#1414); `.catch()` is not available. See the {@link Query} class doc.
|
|
386
685
|
*/
|
|
387
686
|
count(): number;
|
|
388
687
|
/**
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
393
|
-
*
|
|
394
|
-
*
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
*
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
*
|
|
404
|
-
*
|
|
405
|
-
*
|
|
406
|
-
*
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
*
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
*
|
|
422
|
-
* Every reducer factory accepts an optional `{ seed }` parameter
|
|
423
|
-
* that is plumbed through the protocol but unused by the
|
|
424
|
-
* executor — that's constraint #2. When partition-aware
|
|
425
|
-
* aggregation lands, the seed will carry running state across
|
|
426
|
-
* partition boundaries without an API break.
|
|
427
|
-
*
|
|
428
|
-
* KNOWN GAP (sealed fields, bare-spec form): `where`/`orderBy`/`groupBy`
|
|
429
|
-
* refuse a `sensitive` field at compile time, but a reducer over a sensitive
|
|
430
|
-
* field in the BARE-SPEC form (e.g. `aggregate({ x: sum('ssn') })`) is NOT
|
|
431
|
-
* refused — the reducer factories (`sum`/`min`/`max`/…) are standalone
|
|
432
|
-
* `(field: string)` functions with no collection-type context. This form is
|
|
433
|
-
* preserved as-is for backward compatibility.
|
|
434
|
-
*
|
|
435
|
-
* The BUILDER form closes this gap: `aggregate(b => ({ x: b.sum('field') }))`
|
|
436
|
-
* types the builder's field parameter as `QueryField<T, S>`, refusing any
|
|
437
|
-
* `sensitive` field at compile time. Use the builder form for new code that
|
|
438
|
-
* aggregates over a collection with sensitive fields.
|
|
439
|
-
*
|
|
440
|
-
*/
|
|
441
|
-
aggregate<Spec extends ReduceSpec>(spec: Spec): Reduction<ReduceResult<Spec>>;
|
|
442
|
-
aggregate<Spec extends ReduceSpec>(build: (b: ReducerBuilder<T, S, M>) => Spec): Reduction<ReduceResult<Spec>>;
|
|
443
|
-
/**
|
|
444
|
-
* Partition matching records into buckets keyed by a field, then
|
|
445
|
-
* terminate with `.aggregate(spec)` to compute per-bucket
|
|
446
|
-
* reducers..
|
|
447
|
-
*
|
|
448
|
-
* ```ts
|
|
449
|
-
* const byClient = invoices.query()
|
|
450
|
-
* .where('status', '==', 'open')
|
|
451
|
-
* .groupBy('clientId')
|
|
452
|
-
* .aggregate({ total: sum('amount'), n: count() })
|
|
453
|
-
* .run()
|
|
454
|
-
* // → [ { clientId: 'c1', total: 5250, n: 3 }, … ]
|
|
455
|
-
* ```
|
|
456
|
-
*
|
|
457
|
-
* Result rows carry the group key value under the grouping field
|
|
458
|
-
* name plus every reducer output from the spec. Buckets are
|
|
459
|
-
* emitted in first-seen order — consumers who want a specific
|
|
460
|
-
* ordering should `.sort()` downstream.
|
|
461
|
-
*
|
|
462
|
-
* **Cardinality caps:** a one-shot warning fires at 10_000
|
|
463
|
-
* distinct groups; `GroupCardinalityError` throws at 100_000.
|
|
464
|
-
* Grouping on a high-uniqueness field like `id` or `createdAt` is
|
|
465
|
-
* almost always a query mistake — the error message names the
|
|
466
|
-
* field and observed cardinality and suggests narrowing with
|
|
467
|
-
* `.where()` first.
|
|
468
|
-
*
|
|
469
|
-
* **Null / undefined keys:** records with a missing or explicitly
|
|
470
|
-
* `null` group field get their own buckets. `Map`-based
|
|
471
|
-
* partitioning distinguishes `undefined` from `null`, so the two
|
|
472
|
-
* cases do NOT merge. Consumers who want them merged should
|
|
473
|
-
* coalesce upstream with `.filter()`.
|
|
474
|
-
*
|
|
475
|
-
* **Joins are not applied** — same rationale as `.count()` and
|
|
476
|
-
* `.aggregate()`. Joined fields in are projection-only, so
|
|
477
|
-
* running a join inside a grouping pipeline would be wasteful and
|
|
478
|
-
* could trigger `DanglingReferenceError` in strict mode for a
|
|
479
|
-
* call whose intent is purely to bucket-and-reduce. Grouping by
|
|
480
|
-
* a joined field is explicitly out of scope for — file an
|
|
481
|
-
* issue if a real consumer needs it.
|
|
482
|
-
*
|
|
483
|
-
* **Filter clauses (`.filter(fn)`):** grouped queries still
|
|
484
|
-
* support filter clauses in the underlying plan — they run in
|
|
485
|
-
* the same candidate/filter pipeline that `.aggregate()` uses.
|
|
486
|
-
* The performance caveat is the same: filter clauses cost O(N)
|
|
487
|
-
* per record and can't be index-accelerated.
|
|
488
|
-
*/
|
|
489
|
-
groupBy<F extends QueryField<T, S>>(field: F): GroupedQuery<T, F, S, M>;
|
|
490
|
-
groupBy<F extends readonly [QueryField<T, S>, QueryField<T, S>, ...QueryField<T, S>[]]>(...fields: F): GroupedQueryN<T, F, S, M>;
|
|
491
|
-
/**
|
|
492
|
-
* Re-run the query whenever the source notifies of changes.
|
|
493
|
-
* Returns an unsubscribe function. The callback receives the latest result.
|
|
494
|
-
* Throws if the source does not support subscriptions.
|
|
495
|
-
*
|
|
496
|
-
* **For joined queries, prefer `.live()`** — `subscribe()`
|
|
497
|
-
* only re-fires on LEFT-side changes, so joined data can be
|
|
498
|
-
* stale if the right side mutates between emissions. `.live()`
|
|
499
|
-
* merges change streams from every join target.
|
|
500
|
-
*/
|
|
501
|
-
subscribe(cb: (result: T[]) => void): () => void;
|
|
502
|
-
/**
|
|
503
|
-
* Reactive terminal — returns a `LiveQuery<T>` that re-runs the
|
|
504
|
-
* query and updates its `value` whenever any source feeding it
|
|
505
|
-
* mutates..
|
|
506
|
-
*
|
|
507
|
-
* For non-joined queries, `.live()` is a convenience over the
|
|
508
|
-
* existing `.subscribe()` callback shape: a hand-rolled reactive
|
|
509
|
-
* primitive with `value` / `error` fields and a `subscribe(cb)`
|
|
510
|
-
* notification channel. Frame-agnostic — Vue / React / Solid
|
|
511
|
-
* adapters wrap it in their own primitive.
|
|
512
|
-
*
|
|
513
|
-
* For joined queries, `.live()` additionally subscribes to every
|
|
514
|
-
* join target's change stream. Mutations on a right-side
|
|
515
|
-
* collection (insert / update / delete of a client referenced by
|
|
516
|
-
* an invoice) re-fire the live query and re-evaluate every
|
|
517
|
-
* dependent left row. Right-side targets are deduped by
|
|
518
|
-
* collection name, so a chain that joins the same target twice
|
|
519
|
-
* (e.g. billing client + shipping client → both 'clients') only
|
|
520
|
-
* subscribes once.
|
|
521
|
-
*
|
|
522
|
-
* **Ref-mode behavior on right-side disappearance** — matches the
|
|
523
|
-
* eager `.toArray()` contract from :
|
|
524
|
-
* - `strict` → re-run throws `DanglingReferenceError`. The
|
|
525
|
-
* LiveQuery catches the throw, stores it in `live.error`, and
|
|
526
|
-
* notifies listeners (the throw does NOT propagate out of
|
|
527
|
-
* the source's change handler — that would tear down the
|
|
528
|
-
* emitter). Consumers check `live.error` after each
|
|
529
|
-
* notification and render an error state in the UI.
|
|
530
|
-
* - `warn` → joined value flips to `null`; the existing
|
|
531
|
-
* warn-channel deduplication keeps repeated re-runs from
|
|
532
|
-
* spamming the console.
|
|
533
|
-
* - `cascade` → no special handling needed; the cascade-
|
|
534
|
-
* delete mechanism propagates the right-side delete into the
|
|
535
|
-
* left collection on the next tick, and the live query
|
|
536
|
-
* naturally re-fires with the orphaned left rows gone.
|
|
537
|
-
*
|
|
538
|
-
* Always call `live.stop()` when finished — it tears down every
|
|
539
|
-
* upstream subscription. The Vue layer's `onUnmounted` hook
|
|
540
|
-
* should call `stop()` automatically; raw consumers must do it
|
|
541
|
-
* themselves.
|
|
542
|
-
*
|
|
543
|
-
* **Limitations:**
|
|
544
|
-
* - No granular delta updates — the whole query re-runs on
|
|
545
|
-
* every change.
|
|
546
|
-
* - No microtask batching — bursty changes produce one re-run
|
|
547
|
-
* per change.
|
|
548
|
-
* - No re-planning under live mutations — the planner picks
|
|
549
|
-
* once at subscription time and reuses the same plan.
|
|
550
|
-
* - Streaming live joins are deferred.
|
|
551
|
-
*/
|
|
552
|
-
live(): LiveQuery<T>;
|
|
688
|
+
* The match set every reduce-shaped terminal reports over: `count()`,
|
|
689
|
+
* `distinct()`, and `exists()`'s non-short-circuit fallbacks.
|
|
690
|
+
*
|
|
691
|
+
* Extracted (#1347) rather than copied a third time, because "which records
|
|
692
|
+
* does this terminal see" is an INVARIANT across them — `distinct()`
|
|
693
|
+
* returning values `count()` never counted would be a bug nobody would look
|
|
694
|
+
* for. It is deliberately the `count()` pipeline: where/filter apply, joins
|
|
695
|
+
* apply only when a predicate addresses one (#1030), and orderBy/limit/offset
|
|
696
|
+
* do NOT — those describe a page, and a reduction is not paginated.
|
|
697
|
+
*/
|
|
698
|
+
private matchedRecords;
|
|
699
|
+
/**
|
|
700
|
+
* Whether ANY record matches (#1347) — `count() > 0` without paying for the
|
|
701
|
+
* records after the first.
|
|
702
|
+
*
|
|
703
|
+
* The saving is real rather than cosmetic: `count()` evaluates every
|
|
704
|
+
* remaining clause against every candidate, so a `.filter(fn)` over 10_000
|
|
705
|
+
* records calls `fn` 10_000 times to answer a yes/no question. This returns
|
|
706
|
+
* at the first hit, and `__tests__/query-distinct-exists.test.ts` witnesses
|
|
707
|
+
* that by COUNTING the predicate's invocations — a boolean assertion cannot
|
|
708
|
+
* tell a short-circuit from a full scan.
|
|
709
|
+
*
|
|
710
|
+
* Same match set as `count()`. Two shapes do NOT short-circuit and fall
|
|
711
|
+
* back to it, because both must materialize the relation before anything
|
|
712
|
+
* can be tested: a `crossJoin` expansion, and a `where` clause addressing a
|
|
713
|
+
* join alias (#1030). Both still answer correctly.
|
|
714
|
+
*
|
|
715
|
+
* **Synchronous** (#1413) — returns `boolean`, not a promise; the cache it reads is
|
|
716
|
+
* already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
|
|
717
|
+
* (#1414); `.catch()` is not available. See the {@link Query} class doc.
|
|
718
|
+
*/
|
|
719
|
+
exists(): boolean;
|
|
553
720
|
/**
|
|
554
721
|
* Return the plan as a JSON-friendly object. FilterClause entries are
|
|
555
722
|
* stripped (their `fn` cannot be serialized) and replaced with
|
|
@@ -557,6 +724,95 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
557
724
|
*/
|
|
558
725
|
toPlan(): unknown;
|
|
559
726
|
}
|
|
727
|
+
export declare function isRangeOperator(op: string): op is '<' | '<=' | '>' | '>=' | 'between' | 'startsWith';
|
|
728
|
+
/**
|
|
729
|
+
* True when a Via binding claims the ORDERING of this field. Probed with
|
|
730
|
+
* two equal strings: `compareForOrder` returns `undefined` for any field
|
|
731
|
+
* no binding covers (money checks its field map first; lookup checks its
|
|
732
|
+
* `sortBy` declaration), and a number for one it does.
|
|
733
|
+
*/
|
|
734
|
+
export declare function viaOrdersField(via: ViaPipeline | undefined, field: string): boolean;
|
|
735
|
+
/**
|
|
736
|
+
* A range operand for the component just past a compound index's equality
|
|
737
|
+
* prefix. `op` repeats {@link isRangeOperator}'s union rather than importing
|
|
738
|
+
* `RangeOperator`, keeping this file's import list unchanged.
|
|
739
|
+
*/
|
|
740
|
+
/**
|
|
741
|
+
* The only slice of an index store the compound PICKERS read. Declared
|
|
742
|
+
* structurally (#1375) so `query/explain.ts` can share these pickers rather
|
|
743
|
+
* than re-implementing them — the mirror this file's `explain()` header warns
|
|
744
|
+
* about is one function narrower for every picker that moves here.
|
|
745
|
+
*/
|
|
746
|
+
export interface CompoundTupleSource {
|
|
747
|
+
compoundTuples(): ReadonlyArray<readonly string[]>;
|
|
748
|
+
}
|
|
749
|
+
export interface CompoundRange {
|
|
750
|
+
readonly op: '<' | '<=' | '>' | '>=' | 'between' | 'startsWith';
|
|
751
|
+
readonly value: unknown;
|
|
752
|
+
}
|
|
753
|
+
export interface CompoundPick {
|
|
754
|
+
readonly fields: readonly string[];
|
|
755
|
+
/** Equality operands for `fields[0..values.length-1]`, in index order. */
|
|
756
|
+
readonly values: readonly unknown[];
|
|
757
|
+
readonly range?: CompoundRange;
|
|
758
|
+
/** Indices into the plan's clause list that this pick answers. */
|
|
759
|
+
readonly consumed: ReadonlySet<number>;
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Split the top-level clauses into the `==` and range clauses a compound
|
|
763
|
+
* index could answer. Via-covered clauses are excluded for the same reason
|
|
764
|
+
* `candidateRecords` excludes them from the sorted path — a binding's
|
|
765
|
+
* `indexProbe` yields an equality operand in STORED form, never an ordered
|
|
766
|
+
* one, and this path compares raw operands. A repeated field keeps its FIRST
|
|
767
|
+
* clause; the duplicate stays in `remainingClauses` and is re-evaluated.
|
|
768
|
+
*/
|
|
769
|
+
export declare function indexableClauses(clauses: readonly Clause[]): {
|
|
770
|
+
eq: Map<string, {
|
|
771
|
+
value: unknown;
|
|
772
|
+
at: number;
|
|
773
|
+
}>;
|
|
774
|
+
ranges: Map<string, {
|
|
775
|
+
op: CompoundRange['op'];
|
|
776
|
+
value: unknown;
|
|
777
|
+
at: number;
|
|
778
|
+
}>;
|
|
779
|
+
};
|
|
780
|
+
/**
|
|
781
|
+
* Choose the declared field tuple that answers the most clauses: the longest
|
|
782
|
+
* equality PREFIX of the tuple, plus a range on the component immediately
|
|
783
|
+
* after it. A pick answering fewer than two clauses is declined — the
|
|
784
|
+
* single-field hash or sorted index already covers that, at lower cost.
|
|
785
|
+
*/
|
|
786
|
+
export declare function pickCompound(indexes: CompoundTupleSource, clauses: readonly Clause[]): CompoundPick | null;
|
|
787
|
+
/** The declared tuple that is exactly `eq`'s fields followed by `orderField`. */
|
|
788
|
+
export declare function pickCompoundOrder(indexes: CompoundTupleSource, eq: ReadonlyMap<string, {
|
|
789
|
+
value: unknown;
|
|
790
|
+
at: number;
|
|
791
|
+
}>, orderField: string): {
|
|
792
|
+
fields: readonly string[];
|
|
793
|
+
values: readonly unknown[];
|
|
794
|
+
} | null;
|
|
795
|
+
interface CandidateResult {
|
|
796
|
+
/** The reduced candidate set, materialized to record objects. */
|
|
797
|
+
readonly candidates: readonly unknown[];
|
|
798
|
+
/** The clauses that the index could not satisfy and must still be evaluated. */
|
|
799
|
+
readonly remainingClauses: readonly Clause[];
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Pick a candidate record set using the index store when possible.
|
|
803
|
+
*
|
|
804
|
+
* Strategy: scan the top-level clauses for the FIRST `==` or `in` clause
|
|
805
|
+
* against an indexed field. If found, use the index to materialize a
|
|
806
|
+
* candidate set and return the OTHER clauses as `remainingClauses`. The
|
|
807
|
+
* caller skips re-evaluating the index-driving clause because the index
|
|
808
|
+
* is authoritative for that field.
|
|
809
|
+
*
|
|
810
|
+
* This is a deliberately simple planner. A future optimizer could pick
|
|
811
|
+
* the most selective index, intersect multiple indexes, or push composite
|
|
812
|
+
* keys through. For the single-index fast path is good enough.
|
|
813
|
+
*/
|
|
814
|
+
/** @internal #1458 — used by the extension mixins in `query/reduce/`. */
|
|
815
|
+
export declare function candidateRecords(source: InternalSource, clauses: readonly Clause[]): CandidateResult;
|
|
560
816
|
/**
|
|
561
817
|
* Execute a plan against a snapshot of records.
|
|
562
818
|
* Pure function — same input, same output, no side effects.
|
|
@@ -565,3 +821,78 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
|
|
|
565
821
|
* cast the return type at the API surface (see `Query.toArray()`).
|
|
566
822
|
*/
|
|
567
823
|
export declare function executePlan(records: readonly unknown[], plan: QueryPlan): unknown[];
|
|
824
|
+
/**
|
|
825
|
+
* Build the per-record DECODED view factory for user-callback clauses
|
|
826
|
+
* (`filter` / `wherePredicate`) — those callbacks must see the canonical
|
|
827
|
+
* shape (e.g. money's decimal string), never a Via-transformed stored
|
|
828
|
+
* form. Field clauses are NOT affected: their operands were pre-built
|
|
829
|
+
* into raw stored space at build time. Returns undefined when the
|
|
830
|
+
* source's Via pipeline declares no result decode.
|
|
831
|
+
*/
|
|
832
|
+
/** @internal #1458 — used by `query/internal/maintenance.ts`. */
|
|
833
|
+
export declare function fnViewDecoder(source: InternalSource): ((r: unknown) => unknown) | undefined;
|
|
834
|
+
/** @internal #1458 — used by `query/internal/maintenance.ts`. */
|
|
835
|
+
export declare function filterRecords(records: readonly unknown[], clauses: readonly Clause[], decodeForFns?: (r: unknown) => unknown): unknown[];
|
|
836
|
+
/**
|
|
837
|
+
* Walk the clause list in declaration order, batching filter clauses and
|
|
838
|
+
* expanding on crossJoin clauses. Falls back to `candidateRecords + filterRecords`
|
|
839
|
+
* (index fast-path) when no crossJoin clauses are present.
|
|
840
|
+
*
|
|
841
|
+
* Precondition: `joinContext` must be non-null when any `CrossJoinClause` is in `clauses`.
|
|
842
|
+
*/
|
|
843
|
+
/** @internal #1458 — used by the extension mixins in `query/reduce/`. */
|
|
844
|
+
export declare function executeClausePipeline(source: InternalSource, clauses: readonly Clause[], joinContext: JoinContext): unknown[];
|
|
845
|
+
/**
|
|
846
|
+
* One `orderBy` entry, resolved: how to read its sort value off a record and
|
|
847
|
+
* how to compare two of those values.
|
|
848
|
+
*
|
|
849
|
+
* Split out of `sortRecords` so the keyset path (`page()`/`after()`) can
|
|
850
|
+
* compare a row against a cursor's STORED values with exactly the ordering
|
|
851
|
+
* the sort used — the alternative was a second comparator that would drift.
|
|
852
|
+
*/
|
|
853
|
+
interface OrderKeyPlan {
|
|
854
|
+
readonly entries: readonly {
|
|
855
|
+
readonly field: string;
|
|
856
|
+
readonly direction: 'asc' | 'desc';
|
|
857
|
+
readonly labelResolver: ((code: string) => string | undefined) | undefined;
|
|
858
|
+
/**
|
|
859
|
+
* The pipeline to ask for this entry's exact ordering, and the name to
|
|
860
|
+
* ask it about (#1337). For a left-side field that is the source's own
|
|
861
|
+
* pipeline and the field verbatim; for `client.credit` it is the RIGHT
|
|
862
|
+
* collection's pipeline and `credit`, because a pipeline covers bare
|
|
863
|
+
* field names. `undefined` → the generic comparator, as before.
|
|
864
|
+
*/
|
|
865
|
+
readonly via: ViaPipeline | undefined;
|
|
866
|
+
readonly viaField: string;
|
|
867
|
+
}[];
|
|
868
|
+
}
|
|
869
|
+
/** @internal #1458 — used by `query/internal/maintenance.ts`. */
|
|
870
|
+
export declare function buildOrderKeyPlan(orderBy: readonly OrderBy[], via?: ViaPipeline, labelMaps?: Map<string, (code: string) => string | undefined>, aliasVia?: ReadonlyMap<string, ViaPipeline>): OrderKeyPlan;
|
|
871
|
+
/** The sort-key tuple of one record, in `orderBy` order. */
|
|
872
|
+
/** @internal #1458 — used by `query/internal/maintenance.ts`. */
|
|
873
|
+
export declare function orderKeyOf(plan: OrderKeyPlan, record: unknown): unknown[];
|
|
874
|
+
/** @internal #1458 — used by `query/internal/maintenance.ts`. */
|
|
875
|
+
export declare function compareOrderKeys(plan: OrderKeyPlan, a: readonly unknown[], b: readonly unknown[]): number;
|
|
876
|
+
/**
|
|
877
|
+
* Exported (#1342) for the cross-collection union read path: a union's sort
|
|
878
|
+
* runs AFTER the legs are concatenated, and it has to be the same comparator
|
|
879
|
+
* a single collection's `orderBy` uses or two queries over the same rows
|
|
880
|
+
* would order them differently.
|
|
881
|
+
*/
|
|
882
|
+
export declare function sortRecords(records: unknown[], orderBy: readonly OrderBy[], via?: ViaPipeline, labelMaps?: Map<string, (code: string) => string | undefined>, aliasVia?: ReadonlyMap<string, ViaPipeline>): unknown[];
|
|
883
|
+
/**
|
|
884
|
+
* Build a dict-label resolver for `Query.groupBy(field)` when the
|
|
885
|
+
* grouping field is a `dictKey`. Extracted from the inline closure
|
|
886
|
+
* inside `groupBy` so the multi-key path (which has no meaningful
|
|
887
|
+
* `<field>Label` shape) can skip it cleanly. Pure refactor — no
|
|
888
|
+
* behaviour change for the single-field path.
|
|
889
|
+
*
|
|
890
|
+
* Returns `undefined` when:
|
|
891
|
+
* - the join context lacks a `resolveDictSource` hook, or
|
|
892
|
+
* - no dictionary source is registered for `field`.
|
|
893
|
+
*
|
|
894
|
+
* @internal
|
|
895
|
+
*/
|
|
896
|
+
/** @internal #1458 — used by the extension mixins in `query/reduce/`. */
|
|
897
|
+
export declare function buildDictLabelResolver(joinCtx: JoinContext | undefined, field: string): ((key: string, locale: string, fallback?: string | readonly string[]) => Promise<string | undefined>) | undefined;
|
|
898
|
+
export {};
|