@noy-db/hub 0.10.0-pre.1 → 0.10.0-pre.2
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 +81 -0
- package/dist/api-QSEKT4KS.js +15 -0
- package/dist/as/index.js +19 -12
- package/dist/as/index.js.map +1 -1
- package/dist/at/index.js +6 -9
- package/dist/attestation/index.js +16 -19
- package/dist/attestation/index.js.map +1 -1
- package/dist/{backup-6EKBNC67.js → backup-BHKVK5SD.js} +9 -12
- package/dist/{backup-6EKBNC67.js.map → backup-BHKVK5SD.js.map} +1 -1
- package/dist/blobs/index.js +10 -13
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +11 -14
- package/dist/broker/index.js.map +1 -1
- package/dist/by/index.js +2 -2
- package/dist/capsule/contract.d.ts +176 -16
- package/dist/capsule/contract.js +35 -30
- package/dist/capsule/enclave-aes/bound.d.ts +11 -1
- package/dist/capsule/enclave-aes/classify/digest.d.ts +4 -2
- package/dist/capsule/enclave-aes/index.d.ts +9 -0
- package/dist/capsule/enclave-aes/index.js +643 -78
- package/dist/capsule/enclave-aes/index.js.map +1 -1
- package/dist/capsule/enclave-aes/primitives.d.ts +2 -2
- package/dist/capsule/index.d.ts +1 -1
- package/dist/capsule/plumbing/classify-reveal.d.ts +29 -0
- package/dist/capsule/plumbing/classify-verify.d.ts +53 -0
- package/dist/capsule/plumbing/index.d.ts +17 -0
- package/dist/{capsule-QJJFUUSH.js → capsule-YAITMH77.js} +16 -9
- package/dist/cargo/index.js +34 -36
- package/dist/{chunk-J57OMNJ4.js → chunk-23A4SBRR.js} +3 -4
- package/dist/{chunk-J57OMNJ4.js.map → chunk-23A4SBRR.js.map} +1 -1
- package/dist/{chunk-E3CUGBGW.js → chunk-24AGG4PP.js} +3 -3
- package/dist/{chunk-M2VLXPRU.js → chunk-24IJZA4M.js} +14 -8
- package/dist/chunk-24IJZA4M.js.map +1 -0
- package/dist/{chunk-BCJAUHSG.js → chunk-2NVQ5SEA.js} +15 -5
- package/dist/chunk-2NVQ5SEA.js.map +1 -0
- package/dist/{chunk-MRVQKRXI.js → chunk-2SIREKBR.js} +2 -2
- package/dist/{chunk-CE443VXM.js → chunk-37FOG6AE.js} +14 -7
- package/dist/chunk-37FOG6AE.js.map +1 -0
- package/dist/{chunk-ZZZVNHN2.js → chunk-3M2KK7O7.js} +3 -3
- package/dist/{chunk-P6FATPXQ.js → chunk-3ZCVY3T6.js} +2 -2
- package/dist/{chunk-I7NDTNHK.js → chunk-4CGWLHPQ.js} +6 -6
- package/dist/{chunk-PVQIME6P.js → chunk-56Z4NOC6.js} +3 -3
- package/dist/{chunk-XBG6YJPK.js → chunk-5AVIUJP4.js} +11 -9
- package/dist/{chunk-XBG6YJPK.js.map → chunk-5AVIUJP4.js.map} +1 -1
- package/dist/{chunk-HQFTE3DX.js → chunk-5BGHAVBN.js} +2 -2
- package/dist/{chunk-QHG7GQKM.js → chunk-5JNEDW7I.js} +2 -2
- package/dist/{chunk-NC6CF37L.js → chunk-5OWJSDTO.js} +4 -4
- package/dist/{chunk-NC6CF37L.js.map → chunk-5OWJSDTO.js.map} +1 -1
- package/dist/{chunk-YAYDDYRU.js → chunk-5Y4MO7UQ.js} +4 -4
- package/dist/{chunk-TLIFNRU5.js → chunk-63LZLRWG.js} +2 -2
- package/dist/{chunk-BUFFPAR2.js → chunk-74W56QPY.js} +4 -4
- package/dist/{chunk-VPG2UJYR.js → chunk-7KNYLHVX.js} +3 -3
- package/dist/chunk-7KNYLHVX.js.map +1 -0
- package/dist/{chunk-LFUID7OW.js → chunk-7VJ2SIEI.js} +42 -22
- package/dist/chunk-7VJ2SIEI.js.map +1 -0
- package/dist/{chunk-U2N7DH4S.js → chunk-AHA7UALU.js} +4 -4
- package/dist/{chunk-NB2DYYZL.js → chunk-AIHBYQHF.js} +254 -118
- package/dist/chunk-AIHBYQHF.js.map +1 -0
- package/dist/{chunk-RNQ7V4LH.js → chunk-ANYX2M6P.js} +3 -3
- package/dist/{chunk-VFGLMRO2.js → chunk-ATKYMRBC.js} +4 -4
- package/dist/{chunk-7UHLO4ZN.js → chunk-B2HU55QD.js} +2 -2
- package/dist/{chunk-RKOXA5GZ.js → chunk-BEKMLYQ4.js} +4 -4
- package/dist/{chunk-AYUMAPOS.js → chunk-BPFXD4EX.js} +23 -3
- package/dist/chunk-BPFXD4EX.js.map +1 -0
- package/dist/{chunk-R4PDYYK5.js → chunk-C2NXAR3D.js} +5 -5
- package/dist/{chunk-XBOGGTUJ.js → chunk-CJBWJO5P.js} +6 -6
- package/dist/{chunk-XBOGGTUJ.js.map → chunk-CJBWJO5P.js.map} +1 -1
- package/dist/{chunk-44CU4N7N.js → chunk-CQLMRCKX.js} +2 -2
- package/dist/{chunk-VUBRHJ4H.js → chunk-CR5UPYIJ.js} +1 -1
- package/dist/chunk-CR5UPYIJ.js.map +1 -0
- package/dist/{chunk-4XXRPSPS.js → chunk-DS2JXSUA.js} +6 -6
- package/dist/{chunk-X6Z2SIRF.js → chunk-E2JIE4S3.js} +2 -2
- package/dist/{chunk-EQ6C2ZPT.js → chunk-E7Y4J4GL.js} +2 -2
- package/dist/{chunk-ZMDSBTFT.js → chunk-ECDM6YRX.js} +2 -2
- package/dist/{chunk-WRLWEYHY.js → chunk-EFINFZIF.js} +11 -1
- package/dist/chunk-EFINFZIF.js.map +1 -0
- package/dist/{chunk-JM72WDAY.js → chunk-EM56MHN5.js} +6 -6
- package/dist/{chunk-YWJMM2WY.js → chunk-EQXOJH6O.js} +4 -4
- package/dist/{chunk-ME6LY5UG.js → chunk-ET3U2C3A.js} +2 -2
- package/dist/{chunk-G2KLVCKO.js → chunk-EU4G7PQH.js} +2 -2
- package/dist/{chunk-WJXLTO43.js → chunk-EUCUYK5E.js} +10 -10
- package/dist/{chunk-EPMX3SCC.js → chunk-EWSIJDWO.js} +4 -4
- package/dist/{chunk-KFYUQMF5.js → chunk-F2FD4LSB.js} +2 -2
- package/dist/{chunk-L4UL4IAR.js → chunk-F7ENMZYJ.js} +2 -2
- package/dist/{chunk-5OG7YQX5.js → chunk-FIIVYQOW.js} +5 -5
- package/dist/{chunk-4RF7DVH2.js → chunk-FPK2LPLR.js} +8 -8
- package/dist/chunk-FPK2LPLR.js.map +1 -0
- package/dist/{chunk-2EF2Z4UN.js → chunk-FQEUJGBV.js} +2 -2
- package/dist/{chunk-UORWAG7K.js → chunk-FY4FFNKK.js} +2 -2
- package/dist/{chunk-WA4ZPMKP.js → chunk-GDCYZGPB.js} +2 -2
- package/dist/{chunk-3HDBDUX2.js → chunk-H6Q7GKLI.js} +2 -2
- package/dist/{chunk-654RE5YC.js → chunk-HDAPQF6Q.js} +3 -3
- package/dist/{chunk-B5PWQMZN.js → chunk-HRLMUZLI.js} +5 -5
- package/dist/{chunk-QWC2PRUR.js → chunk-HRNQYGLQ.js} +2 -2
- package/dist/{chunk-YIVAKBCW.js → chunk-I4S7IZSS.js} +321 -235
- package/dist/chunk-I4S7IZSS.js.map +1 -0
- package/dist/{chunk-7DWAYY45.js → chunk-IN4XZJYD.js} +4 -3
- package/dist/{chunk-7DWAYY45.js.map → chunk-IN4XZJYD.js.map} +1 -1
- package/dist/{chunk-JGYCKX56.js → chunk-ISIXU45J.js} +1 -1
- package/dist/{chunk-JGYCKX56.js.map → chunk-ISIXU45J.js.map} +1 -1
- package/dist/{chunk-7PFOKQOJ.js → chunk-J4L4AS2W.js} +2 -2
- package/dist/{chunk-PZZWAHEJ.js → chunk-JPSOFWJR.js} +2 -2
- package/dist/{chunk-B24ODIKE.js → chunk-JRCO67NG.js} +2 -2
- package/dist/{chunk-PNEBCVXP.js → chunk-JW3I3NNZ.js} +2 -2
- package/dist/{chunk-MXNYMFHE.js → chunk-JZMPSQBH.js} +4 -4
- package/dist/{chunk-IIQMNZXT.js → chunk-K5TVSOPQ.js} +5 -5
- package/dist/{chunk-ZPXCQNXJ.js → chunk-K75SL74I.js} +2 -2
- package/dist/{chunk-TA5VTIC4.js → chunk-KA4AAUST.js} +2 -2
- package/dist/chunk-KHSBMLQE.js +161 -0
- package/dist/chunk-KHSBMLQE.js.map +1 -0
- package/dist/{chunk-JWLVBYP4.js → chunk-KUGUML7H.js} +3 -3
- package/dist/{chunk-GWYZEPBY.js → chunk-L4J5NC2Q.js} +2 -2
- package/dist/{chunk-PIF3TNU2.js → chunk-LIX4QPMM.js} +2 -2
- package/dist/{chunk-LCY6ANV2.js → chunk-LWQFGR34.js} +3 -3
- package/dist/{chunk-HQPS27BT.js → chunk-MMSSHMHW.js} +2 -2
- package/dist/{chunk-T5EXREMW.js → chunk-N25Z6PR4.js} +6 -5
- package/dist/chunk-N25Z6PR4.js.map +1 -0
- package/dist/{chunk-ND6S2DKC.js → chunk-N5S2BCW3.js} +2 -2
- package/dist/{chunk-63INIVE4.js → chunk-NIZH2TYZ.js} +2 -2
- package/dist/{chunk-WQHEEYQA.js → chunk-NLDBQHDV.js} +2 -2
- package/dist/{chunk-SKSHWV3E.js → chunk-NQQ4MOPC.js} +4 -4
- package/dist/{chunk-B6EWMGFX.js → chunk-NUBI6PYH.js} +2 -2
- package/dist/{chunk-VWUSOPBF.js → chunk-NYEXUZDW.js} +4 -4
- package/dist/{chunk-GU6QXHPZ.js → chunk-OIBFIWVJ.js} +4 -4
- package/dist/chunk-OIBFIWVJ.js.map +1 -0
- package/dist/{chunk-PIEX7WSG.js → chunk-OOLF5FU2.js} +2 -2
- package/dist/{chunk-HOK5KGBO.js → chunk-OQA7UF2Q.js} +3 -3
- package/dist/{chunk-JMMG7UWR.js → chunk-ORJPICJI.js} +2 -2
- package/dist/{chunk-IF2M43G4.js → chunk-PBRD75JF.js} +2 -2
- package/dist/{chunk-X7Q2XL5U.js → chunk-PDCBL23X.js} +39 -17
- package/dist/chunk-PDCBL23X.js.map +1 -0
- package/dist/{chunk-PR2R57YF.js → chunk-PR36DD2X.js} +7 -7
- package/dist/{chunk-LFCX2JAV.js → chunk-PV4HIC4E.js} +2 -2
- package/dist/{chunk-SKF3DF7M.js → chunk-PZNK4HTV.js} +3 -3
- package/dist/{chunk-5F3KYRG6.js → chunk-QBLPLNPE.js} +3 -3
- package/dist/{chunk-4ZRNXWF6.js → chunk-QZXUISRF.js} +5 -5
- package/dist/{chunk-7Q72NTBE.js → chunk-RBXYO7MD.js} +5 -5
- package/dist/{chunk-S2BQV6HM.js → chunk-RIACRFWA.js} +4 -4
- package/dist/{chunk-DO33YCSZ.js → chunk-RL6RNDJQ.js} +8 -8
- package/dist/{chunk-2SPWVX6W.js → chunk-SJ2P7UXD.js} +7 -7
- package/dist/{chunk-26FMWFAW.js → chunk-SWXS4LV3.js} +11 -11
- package/dist/{chunk-J3ECXFU7.js → chunk-TOTCZFRF.js} +2 -2
- package/dist/{chunk-AN4GUUQM.js → chunk-TT4D52EK.js} +6 -6
- package/dist/{chunk-KOJHCSGS.js → chunk-U7CMJY5P.js} +10 -10
- package/dist/{chunk-DDR6SCG7.js → chunk-UNKTZDA2.js} +11 -11
- package/dist/{chunk-DDR6SCG7.js.map → chunk-UNKTZDA2.js.map} +1 -1
- package/dist/{chunk-WVML7HUZ.js → chunk-UXH4AKH3.js} +95 -151
- package/dist/chunk-UXH4AKH3.js.map +1 -0
- package/dist/{chunk-MKQHIYUY.js → chunk-UZVHSYIF.js} +2 -2
- package/dist/{chunk-FDGE56FS.js → chunk-VHKAW5OI.js} +29 -5
- package/dist/chunk-VHKAW5OI.js.map +1 -0
- package/dist/{chunk-OCSKQUNE.js → chunk-VKZ3TDET.js} +3 -3
- package/dist/{chunk-ESDYDGPH.js → chunk-VLZPUG5A.js} +4 -4
- package/dist/{chunk-PCYIDPFM.js → chunk-VSN5FLMI.js} +2 -2
- package/dist/{chunk-S4QDN4IQ.js → chunk-VYBBE7RN.js} +5 -5
- package/dist/{chunk-XBFJRCRW.js → chunk-WHK4JVKF.js} +8 -8
- package/dist/{chunk-CZEWEOOV.js → chunk-X4LDBALX.js} +2 -2
- package/dist/{chunk-YWEPWJRG.js → chunk-X67E7NIJ.js} +3 -3
- package/dist/{chunk-RRI3JBD6.js → chunk-XMARKBUC.js} +3 -3
- package/dist/{chunk-B3B6HV5S.js → chunk-XMBBTETD.js} +2 -2
- package/dist/{chunk-GQ4MF3CM.js → chunk-XMBTAN5E.js} +28 -14
- package/dist/chunk-XMBTAN5E.js.map +1 -0
- package/dist/{chunk-GEICXZCQ.js → chunk-XROQP6IQ.js} +4 -4
- package/dist/chunk-XWWDZKLS.js +196 -0
- package/dist/chunk-XWWDZKLS.js.map +1 -0
- package/dist/{chunk-VX72USUQ.js → chunk-Y2RYUWSQ.js} +10 -10
- package/dist/{chunk-6I5RRBPP.js → chunk-YCTSQV7K.js} +5 -5
- package/dist/{chunk-7WV6R7RG.js → chunk-YF7P2DG7.js} +2 -2
- package/dist/{chunk-ZZLIFVZG.js → chunk-ZG7DBIVX.js} +2 -2
- package/dist/{chunk-Y6WJJRVV.js → chunk-ZGJ775X7.js} +2 -2
- package/dist/{chunk-PQGCWTTI.js → chunk-ZQQLOEWN.js} +3 -3
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-LY7KQFPH.js → classified-marker-HKMRC7SC.js} +3 -3
- package/dist/{reveal-LK3GX4L6.js → classify-reveal-YSJKJEIR.js} +7 -12
- package/dist/classify-reveal-YSJKJEIR.js.map +1 -0
- package/dist/{verify-FT5COLP2.js → classify-verify-ZCTKYQ43.js} +31 -41
- package/dist/classify-verify-ZCTKYQ43.js.map +1 -0
- package/dist/collection-facade-PPKNUR2J.js +38 -0
- package/dist/{computed-XG7LFB7A.js → computed-UCYVPMZA.js} +3 -3
- package/dist/consent/index.js +6 -9
- package/dist/consent/index.js.map +1 -1
- package/dist/cover/index.js +6 -9
- package/dist/custody/index.js +11 -13
- package/dist/{dead-filter-F4EKHDQY.js → dead-filter-YOBWRG4O.js} +8 -11
- package/dist/{dead-filter-F4EKHDQY.js.map → dead-filter-YOBWRG4O.js.map} +1 -1
- package/dist/debug/index.js +5 -8
- package/dist/debug/index.js.map +1 -1
- package/dist/delegation-SNALWRMO.js +24 -0
- package/dist/derivations/index.js +20 -23
- package/dist/derive-4GNU4E4I.js +17 -0
- package/dist/directory/index.js +7 -10
- package/dist/{dispatch-YNHZLB72.js → dispatch-QW32QBLW.js} +17 -20
- package/dist/{dispatch-YNHZLB72.js.map → dispatch-QW32QBLW.js.map} +1 -1
- package/dist/{dispatch-URNW4Q2T.js → dispatch-V5WLDTVX.js} +5 -5
- package/dist/executor-7QN22OKI.js +8 -0
- package/dist/executor-BJZJNVBB.js +8 -0
- package/dist/executor-JEAAEJUM.js +32 -0
- package/dist/export-accessible-TVO2KQPG.js +20 -0
- package/dist/extract-partition-43CLDRN4.js +33 -0
- package/dist/{fanout-sidecar-6CSMTIVB.js → fanout-sidecar-DDONAFJT.js} +6 -9
- package/dist/{fanout-sidecar-6CSMTIVB.js.map → fanout-sidecar-DDONAFJT.js.map} +1 -1
- package/dist/forget/index.js +6 -9
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +4 -4
- package/dist/history/index.js +11 -14
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +11 -14
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +122 -123
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +5 -5
- package/dist/introspection/index.js +8 -11
- package/dist/issue-EIHEDAXM.js +16 -0
- package/dist/kernel/capsule-requirements.d.ts +84 -0
- package/dist/kernel/errors.d.ts +15 -0
- package/dist/kernel/export-scope.d.ts +28 -1
- package/dist/kernel/store-segment-guard.d.ts +29 -0
- package/dist/kernel/types.d.ts +164 -8
- package/dist/kernel/validation.d.ts +32 -0
- package/dist/kernel/vault.d.ts +3 -3
- package/dist/{ledger-FV6NFTOR.js → ledger-BMVUFQ3R.js} +8 -11
- package/dist/liberate-7KHXCLNJ.js +23 -0
- package/dist/link-set-PC2EJRKL.js +26 -0
- package/dist/{managed-secret-PBJZHPQO.js → managed-secret-RPRVEYZA.js} +7 -10
- package/dist/materialized-views/index.js +23 -26
- package/dist/{migrate-cek-J634S4NU.js → migrate-cek-DTSCWGEF.js} +2 -2
- package/dist/money/index.js +5 -5
- package/dist/noydb-AYDNOXAX.js +98 -0
- package/dist/on/index.js +11 -13
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +9 -12
- package/dist/pod/index.js +65 -67
- package/dist/{pod-handle-IOEYUDCA.js → pod-handle-KBPQRN6Q.js} +6 -9
- package/dist/{pod-handle-IOEYUDCA.js.map → pod-handle-KBPQRN6Q.js.map} +1 -1
- package/dist/policy/index.js +7 -10
- package/dist/port/at/index.d.ts +1 -0
- package/dist/port/with/collection-registries.d.ts +37 -0
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-L42VXYFB.js → post-register-RITSNASO.js} +6 -6
- package/dist/query/all/index.js +15 -15
- package/dist/query/index.js +7 -7
- package/dist/query/live/index.js +7 -7
- package/dist/query/reduce/index.js +10 -10
- package/dist/query/relate/index.js +9 -9
- package/dist/reduce/index.js +8 -8
- package/dist/register-BB34SK7E.js +27 -0
- package/dist/registry-65L6V5TO.js +20 -0
- package/dist/registry-HU62GPWA.js +32 -0
- package/dist/registry-SMNK6UM4.js +8 -0
- package/dist/registry-X5VPBKCO.js +8 -0
- package/dist/request-withdrawal-4SKAH46W.js +26 -0
- package/dist/{restore-to-ZQ2MXOFO.js → restore-to-VQHT67OH.js} +7 -10
- package/dist/{restore-to-ZQ2MXOFO.js.map → restore-to-VQHT67OH.js.map} +1 -1
- package/dist/revoke-IF5PX2JY.js +21 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +2 -2
- package/dist/sealed-record/index.js +9 -12
- package/dist/sealed-record/index.js.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/{seed-XHQQF6LJ.js → seed-F2OSDZJR.js} +11 -13
- package/dist/{seed-XHQQF6LJ.js.map → seed-F2OSDZJR.js.map} +1 -1
- package/dist/sequence/index.js +6 -9
- package/dist/session/index.js +6 -9
- package/dist/session/index.js.map +1 -1
- package/dist/shadow/index.js +2 -2
- package/dist/signer-5P7IZC2K.js +20 -0
- package/dist/snapshots/index.js +8 -10
- package/dist/snapshots/index.js.map +1 -1
- package/dist/{stale-XY2QUSGU.js → stale-PUCZH5GJ.js} +7 -10
- package/dist/storage-5EGY5OYE.js +18 -0
- package/dist/store/index.js +1 -1
- package/dist/{store-coordination-provider-F7YG22D3.js → store-coordination-provider-SEQM7SHJ.js} +7 -10
- package/dist/{store-coordination-provider-F7YG22D3.js.map → store-coordination-provider-SEQM7SHJ.js.map} +1 -1
- package/dist/sync/index.js +13 -15
- package/dist/sync/index.js.map +1 -1
- package/dist/team/index.js +14 -16
- package/dist/tiers/index.js +8 -11
- package/dist/to/index.js +2 -2
- package/dist/transactions/index.js +3 -3
- package/dist/util/index.js +1 -1
- package/dist/vault-diff-H7LT5ZBJ.js +8 -0
- package/dist/vault-head/index.js +5 -8
- package/dist/vault-head/index.js.map +1 -1
- package/dist/walk-Z4N7PCZ2.js +17 -0
- package/dist/with-audit/portability/export-accessible.d.ts +3 -1
- package/dist/with-cargo/vault-diff.d.ts +28 -0
- package/dist/with-commit/sequence/index.d.ts +22 -0
- package/dist/with-party/team/keyring.d.ts +77 -0
- package/dist/with-party/team/managed-secret.d.ts +40 -3
- package/dist/with-shape/manifest/storage.d.ts +2 -2
- package/dist/with-shape/manifest/writer.d.ts +2 -2
- package/dist/with-store/store-middleware.d.ts +18 -5
- package/dist/withdraw-accessible-CRCIQSTL.js +23 -0
- package/package.json +3 -3
- package/dist/api-ARU35MCC.js +0 -18
- package/dist/capsule/enclave-aes/classify/reveal.d.ts +0 -10
- package/dist/capsule/enclave-aes/classify/verify.d.ts +0 -36
- package/dist/chunk-4RF7DVH2.js.map +0 -1
- package/dist/chunk-6B4X447I.js +0 -40
- package/dist/chunk-6B4X447I.js.map +0 -1
- package/dist/chunk-6Y3UJT5H.js +0 -157
- package/dist/chunk-6Y3UJT5H.js.map +0 -1
- package/dist/chunk-AYUMAPOS.js.map +0 -1
- package/dist/chunk-BCJAUHSG.js.map +0 -1
- package/dist/chunk-CE443VXM.js.map +0 -1
- package/dist/chunk-FDGE56FS.js.map +0 -1
- package/dist/chunk-GLSRKIU3.js +0 -591
- package/dist/chunk-GLSRKIU3.js.map +0 -1
- package/dist/chunk-GQ4MF3CM.js.map +0 -1
- package/dist/chunk-GU6QXHPZ.js.map +0 -1
- package/dist/chunk-LFUID7OW.js.map +0 -1
- package/dist/chunk-M2VLXPRU.js.map +0 -1
- package/dist/chunk-NB2DYYZL.js.map +0 -1
- package/dist/chunk-NH2UOV3B.js +0 -18
- package/dist/chunk-NH2UOV3B.js.map +0 -1
- package/dist/chunk-OJAFKGI7.js +0 -27
- package/dist/chunk-OJAFKGI7.js.map +0 -1
- package/dist/chunk-PVBKEBJU.js +0 -22
- package/dist/chunk-PVBKEBJU.js.map +0 -1
- package/dist/chunk-RQLCOSEJ.js +0 -78
- package/dist/chunk-RQLCOSEJ.js.map +0 -1
- package/dist/chunk-T5EXREMW.js.map +0 -1
- package/dist/chunk-VPG2UJYR.js.map +0 -1
- package/dist/chunk-VUBRHJ4H.js.map +0 -1
- package/dist/chunk-WRLWEYHY.js.map +0 -1
- package/dist/chunk-WVML7HUZ.js.map +0 -1
- package/dist/chunk-X7Q2XL5U.js.map +0 -1
- package/dist/chunk-YIVAKBCW.js.map +0 -1
- package/dist/collection-facade-SETOHJ3R.js +0 -41
- package/dist/delegation-JIQCMKW6.js +0 -26
- package/dist/derive-45KCFFOS.js +0 -20
- package/dist/executor-BVVZ5UHG.js +0 -8
- package/dist/executor-R25UN3FA.js +0 -8
- package/dist/executor-SIYBLT3P.js +0 -35
- package/dist/export-accessible-P672FZEJ.js +0 -22
- package/dist/extract-partition-DQ3FVL6H.js +0 -35
- package/dist/find-HHF2HBAC.js +0 -10
- package/dist/issue-NPLQHB3S.js +0 -19
- package/dist/liberate-A7WASOCG.js +0 -25
- package/dist/link-set-UMRSGMQ5.js +0 -29
- package/dist/noydb-V23UJKHT.js +0 -100
- package/dist/register-2VINJWYJ.js +0 -30
- package/dist/registry-3VLHDUID.js +0 -8
- package/dist/registry-6HVHDR3P.js +0 -35
- package/dist/registry-V4FQUMYP.js +0 -23
- package/dist/registry-Z2E6ZCPM.js +0 -8
- package/dist/request-withdrawal-PSIHKQP4.js +0 -28
- package/dist/reveal-LK3GX4L6.js.map +0 -1
- package/dist/revoke-2NYMID63.js +0 -24
- package/dist/signer-CP6XZLE3.js +0 -23
- package/dist/storage-QTM6JYQF.js +0 -21
- package/dist/vault-diff-C6WUJFNP.js +0 -8
- package/dist/verify-FT5COLP2.js.map +0 -1
- package/dist/walk-52FW6EKP.js +0 -20
- package/dist/withdraw-accessible-IVMKJGEN.js +0 -25
- package/dist/withdraw-accessible-IVMKJGEN.js.map +0 -1
- /package/dist/{api-ARU35MCC.js.map → api-QSEKT4KS.js.map} +0 -0
- /package/dist/{capsule-QJJFUUSH.js.map → capsule-YAITMH77.js.map} +0 -0
- /package/dist/{chunk-E3CUGBGW.js.map → chunk-24AGG4PP.js.map} +0 -0
- /package/dist/{chunk-MRVQKRXI.js.map → chunk-2SIREKBR.js.map} +0 -0
- /package/dist/{chunk-ZZZVNHN2.js.map → chunk-3M2KK7O7.js.map} +0 -0
- /package/dist/{chunk-P6FATPXQ.js.map → chunk-3ZCVY3T6.js.map} +0 -0
- /package/dist/{chunk-I7NDTNHK.js.map → chunk-4CGWLHPQ.js.map} +0 -0
- /package/dist/{chunk-PVQIME6P.js.map → chunk-56Z4NOC6.js.map} +0 -0
- /package/dist/{chunk-HQFTE3DX.js.map → chunk-5BGHAVBN.js.map} +0 -0
- /package/dist/{chunk-QHG7GQKM.js.map → chunk-5JNEDW7I.js.map} +0 -0
- /package/dist/{chunk-YAYDDYRU.js.map → chunk-5Y4MO7UQ.js.map} +0 -0
- /package/dist/{chunk-TLIFNRU5.js.map → chunk-63LZLRWG.js.map} +0 -0
- /package/dist/{chunk-BUFFPAR2.js.map → chunk-74W56QPY.js.map} +0 -0
- /package/dist/{chunk-U2N7DH4S.js.map → chunk-AHA7UALU.js.map} +0 -0
- /package/dist/{chunk-RNQ7V4LH.js.map → chunk-ANYX2M6P.js.map} +0 -0
- /package/dist/{chunk-VFGLMRO2.js.map → chunk-ATKYMRBC.js.map} +0 -0
- /package/dist/{chunk-7UHLO4ZN.js.map → chunk-B2HU55QD.js.map} +0 -0
- /package/dist/{chunk-RKOXA5GZ.js.map → chunk-BEKMLYQ4.js.map} +0 -0
- /package/dist/{chunk-R4PDYYK5.js.map → chunk-C2NXAR3D.js.map} +0 -0
- /package/dist/{chunk-44CU4N7N.js.map → chunk-CQLMRCKX.js.map} +0 -0
- /package/dist/{chunk-4XXRPSPS.js.map → chunk-DS2JXSUA.js.map} +0 -0
- /package/dist/{chunk-X6Z2SIRF.js.map → chunk-E2JIE4S3.js.map} +0 -0
- /package/dist/{chunk-EQ6C2ZPT.js.map → chunk-E7Y4J4GL.js.map} +0 -0
- /package/dist/{chunk-ZMDSBTFT.js.map → chunk-ECDM6YRX.js.map} +0 -0
- /package/dist/{chunk-JM72WDAY.js.map → chunk-EM56MHN5.js.map} +0 -0
- /package/dist/{chunk-YWJMM2WY.js.map → chunk-EQXOJH6O.js.map} +0 -0
- /package/dist/{chunk-ME6LY5UG.js.map → chunk-ET3U2C3A.js.map} +0 -0
- /package/dist/{chunk-G2KLVCKO.js.map → chunk-EU4G7PQH.js.map} +0 -0
- /package/dist/{chunk-WJXLTO43.js.map → chunk-EUCUYK5E.js.map} +0 -0
- /package/dist/{chunk-EPMX3SCC.js.map → chunk-EWSIJDWO.js.map} +0 -0
- /package/dist/{chunk-KFYUQMF5.js.map → chunk-F2FD4LSB.js.map} +0 -0
- /package/dist/{chunk-L4UL4IAR.js.map → chunk-F7ENMZYJ.js.map} +0 -0
- /package/dist/{chunk-5OG7YQX5.js.map → chunk-FIIVYQOW.js.map} +0 -0
- /package/dist/{chunk-2EF2Z4UN.js.map → chunk-FQEUJGBV.js.map} +0 -0
- /package/dist/{chunk-UORWAG7K.js.map → chunk-FY4FFNKK.js.map} +0 -0
- /package/dist/{chunk-WA4ZPMKP.js.map → chunk-GDCYZGPB.js.map} +0 -0
- /package/dist/{chunk-3HDBDUX2.js.map → chunk-H6Q7GKLI.js.map} +0 -0
- /package/dist/{chunk-654RE5YC.js.map → chunk-HDAPQF6Q.js.map} +0 -0
- /package/dist/{chunk-B5PWQMZN.js.map → chunk-HRLMUZLI.js.map} +0 -0
- /package/dist/{chunk-QWC2PRUR.js.map → chunk-HRNQYGLQ.js.map} +0 -0
- /package/dist/{chunk-7PFOKQOJ.js.map → chunk-J4L4AS2W.js.map} +0 -0
- /package/dist/{chunk-PZZWAHEJ.js.map → chunk-JPSOFWJR.js.map} +0 -0
- /package/dist/{chunk-B24ODIKE.js.map → chunk-JRCO67NG.js.map} +0 -0
- /package/dist/{chunk-PNEBCVXP.js.map → chunk-JW3I3NNZ.js.map} +0 -0
- /package/dist/{chunk-MXNYMFHE.js.map → chunk-JZMPSQBH.js.map} +0 -0
- /package/dist/{chunk-IIQMNZXT.js.map → chunk-K5TVSOPQ.js.map} +0 -0
- /package/dist/{chunk-ZPXCQNXJ.js.map → chunk-K75SL74I.js.map} +0 -0
- /package/dist/{chunk-TA5VTIC4.js.map → chunk-KA4AAUST.js.map} +0 -0
- /package/dist/{chunk-JWLVBYP4.js.map → chunk-KUGUML7H.js.map} +0 -0
- /package/dist/{chunk-GWYZEPBY.js.map → chunk-L4J5NC2Q.js.map} +0 -0
- /package/dist/{chunk-PIF3TNU2.js.map → chunk-LIX4QPMM.js.map} +0 -0
- /package/dist/{chunk-LCY6ANV2.js.map → chunk-LWQFGR34.js.map} +0 -0
- /package/dist/{chunk-HQPS27BT.js.map → chunk-MMSSHMHW.js.map} +0 -0
- /package/dist/{chunk-ND6S2DKC.js.map → chunk-N5S2BCW3.js.map} +0 -0
- /package/dist/{chunk-63INIVE4.js.map → chunk-NIZH2TYZ.js.map} +0 -0
- /package/dist/{chunk-WQHEEYQA.js.map → chunk-NLDBQHDV.js.map} +0 -0
- /package/dist/{chunk-SKSHWV3E.js.map → chunk-NQQ4MOPC.js.map} +0 -0
- /package/dist/{chunk-B6EWMGFX.js.map → chunk-NUBI6PYH.js.map} +0 -0
- /package/dist/{chunk-VWUSOPBF.js.map → chunk-NYEXUZDW.js.map} +0 -0
- /package/dist/{chunk-PIEX7WSG.js.map → chunk-OOLF5FU2.js.map} +0 -0
- /package/dist/{chunk-HOK5KGBO.js.map → chunk-OQA7UF2Q.js.map} +0 -0
- /package/dist/{chunk-JMMG7UWR.js.map → chunk-ORJPICJI.js.map} +0 -0
- /package/dist/{chunk-IF2M43G4.js.map → chunk-PBRD75JF.js.map} +0 -0
- /package/dist/{chunk-PR2R57YF.js.map → chunk-PR36DD2X.js.map} +0 -0
- /package/dist/{chunk-LFCX2JAV.js.map → chunk-PV4HIC4E.js.map} +0 -0
- /package/dist/{chunk-SKF3DF7M.js.map → chunk-PZNK4HTV.js.map} +0 -0
- /package/dist/{chunk-5F3KYRG6.js.map → chunk-QBLPLNPE.js.map} +0 -0
- /package/dist/{chunk-4ZRNXWF6.js.map → chunk-QZXUISRF.js.map} +0 -0
- /package/dist/{chunk-7Q72NTBE.js.map → chunk-RBXYO7MD.js.map} +0 -0
- /package/dist/{chunk-S2BQV6HM.js.map → chunk-RIACRFWA.js.map} +0 -0
- /package/dist/{chunk-DO33YCSZ.js.map → chunk-RL6RNDJQ.js.map} +0 -0
- /package/dist/{chunk-2SPWVX6W.js.map → chunk-SJ2P7UXD.js.map} +0 -0
- /package/dist/{chunk-26FMWFAW.js.map → chunk-SWXS4LV3.js.map} +0 -0
- /package/dist/{chunk-J3ECXFU7.js.map → chunk-TOTCZFRF.js.map} +0 -0
- /package/dist/{chunk-AN4GUUQM.js.map → chunk-TT4D52EK.js.map} +0 -0
- /package/dist/{chunk-KOJHCSGS.js.map → chunk-U7CMJY5P.js.map} +0 -0
- /package/dist/{chunk-MKQHIYUY.js.map → chunk-UZVHSYIF.js.map} +0 -0
- /package/dist/{chunk-OCSKQUNE.js.map → chunk-VKZ3TDET.js.map} +0 -0
- /package/dist/{chunk-ESDYDGPH.js.map → chunk-VLZPUG5A.js.map} +0 -0
- /package/dist/{chunk-PCYIDPFM.js.map → chunk-VSN5FLMI.js.map} +0 -0
- /package/dist/{chunk-S4QDN4IQ.js.map → chunk-VYBBE7RN.js.map} +0 -0
- /package/dist/{chunk-XBFJRCRW.js.map → chunk-WHK4JVKF.js.map} +0 -0
- /package/dist/{chunk-CZEWEOOV.js.map → chunk-X4LDBALX.js.map} +0 -0
- /package/dist/{chunk-YWEPWJRG.js.map → chunk-X67E7NIJ.js.map} +0 -0
- /package/dist/{chunk-RRI3JBD6.js.map → chunk-XMARKBUC.js.map} +0 -0
- /package/dist/{chunk-B3B6HV5S.js.map → chunk-XMBBTETD.js.map} +0 -0
- /package/dist/{chunk-GEICXZCQ.js.map → chunk-XROQP6IQ.js.map} +0 -0
- /package/dist/{chunk-VX72USUQ.js.map → chunk-Y2RYUWSQ.js.map} +0 -0
- /package/dist/{chunk-6I5RRBPP.js.map → chunk-YCTSQV7K.js.map} +0 -0
- /package/dist/{chunk-7WV6R7RG.js.map → chunk-YF7P2DG7.js.map} +0 -0
- /package/dist/{chunk-ZZLIFVZG.js.map → chunk-ZG7DBIVX.js.map} +0 -0
- /package/dist/{chunk-Y6WJJRVV.js.map → chunk-ZGJ775X7.js.map} +0 -0
- /package/dist/{chunk-PQGCWTTI.js.map → chunk-ZQQLOEWN.js.map} +0 -0
- /package/dist/{classified-marker-LY7KQFPH.js.map → classified-marker-HKMRC7SC.js.map} +0 -0
- /package/dist/{collection-facade-SETOHJ3R.js.map → collection-facade-PPKNUR2J.js.map} +0 -0
- /package/dist/{computed-XG7LFB7A.js.map → computed-UCYVPMZA.js.map} +0 -0
- /package/dist/{delegation-JIQCMKW6.js.map → delegation-SNALWRMO.js.map} +0 -0
- /package/dist/{derive-45KCFFOS.js.map → derive-4GNU4E4I.js.map} +0 -0
- /package/dist/{dispatch-URNW4Q2T.js.map → dispatch-V5WLDTVX.js.map} +0 -0
- /package/dist/{executor-BVVZ5UHG.js.map → executor-7QN22OKI.js.map} +0 -0
- /package/dist/{executor-R25UN3FA.js.map → executor-BJZJNVBB.js.map} +0 -0
- /package/dist/{executor-SIYBLT3P.js.map → executor-JEAAEJUM.js.map} +0 -0
- /package/dist/{export-accessible-P672FZEJ.js.map → export-accessible-TVO2KQPG.js.map} +0 -0
- /package/dist/{extract-partition-DQ3FVL6H.js.map → extract-partition-43CLDRN4.js.map} +0 -0
- /package/dist/{find-HHF2HBAC.js.map → issue-EIHEDAXM.js.map} +0 -0
- /package/dist/{issue-NPLQHB3S.js.map → ledger-BMVUFQ3R.js.map} +0 -0
- /package/dist/{ledger-FV6NFTOR.js.map → liberate-7KHXCLNJ.js.map} +0 -0
- /package/dist/{liberate-A7WASOCG.js.map → link-set-PC2EJRKL.js.map} +0 -0
- /package/dist/{link-set-UMRSGMQ5.js.map → managed-secret-RPRVEYZA.js.map} +0 -0
- /package/dist/{migrate-cek-J634S4NU.js.map → migrate-cek-DTSCWGEF.js.map} +0 -0
- /package/dist/{managed-secret-PBJZHPQO.js.map → noydb-AYDNOXAX.js.map} +0 -0
- /package/dist/{post-register-L42VXYFB.js.map → post-register-RITSNASO.js.map} +0 -0
- /package/dist/{noydb-V23UJKHT.js.map → register-BB34SK7E.js.map} +0 -0
- /package/dist/{register-2VINJWYJ.js.map → registry-65L6V5TO.js.map} +0 -0
- /package/dist/{registry-3VLHDUID.js.map → registry-HU62GPWA.js.map} +0 -0
- /package/dist/{registry-6HVHDR3P.js.map → registry-SMNK6UM4.js.map} +0 -0
- /package/dist/{registry-V4FQUMYP.js.map → registry-X5VPBKCO.js.map} +0 -0
- /package/dist/{registry-Z2E6ZCPM.js.map → request-withdrawal-4SKAH46W.js.map} +0 -0
- /package/dist/{request-withdrawal-PSIHKQP4.js.map → revoke-IF5PX2JY.js.map} +0 -0
- /package/dist/{revoke-2NYMID63.js.map → signer-5P7IZC2K.js.map} +0 -0
- /package/dist/{signer-CP6XZLE3.js.map → stale-PUCZH5GJ.js.map} +0 -0
- /package/dist/{stale-XY2QUSGU.js.map → storage-5EGY5OYE.js.map} +0 -0
- /package/dist/{storage-QTM6JYQF.js.map → vault-diff-H7LT5ZBJ.js.map} +0 -0
- /package/dist/{vault-diff-C6WUJFNP.js.map → walk-Z4N7PCZ2.js.map} +0 -0
- /package/dist/{walk-52FW6EKP.js.map → withdraw-accessible-CRCIQSTL.js.map} +0 -0
package/dist/forget/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/with-audit/forget/active.ts","../../src/with-audit/forget/completeness.ts"],"sourcesContent":["/**\n * `withForget` — the active factory for GDPR right-to-erasure via\n * per-record CEK crypto-shred. Mirrors the canonical\n * `strategy.ts` (type + `NO_FORGET` sentinel) / `active.ts` (factory) split\n * used by the other services.\n *\n * @module\n */\nimport type { SubjectDeclaration, ForgetStrategy } from './strategy.js'\n\n/**\n * Declare GDPR crypto-shred for one or more collections.\n *\n * Each declared collection is forced to `perRecordKeys: true` (a shred can\n * only guarantee erasure of a record whose body is keyed off a per-record\n * CEK). On write, Noydb extracts `record[subjectField]` and maintains an\n * encrypted `_subject_index` mapping `subject → [{collection, id}]`, so\n * `vault.forget(subjectId)` can find every record for a subject and rewrite\n * each to a tombstone (body + history permanently undecryptable) while the\n * collection DEK and every other record stay intact.\n *\n * @example\n * ```ts\n * createNoydb({\n * secret, user,\n * forgetStrategy: withForget({ subjects: { invoices: 'buyerId' } }),\n * })\n * const result = await vault.forget('buyer-123')\n * // → { subject, recordsShredded, historyVersionsShredded, collections, … }\n * ```\n */\nexport function withForget(opts: SubjectDeclaration): ForgetStrategy {\n return { subjects: { ...opts.subjects }, ...(opts.scopedPurge !== undefined ? { scopedPurge: opts.scopedPurge } : {}) }\n}\n","/**\n * #34 — \"was the erasure complete?\", which is the only question a caller of\n * {@link vault.forget} actually has, and the one `ForgetResult` could not\n * answer.\n *\n * ⛔ THE PROBLEM THIS SOLVES. `ForgetResult` carries ELEVEN independent residue\n * channels. None of them throws. Only two say in their own doc that non-empty\n * means erasure is INCOMPLETE. So \"erasure succeeded\" is not\n * `recordsShredded > 0` — it is all eleven empty — while the result's SHAPE\n * suggests the opposite: the counts read like a success report and the residues\n * read like diagnostics you consult when something looks wrong. A consumer\n * building a subject-facing \"your data has been deleted\" on the obvious field\n * is making a false statement in writing, and nothing in the surface tells them.\n *\n * ⭐ WHY THIS IS DEFAULT-DENY AND NOT A LIST OF ELEVEN NAMES. Enumerating the\n * channels would reproduce the defect one level up: every new channel would\n * silently weaken every existing caller's check, so a correct caller today\n * becomes an incorrect one tomorrow with no diagnostic anywhere — a correctness\n * regression delivered by an additive change, which is the kind that passes\n * review. Instead EVERY array-valued field counts as residue unless it appears\n * in {@link NON_RESIDUE_FIELDS}. A twelfth channel is therefore included by\n * construction, and exempting a field is a deliberate edit with a visible diff.\n * `__tests__/34-erasure-completeness.test.ts` fails if any array field is\n * neither a known channel nor exempt, so the exemption list cannot rot quietly.\n *\n * ⚠️ `derivedResidueFrozen` counts as incomplete, and that is CORRECT rather\n * than a bug to fix. An append-only closed period or a frozen receipt keeps the\n * subject's contribution permanently, by design. The erasure genuinely is not\n * total, and a caller who must answer a subject needs to know that — which is\n * precisely why it must not be quietly excluded here. What a consumer does with\n * it (a lawful-retention position) belongs in their layer, not this one.\n *\n * ⛔ SCOPE, deliberately: this reports what the MECHANISM did. It does not know\n * whether a retention is lawful, and must never grow vocabulary implying it\n * does — `blobsRetainedShared` means \"still referenced\", never \"retained\n * lawfully\". The legal decomposition sits above this, in the consumer.\n */\nimport type { ForgetResult } from './strategy.js'\n\n/**\n * Array-valued `ForgetResult` fields that are NOT failure channels.\n *\n * ⚠️ Adding a name here says \"a non-empty value in this field does not mean the\n * erasure was incomplete\". That is a substantive claim about erasure semantics\n * — make it deliberately, and say why on the line.\n */\nconst NON_RESIDUE_FIELDS: ReadonlySet<string> = new Set([\n // The collections that had at least one record shredded: a WORK RECORD of\n // what was touched, not a report of anything left behind.\n 'collections',\n])\n\n/** The verdict {@link erasureCompleteness} returns. */\nexport interface ErasureCompleteness {\n /**\n * `true` only when every residue channel is empty. ⛔ This — not\n * `recordsShredded > 0` — is what \"the subject's data was erased\" means.\n */\n readonly complete: boolean\n /** Names of the channels that are non-empty, sorted. Empty iff `complete`. */\n readonly channels: readonly string[]\n /** The non-empty channels and their entries, for a caller that must report which. */\n readonly residue: Readonly<Record<string, readonly unknown[]>>\n}\n\n/**\n * Decide whether a {@link ForgetResult} represents a COMPLETE erasure.\n *\n * ```ts\n * const result = await vault.forget(subjectId)\n * const { complete, channels, residue } = erasureCompleteness(result)\n * if (!complete) {\n * // Do NOT tell the subject their data is gone. `channels` says what remains;\n * // some of it (a frozen period aggregate) is permanent by design.\n * }\n * ```\n *\n * Every array field of the result is treated as a residue channel except those\n * in {@link NON_RESIDUE_FIELDS} — see this module's doc for why that direction.\n */\nexport function erasureCompleteness(result: ForgetResult): ErasureCompleteness {\n const residue: Record<string, readonly unknown[]> = {}\n for (const [key, value] of Object.entries(result as unknown as Record<string, unknown>)) {\n if (!Array.isArray(value) || NON_RESIDUE_FIELDS.has(key) || value.length === 0) continue\n residue[key] = value as readonly unknown[]\n }\n const channels = Object.keys(residue).sort()\n return { complete: channels.length === 0, channels, residue }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/with-audit/forget/active.ts","../../src/with-audit/forget/completeness.ts"],"sourcesContent":["/**\n * `withForget` — the active factory for GDPR right-to-erasure via\n * per-record CEK crypto-shred. Mirrors the canonical\n * `strategy.ts` (type + `NO_FORGET` sentinel) / `active.ts` (factory) split\n * used by the other services.\n *\n * @module\n */\nimport type { SubjectDeclaration, ForgetStrategy } from './strategy.js'\n\n/**\n * Declare GDPR crypto-shred for one or more collections.\n *\n * Each declared collection is forced to `perRecordKeys: true` (a shred can\n * only guarantee erasure of a record whose body is keyed off a per-record\n * CEK). On write, Noydb extracts `record[subjectField]` and maintains an\n * encrypted `_subject_index` mapping `subject → [{collection, id}]`, so\n * `vault.forget(subjectId)` can find every record for a subject and rewrite\n * each to a tombstone (body + history permanently undecryptable) while the\n * collection DEK and every other record stay intact.\n *\n * @example\n * ```ts\n * createNoydb({\n * secret, user,\n * forgetStrategy: withForget({ subjects: { invoices: 'buyerId' } }),\n * })\n * const result = await vault.forget('buyer-123')\n * // → { subject, recordsShredded, historyVersionsShredded, collections, … }\n * ```\n */\nexport function withForget(opts: SubjectDeclaration): ForgetStrategy {\n return { subjects: { ...opts.subjects }, ...(opts.scopedPurge !== undefined ? { scopedPurge: opts.scopedPurge } : {}) }\n}\n","/**\n * #34 — \"was the erasure complete?\", which is the only question a caller of\n * {@link vault.forget} actually has, and the one `ForgetResult` could not\n * answer.\n *\n * ⛔ THE PROBLEM THIS SOLVES. `ForgetResult` carries ELEVEN independent residue\n * channels. None of them throws. Only two say in their own doc that non-empty\n * means erasure is INCOMPLETE. So \"erasure succeeded\" is not\n * `recordsShredded > 0` — it is all eleven empty — while the result's SHAPE\n * suggests the opposite: the counts read like a success report and the residues\n * read like diagnostics you consult when something looks wrong. A consumer\n * building a subject-facing \"your data has been deleted\" on the obvious field\n * is making a false statement in writing, and nothing in the surface tells them.\n *\n * ⭐ WHY THIS IS DEFAULT-DENY AND NOT A LIST OF ELEVEN NAMES. Enumerating the\n * channels would reproduce the defect one level up: every new channel would\n * silently weaken every existing caller's check, so a correct caller today\n * becomes an incorrect one tomorrow with no diagnostic anywhere — a correctness\n * regression delivered by an additive change, which is the kind that passes\n * review. Instead EVERY array-valued field counts as residue unless it appears\n * in {@link NON_RESIDUE_FIELDS}. A twelfth channel is therefore included by\n * construction, and exempting a field is a deliberate edit with a visible diff.\n * `__tests__/34-erasure-completeness.test.ts` fails if any array field is\n * neither a known channel nor exempt, so the exemption list cannot rot quietly.\n *\n * ⚠️ `derivedResidueFrozen` counts as incomplete, and that is CORRECT rather\n * than a bug to fix. An append-only closed period or a frozen receipt keeps the\n * subject's contribution permanently, by design. The erasure genuinely is not\n * total, and a caller who must answer a subject needs to know that — which is\n * precisely why it must not be quietly excluded here. What a consumer does with\n * it (a lawful-retention position) belongs in their layer, not this one.\n *\n * ⛔ SCOPE, deliberately: this reports what the MECHANISM did. It does not know\n * whether a retention is lawful, and must never grow vocabulary implying it\n * does — `blobsRetainedShared` means \"still referenced\", never \"retained\n * lawfully\". The legal decomposition sits above this, in the consumer.\n */\nimport type { ForgetResult } from './strategy.js'\n\n/**\n * Array-valued `ForgetResult` fields that are NOT failure channels.\n *\n * ⚠️ Adding a name here says \"a non-empty value in this field does not mean the\n * erasure was incomplete\". That is a substantive claim about erasure semantics\n * — make it deliberately, and say why on the line.\n */\nconst NON_RESIDUE_FIELDS: ReadonlySet<string> = new Set([\n // The collections that had at least one record shredded: a WORK RECORD of\n // what was touched, not a report of anything left behind.\n 'collections',\n])\n\n/** The verdict {@link erasureCompleteness} returns. */\nexport interface ErasureCompleteness {\n /**\n * `true` only when every residue channel is empty. ⛔ This — not\n * `recordsShredded > 0` — is what \"the subject's data was erased\" means.\n */\n readonly complete: boolean\n /** Names of the channels that are non-empty, sorted. Empty iff `complete`. */\n readonly channels: readonly string[]\n /** The non-empty channels and their entries, for a caller that must report which. */\n readonly residue: Readonly<Record<string, readonly unknown[]>>\n}\n\n/**\n * Decide whether a {@link ForgetResult} represents a COMPLETE erasure.\n *\n * ```ts\n * const result = await vault.forget(subjectId)\n * const { complete, channels, residue } = erasureCompleteness(result)\n * if (!complete) {\n * // Do NOT tell the subject their data is gone. `channels` says what remains;\n * // some of it (a frozen period aggregate) is permanent by design.\n * }\n * ```\n *\n * Every array field of the result is treated as a residue channel except those\n * in {@link NON_RESIDUE_FIELDS} — see this module's doc for why that direction.\n */\nexport function erasureCompleteness(result: ForgetResult): ErasureCompleteness {\n const residue: Record<string, readonly unknown[]> = {}\n for (const [key, value] of Object.entries(result as unknown as Record<string, unknown>)) {\n if (!Array.isArray(value) || NON_RESIDUE_FIELDS.has(key) || value.length === 0) continue\n residue[key] = value as readonly unknown[]\n }\n const channels = Object.keys(residue).sort()\n return { complete: channels.length === 0, channels, residue }\n}\n"],"mappings":";;;;;;;;;;;AA+BO,SAAS,WAAW,MAA0C;AACnE,SAAO,EAAE,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC,EAAG;AACxH;;;ACaA,IAAM,qBAA0C,oBAAI,IAAI;AAAA;AAAA;AAAA,EAGtD;AACF,CAAC;AA8BM,SAAS,oBAAoB,QAA2C;AAC7E,QAAM,UAA8C,CAAC;AACrD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAA4C,GAAG;AACvF,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,mBAAmB,IAAI,GAAG,KAAK,MAAM,WAAW,EAAG;AAChF,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,QAAM,WAAW,OAAO,KAAK,OAAO,EAAE,KAAK;AAC3C,SAAO,EAAE,UAAU,SAAS,WAAW,GAAG,UAAU,QAAQ;AAC9D;","names":[]}
|
package/dist/guards/index.js
CHANGED
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
immutableGuard,
|
|
3
3
|
transitionGuard,
|
|
4
4
|
withGuard
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-IN4XZJYD.js";
|
|
6
6
|
import {
|
|
7
7
|
GuardExecutor
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-GDCYZGPB.js";
|
|
9
9
|
import {
|
|
10
10
|
GuardRegistry
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-K75SL74I.js";
|
|
12
12
|
import {
|
|
13
13
|
ReadOnlyVaultFacade
|
|
14
14
|
} from "../chunk-JK733I5V.js";
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
IllegalTransitionError,
|
|
19
19
|
InvariantError,
|
|
20
20
|
RecordLockedError
|
|
21
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-ISIXU45J.js";
|
|
22
22
|
export {
|
|
23
23
|
AmendmentForbiddenError,
|
|
24
24
|
FieldFrozenError,
|
package/dist/history/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CollectionInstant,
|
|
3
3
|
VaultInstant
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-FIIVYQOW.js";
|
|
5
5
|
import {
|
|
6
6
|
diff,
|
|
7
7
|
formatDiff
|
|
8
8
|
} from "../chunk-SVLR4POP.js";
|
|
9
9
|
import {
|
|
10
10
|
NO_HISTORY
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-F7ENMZYJ.js";
|
|
12
12
|
import {
|
|
13
13
|
clearHistory,
|
|
14
14
|
getHistory,
|
|
@@ -18,12 +18,12 @@ import {
|
|
|
18
18
|
rewrapHistory,
|
|
19
19
|
saveHistory,
|
|
20
20
|
tombstoneHistory
|
|
21
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-E7Y4J4GL.js";
|
|
22
22
|
import {
|
|
23
23
|
LedgerStore,
|
|
24
24
|
applyPatch,
|
|
25
25
|
computePatch
|
|
26
|
-
} from "../chunk-
|
|
26
|
+
} from "../chunk-BEKMLYQ4.js";
|
|
27
27
|
import {
|
|
28
28
|
LEDGER_COLLECTION,
|
|
29
29
|
LEDGER_DELTAS_COLLECTION
|
|
@@ -35,16 +35,13 @@ import {
|
|
|
35
35
|
paddedIndex,
|
|
36
36
|
parseIndex,
|
|
37
37
|
sha256Hex
|
|
38
|
-
} from "../chunk-
|
|
39
|
-
import "../chunk-
|
|
40
|
-
import "../chunk-
|
|
41
|
-
import "../chunk-
|
|
42
|
-
import "../chunk-
|
|
43
|
-
import "../chunk-
|
|
44
|
-
import "../chunk-
|
|
45
|
-
import "../chunk-6Y3UJT5H.js";
|
|
46
|
-
import "../chunk-VUBRHJ4H.js";
|
|
47
|
-
import "../chunk-JGYCKX56.js";
|
|
38
|
+
} from "../chunk-5JNEDW7I.js";
|
|
39
|
+
import "../chunk-F2FD4LSB.js";
|
|
40
|
+
import "../chunk-EFINFZIF.js";
|
|
41
|
+
import "../chunk-I4S7IZSS.js";
|
|
42
|
+
import "../chunk-XWWDZKLS.js";
|
|
43
|
+
import "../chunk-CR5UPYIJ.js";
|
|
44
|
+
import "../chunk-ISIXU45J.js";
|
|
48
45
|
|
|
49
46
|
// src/with-commit/history/active.ts
|
|
50
47
|
function withHistory() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/with-commit/history/active.ts"],"sourcesContent":["/**\n * Active history strategy — `withHistory()` returns the real\n * implementation that wires per-record snapshots, the hash-chained\n * audit ledger, JSON-patch deltas, and time-machine reads into the\n * core write/read paths.\n *\n * Consumers opt in by:\n *\n * ```ts\n * import { createNoydb } from '@noy-db/hub'\n * import { withHistory } from '@noy-db/hub/history'\n *\n * const db = await createNoydb({\n * store: ...,\n * user: ...,\n * historyStrategy: withHistory(),\n * })\n * ```\n *\n * The factory is a thin wrapper that delegates to the existing\n * `history.ts`, `diff.ts`, `ledger/store.ts`, `ledger/patch.ts`, and\n * `time-machine.ts` modules. Splitting the import chain through this\n * file is what lets `tsup` tree-shake the heavy modules out of the\n * default `@noy-db/hub` bundle when no `withHistory()` import is\n * present in the consumer.\n *\n * @public\n */\n\nimport type { HistoryStrategy, BuildLedgerOptions } from './strategy.js'\nimport {\n saveHistory,\n historyIdentity,\n getHistory,\n getVersionEnvelope,\n pruneHistory,\n clearHistory,\n tombstoneHistory,\n rewrapHistory,\n} from './history.js'\nimport { diff as computeDiff } from './diff.js'\nimport { LedgerStore, envelopePayloadHash } from './ledger/store.js'\nimport { computePatch } from './ledger/patch.js'\nimport { VaultInstant } from './time-machine.js'\n\n/**\n * Build the active history strategy. Today the factory takes no\n * options; per-collection retention tuning still flows through\n * `HistoryConfig` on `Vault.collection()` / `vault.openVault()`.\n *\n * Future option slots (kept off the LTS surface for now):\n * - global maxVersions cap\n * - global beforeDate prune cadence\n * - ledger encryption toggle (today inferred from vault.encrypted)\n */\nexport function withHistory(): HistoryStrategy {\n return {\n saveHistory,\n historyIdentity,\n getHistoryEntries: getHistory,\n getVersionEnvelope,\n pruneHistory,\n clearHistory,\n tombstoneHistory,\n rewrapHistory,\n envelopePayloadHash,\n computePatch,\n diff: computeDiff,\n buildLedger(opts: BuildLedgerOptions): LedgerStore {\n return new LedgerStore({\n adapter: opts.adapter,\n vault: opts.vault,\n encrypted: opts.encrypted,\n getDEK: opts.getDEK,\n actor: opts.actor,\n })\n },\n buildVaultInstant(engine, timestamp): VaultInstant {\n return new VaultInstant(engine, timestamp)\n },\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/with-commit/history/active.ts"],"sourcesContent":["/**\n * Active history strategy — `withHistory()` returns the real\n * implementation that wires per-record snapshots, the hash-chained\n * audit ledger, JSON-patch deltas, and time-machine reads into the\n * core write/read paths.\n *\n * Consumers opt in by:\n *\n * ```ts\n * import { createNoydb } from '@noy-db/hub'\n * import { withHistory } from '@noy-db/hub/history'\n *\n * const db = await createNoydb({\n * store: ...,\n * user: ...,\n * historyStrategy: withHistory(),\n * })\n * ```\n *\n * The factory is a thin wrapper that delegates to the existing\n * `history.ts`, `diff.ts`, `ledger/store.ts`, `ledger/patch.ts`, and\n * `time-machine.ts` modules. Splitting the import chain through this\n * file is what lets `tsup` tree-shake the heavy modules out of the\n * default `@noy-db/hub` bundle when no `withHistory()` import is\n * present in the consumer.\n *\n * @public\n */\n\nimport type { HistoryStrategy, BuildLedgerOptions } from './strategy.js'\nimport {\n saveHistory,\n historyIdentity,\n getHistory,\n getVersionEnvelope,\n pruneHistory,\n clearHistory,\n tombstoneHistory,\n rewrapHistory,\n} from './history.js'\nimport { diff as computeDiff } from './diff.js'\nimport { LedgerStore, envelopePayloadHash } from './ledger/store.js'\nimport { computePatch } from './ledger/patch.js'\nimport { VaultInstant } from './time-machine.js'\n\n/**\n * Build the active history strategy. Today the factory takes no\n * options; per-collection retention tuning still flows through\n * `HistoryConfig` on `Vault.collection()` / `vault.openVault()`.\n *\n * Future option slots (kept off the LTS surface for now):\n * - global maxVersions cap\n * - global beforeDate prune cadence\n * - ledger encryption toggle (today inferred from vault.encrypted)\n */\nexport function withHistory(): HistoryStrategy {\n return {\n saveHistory,\n historyIdentity,\n getHistoryEntries: getHistory,\n getVersionEnvelope,\n pruneHistory,\n clearHistory,\n tombstoneHistory,\n rewrapHistory,\n envelopePayloadHash,\n computePatch,\n diff: computeDiff,\n buildLedger(opts: BuildLedgerOptions): LedgerStore {\n return new LedgerStore({\n adapter: opts.adapter,\n vault: opts.vault,\n encrypted: opts.encrypted,\n getDEK: opts.getDEK,\n actor: opts.actor,\n })\n },\n buildVaultInstant(engine, timestamp): VaultInstant {\n return new VaultInstant(engine, timestamp)\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDO,SAAS,cAA+B;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,MAAuC;AACjD,aAAO,IAAI,YAAY;AAAA,QACrB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH;AAAA,IACA,kBAAkB,QAAQ,WAAyB;AACjD,aAAO,IAAI,aAAa,QAAQ,SAAS;AAAA,IAC3C;AAAA,EACF;AACF;","names":[]}
|
package/dist/i18n/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
withLookup
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-X4LDBALX.js";
|
|
4
4
|
import {
|
|
5
5
|
dictKey,
|
|
6
6
|
staticDict
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-ZGJ775X7.js";
|
|
8
8
|
import {
|
|
9
9
|
DICT_COLLECTION_PREFIX,
|
|
10
10
|
LookupHandle,
|
|
11
11
|
dictCollectionName
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-AHA7UALU.js";
|
|
13
13
|
import {
|
|
14
14
|
NO_I18N,
|
|
15
15
|
applyI18nLocale,
|
|
@@ -26,16 +26,13 @@ import {
|
|
|
26
26
|
resolvePolicy,
|
|
27
27
|
stripI18nFilled,
|
|
28
28
|
validateI18nTextValue
|
|
29
|
-
} from "../chunk-
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
32
|
-
import "../chunk-
|
|
33
|
-
import "../chunk-
|
|
34
|
-
import "../chunk-
|
|
35
|
-
import "../chunk-
|
|
36
|
-
import "../chunk-YIVAKBCW.js";
|
|
37
|
-
import "../chunk-6Y3UJT5H.js";
|
|
38
|
-
import "../chunk-VUBRHJ4H.js";
|
|
29
|
+
} from "../chunk-3M2KK7O7.js";
|
|
30
|
+
import "../chunk-ZG7DBIVX.js";
|
|
31
|
+
import "../chunk-5JNEDW7I.js";
|
|
32
|
+
import "../chunk-EFINFZIF.js";
|
|
33
|
+
import "../chunk-I4S7IZSS.js";
|
|
34
|
+
import "../chunk-XWWDZKLS.js";
|
|
35
|
+
import "../chunk-CR5UPYIJ.js";
|
|
39
36
|
import {
|
|
40
37
|
DictKeyInUseError,
|
|
41
38
|
DictKeyMissingError,
|
|
@@ -46,7 +43,7 @@ import {
|
|
|
46
43
|
StaticDictReadonlyError,
|
|
47
44
|
TranslatorNotConfiguredError,
|
|
48
45
|
UnknownDictCodeError
|
|
49
|
-
} from "../chunk-
|
|
46
|
+
} from "../chunk-ISIXU45J.js";
|
|
50
47
|
|
|
51
48
|
// src/via/i18n/densify.ts
|
|
52
49
|
var MARKER = "_i18nFilled";
|
package/dist/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/via/i18n/densify.ts","../../src/via/i18n/active.ts"],"sourcesContent":["/**\n * `densifyOnWrite` — eager-fill empty i18n slots from each field's\n * substitute chain at write time, recording provenance in the internal\n * `_i18nFilled` marker (decision A: dense map + prior-read).\n *\n * Pure functions over plain records; all DB wiring lives in collection.ts.\n * Only single-leaf i18n fields are supported (array-wildcard paths are\n * skipped, mirroring auto-translate).\n */\nimport { getAtPath, resolveI18nText } from './core.js'\nimport type { I18nTextDescriptor } from './core.js'\n\nconst MARKER = '_i18nFilled'\n\ntype Leaf = Record<string, string>\n\n/** Locales recorded as densify-filled on the prior record for `field`. */\nfunction priorFilled(prior: Record<string, unknown> | undefined, field: string): Set<string> {\n if (!prior) return new Set()\n const marker = prior[MARKER] as Record<string, string[]> | undefined\n return new Set(marker?.[field] ?? [])\n}\n\n/** The single leaf map for `field`, or undefined for absent / array-wildcard / non-object. */\nfunction singleLeaf(record: Record<string, unknown>, field: string): Leaf | undefined {\n const leaves = getAtPath(record, field)\n if (leaves.length !== 1) return undefined\n const leaf = leaves[0]\n if (!leaf || typeof leaf !== 'object' || Array.isArray(leaf)) return undefined\n return leaf as Leaf\n}\n\n/**\n * Per field, the locales that are UNCHANGED round-tripped densify fills — i.e.\n * marked filled on the prior record AND identical in the incoming record.\n * These are exempt from write-time script enforcement (they are derived copies,\n * not authored text). Slots the user changed are NOT exempt (validated as authored).\n */\nexport function computeExemptFills(\n prior: Record<string, unknown> | undefined,\n incoming: Record<string, unknown>,\n fields: Record<string, I18nTextDescriptor>,\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>()\n if (!prior) return out\n for (const field of Object.keys(fields)) {\n const filled = priorFilled(prior, field)\n if (filled.size === 0) continue\n const priorLeaf = singleLeaf(prior, field)\n const incLeaf = singleLeaf(incoming, field)\n if (!priorLeaf || !incLeaf) continue\n const exempt = new Set<string>()\n for (const loc of filled) {\n if (incLeaf[loc] !== undefined && incLeaf[loc] !== '' && incLeaf[loc] === priorLeaf[loc]) {\n exempt.add(loc)\n }\n }\n if (exempt.size > 0) out.set(field, exempt)\n }\n return out\n}\n\n/**\n * Mutate `record` in place: fill empty declared-language slots for each\n * densify-enabled field from the field's substitute chain, recompute unchanged\n * prior fills, clear marks for slots that became authored, and write the\n * resulting `_i18nFilled` marker (removed when empty).\n *\n * `prior` is read-only — it is never mutated.\n *\n * Provenance uses value-equality (decision A): a slot counts as an unchanged\n * fill when it was prior-marked AND its value still equals the prior value. A\n * consequence is that re-authoring a value byte-identical to the existing fill\n * keeps it classified as a fill (the visible value is unchanged either way; the\n * slot stays script-exempt and will auto-refresh if its source later changes).\n * This is inherent to value-equality provenance, not a bug.\n */\nexport function densify(\n record: Record<string, unknown>,\n prior: Record<string, unknown> | undefined,\n fields: Record<string, I18nTextDescriptor>,\n): void {\n let marker = record[MARKER] as Record<string, string[]> | undefined\n\n for (const [field, descriptor] of Object.entries(fields)) {\n const leaf = singleLeaf(record, field)\n if (!leaf) continue\n const { languages, substitute, smartSubstitute } = descriptor.options\n const filledSet = priorFilled(prior, field)\n const priorLeaf = singleLeaf(prior ?? {}, field)\n const isUnchangedFill = (loc: string): boolean =>\n filledSet.has(loc) && priorLeaf?.[loc] !== undefined && leaf[loc] === priorLeaf[loc]\n\n // Authored source = present, non-empty, NOT an unchanged prior fill.\n const authored: Leaf = {}\n for (const [loc, val] of Object.entries(leaf)) {\n if (typeof val === 'string' && val !== '' && !isUnchangedFill(loc)) authored[loc] = val\n }\n\n const filled: string[] = []\n for (const loc of languages) {\n if (authored[loc] !== undefined) continue // real value present → not a fill\n const sub = resolveI18nText(authored, loc, undefined, field, {\n policy: 'substitute',\n substitute: substitute ?? ['any'],\n ...(smartSubstitute ? { smartSubstitute } : {}),\n })\n if (typeof sub === 'string' && sub !== '') {\n leaf[loc] = sub\n filled.push(loc)\n } else if (isUnchangedFill(loc)) {\n delete leaf[loc] // stale fill with no source left → drop it\n }\n }\n\n if (filled.length > 0) {\n marker ??= {}\n marker[field] = filled\n } else if (marker) {\n delete marker[field]\n }\n }\n\n if (marker && Object.keys(marker).length > 0) {\n record[MARKER] = marker\n } else {\n delete record[MARKER]\n }\n}\n","/**\n * Active i18n strategy — `withI18n()` returns the real implementation\n * that wires multi-locale resolution, i18nText validation, and the\n * `DictionaryHandle` for `dictKey` fields into the core read/write\n * paths.\n *\n * Consumers opt in by:\n *\n * ```ts\n * import { createNoydb } from '@noy-db/hub'\n * import { withI18n } from '@noy-db/hub/i18n'\n *\n * const db = await createNoydb({\n * store: ...,\n * user: ...,\n * i18nStrategy: withI18n(),\n * })\n * ```\n *\n * The factory delegates to the existing `core.ts` and `dictionary.ts`\n * modules. Splitting the import chain through this file is what lets\n * tsup tree-shake the `~854 LOC` of dictionary + locale resolution\n * out of the default bundle when no `withI18n()` import is present.\n *\n * @public\n */\n\nimport type { I18nStrategy, BuildDictionaryHandleOptions } from './strategy.js'\nimport { applyI18nLocale, validateI18nTextValue } from './core.js'\nimport { enforceScript } from './script.js'\nimport { computeExemptFills, densify } from './densify.js'\nimport type { DictionaryHandle } from './dictionary.js'\nimport { withLookup } from '../lookup/active.js'\n\nexport function withI18n(): I18nStrategy {\n // #650 Task 1: the handle-construction logic moved to\n // via/lookup/active.ts (LookupHandle, renamed from\n // DictionaryHandle, new home). buildDictionaryHandle below is now a\n // thin field-name translator over buildLookupHandle — same handle.\n const lookup = withLookup()\n return {\n applyI18nLocale,\n validateI18nTextValue,\n enforceScript,\n computeExemptFills,\n densify,\n buildDictionaryHandle<Keys extends string = string>(\n opts: BuildDictionaryHandleOptions<Keys>,\n ): DictionaryHandle<Keys> {\n return lookup.buildLookupHandle<Keys>({\n adapter: opts.adapter,\n compartmentName: opts.compartmentName,\n dimensionName: opts.dictionaryName,\n keyring: opts.keyring,\n reservedEnvelopes: opts.reservedEnvelopes,\n encrypted: opts.encrypted,\n ledger: opts.ledger,\n options: opts.options,\n findAndUpdateReferences: opts.findAndUpdateReferences,\n emitter: opts.emitter,\n buildDeleteMarker: opts.buildDeleteMarker, // #647 fix wave 1\n onDirty: opts.onDirty, // #650 Task 4\n onRecordMutated: opts.onRecordMutated, // #650 Task 4\n checkReferencesOnDelete: opts.checkReferencesOnDelete, // #650 Task 5\n })\n },\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/via/i18n/densify.ts","../../src/via/i18n/active.ts"],"sourcesContent":["/**\n * `densifyOnWrite` — eager-fill empty i18n slots from each field's\n * substitute chain at write time, recording provenance in the internal\n * `_i18nFilled` marker (decision A: dense map + prior-read).\n *\n * Pure functions over plain records; all DB wiring lives in collection.ts.\n * Only single-leaf i18n fields are supported (array-wildcard paths are\n * skipped, mirroring auto-translate).\n */\nimport { getAtPath, resolveI18nText } from './core.js'\nimport type { I18nTextDescriptor } from './core.js'\n\nconst MARKER = '_i18nFilled'\n\ntype Leaf = Record<string, string>\n\n/** Locales recorded as densify-filled on the prior record for `field`. */\nfunction priorFilled(prior: Record<string, unknown> | undefined, field: string): Set<string> {\n if (!prior) return new Set()\n const marker = prior[MARKER] as Record<string, string[]> | undefined\n return new Set(marker?.[field] ?? [])\n}\n\n/** The single leaf map for `field`, or undefined for absent / array-wildcard / non-object. */\nfunction singleLeaf(record: Record<string, unknown>, field: string): Leaf | undefined {\n const leaves = getAtPath(record, field)\n if (leaves.length !== 1) return undefined\n const leaf = leaves[0]\n if (!leaf || typeof leaf !== 'object' || Array.isArray(leaf)) return undefined\n return leaf as Leaf\n}\n\n/**\n * Per field, the locales that are UNCHANGED round-tripped densify fills — i.e.\n * marked filled on the prior record AND identical in the incoming record.\n * These are exempt from write-time script enforcement (they are derived copies,\n * not authored text). Slots the user changed are NOT exempt (validated as authored).\n */\nexport function computeExemptFills(\n prior: Record<string, unknown> | undefined,\n incoming: Record<string, unknown>,\n fields: Record<string, I18nTextDescriptor>,\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>()\n if (!prior) return out\n for (const field of Object.keys(fields)) {\n const filled = priorFilled(prior, field)\n if (filled.size === 0) continue\n const priorLeaf = singleLeaf(prior, field)\n const incLeaf = singleLeaf(incoming, field)\n if (!priorLeaf || !incLeaf) continue\n const exempt = new Set<string>()\n for (const loc of filled) {\n if (incLeaf[loc] !== undefined && incLeaf[loc] !== '' && incLeaf[loc] === priorLeaf[loc]) {\n exempt.add(loc)\n }\n }\n if (exempt.size > 0) out.set(field, exempt)\n }\n return out\n}\n\n/**\n * Mutate `record` in place: fill empty declared-language slots for each\n * densify-enabled field from the field's substitute chain, recompute unchanged\n * prior fills, clear marks for slots that became authored, and write the\n * resulting `_i18nFilled` marker (removed when empty).\n *\n * `prior` is read-only — it is never mutated.\n *\n * Provenance uses value-equality (decision A): a slot counts as an unchanged\n * fill when it was prior-marked AND its value still equals the prior value. A\n * consequence is that re-authoring a value byte-identical to the existing fill\n * keeps it classified as a fill (the visible value is unchanged either way; the\n * slot stays script-exempt and will auto-refresh if its source later changes).\n * This is inherent to value-equality provenance, not a bug.\n */\nexport function densify(\n record: Record<string, unknown>,\n prior: Record<string, unknown> | undefined,\n fields: Record<string, I18nTextDescriptor>,\n): void {\n let marker = record[MARKER] as Record<string, string[]> | undefined\n\n for (const [field, descriptor] of Object.entries(fields)) {\n const leaf = singleLeaf(record, field)\n if (!leaf) continue\n const { languages, substitute, smartSubstitute } = descriptor.options\n const filledSet = priorFilled(prior, field)\n const priorLeaf = singleLeaf(prior ?? {}, field)\n const isUnchangedFill = (loc: string): boolean =>\n filledSet.has(loc) && priorLeaf?.[loc] !== undefined && leaf[loc] === priorLeaf[loc]\n\n // Authored source = present, non-empty, NOT an unchanged prior fill.\n const authored: Leaf = {}\n for (const [loc, val] of Object.entries(leaf)) {\n if (typeof val === 'string' && val !== '' && !isUnchangedFill(loc)) authored[loc] = val\n }\n\n const filled: string[] = []\n for (const loc of languages) {\n if (authored[loc] !== undefined) continue // real value present → not a fill\n const sub = resolveI18nText(authored, loc, undefined, field, {\n policy: 'substitute',\n substitute: substitute ?? ['any'],\n ...(smartSubstitute ? { smartSubstitute } : {}),\n })\n if (typeof sub === 'string' && sub !== '') {\n leaf[loc] = sub\n filled.push(loc)\n } else if (isUnchangedFill(loc)) {\n delete leaf[loc] // stale fill with no source left → drop it\n }\n }\n\n if (filled.length > 0) {\n marker ??= {}\n marker[field] = filled\n } else if (marker) {\n delete marker[field]\n }\n }\n\n if (marker && Object.keys(marker).length > 0) {\n record[MARKER] = marker\n } else {\n delete record[MARKER]\n }\n}\n","/**\n * Active i18n strategy — `withI18n()` returns the real implementation\n * that wires multi-locale resolution, i18nText validation, and the\n * `DictionaryHandle` for `dictKey` fields into the core read/write\n * paths.\n *\n * Consumers opt in by:\n *\n * ```ts\n * import { createNoydb } from '@noy-db/hub'\n * import { withI18n } from '@noy-db/hub/i18n'\n *\n * const db = await createNoydb({\n * store: ...,\n * user: ...,\n * i18nStrategy: withI18n(),\n * })\n * ```\n *\n * The factory delegates to the existing `core.ts` and `dictionary.ts`\n * modules. Splitting the import chain through this file is what lets\n * tsup tree-shake the `~854 LOC` of dictionary + locale resolution\n * out of the default bundle when no `withI18n()` import is present.\n *\n * @public\n */\n\nimport type { I18nStrategy, BuildDictionaryHandleOptions } from './strategy.js'\nimport { applyI18nLocale, validateI18nTextValue } from './core.js'\nimport { enforceScript } from './script.js'\nimport { computeExemptFills, densify } from './densify.js'\nimport type { DictionaryHandle } from './dictionary.js'\nimport { withLookup } from '../lookup/active.js'\n\nexport function withI18n(): I18nStrategy {\n // #650 Task 1: the handle-construction logic moved to\n // via/lookup/active.ts (LookupHandle, renamed from\n // DictionaryHandle, new home). buildDictionaryHandle below is now a\n // thin field-name translator over buildLookupHandle — same handle.\n const lookup = withLookup()\n return {\n applyI18nLocale,\n validateI18nTextValue,\n enforceScript,\n computeExemptFills,\n densify,\n buildDictionaryHandle<Keys extends string = string>(\n opts: BuildDictionaryHandleOptions<Keys>,\n ): DictionaryHandle<Keys> {\n return lookup.buildLookupHandle<Keys>({\n adapter: opts.adapter,\n compartmentName: opts.compartmentName,\n dimensionName: opts.dictionaryName,\n keyring: opts.keyring,\n reservedEnvelopes: opts.reservedEnvelopes,\n encrypted: opts.encrypted,\n ledger: opts.ledger,\n options: opts.options,\n findAndUpdateReferences: opts.findAndUpdateReferences,\n emitter: opts.emitter,\n buildDeleteMarker: opts.buildDeleteMarker, // #647 fix wave 1\n onDirty: opts.onDirty, // #650 Task 4\n onRecordMutated: opts.onRecordMutated, // #650 Task 4\n checkReferencesOnDelete: opts.checkReferencesOnDelete, // #650 Task 5\n })\n },\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -244,7 +244,7 @@ export { assertRosterAuthenticated } from './with-party/team/roster-tag.js';
|
|
|
244
244
|
*/
|
|
245
245
|
export { assertRosterEpochCurrent, nextRosterEpoch } from './with-party/team/roster-epoch.js';
|
|
246
246
|
export type { WrappedDeksBlob } from './with-party/team/wrapped-deks.js';
|
|
247
|
-
export type { NoydbSealer, RecipientHint, RecipientSealer } from './with-party/team/managed-secret.js';
|
|
247
|
+
export type { NoydbSealer, SealContext, RecipientHint, RecipientSealer } from './with-party/team/managed-secret.js';
|
|
248
248
|
export type { NoydbShamir } from './with-party/team/noydb-shamir.js';
|
|
249
249
|
export { MemorySealer, MemoryRecipientSealer, sealRsaOaepTlv, parseRsaOaepTlv, aesGcmOpen, } from './with-party/team/managed-secret.js';
|
|
250
250
|
export { recoverUser } from './with-party/team/peer-recover.js';
|
|
@@ -371,7 +371,7 @@ export { MAGIC_LINK_GRANTS_COLLECTION, deriveMagicLinkContentKey, writeMagicLink
|
|
|
371
371
|
export { diff, formatDiff } from './with-commit/history/diff.js';
|
|
372
372
|
export type { DiffEntry, ChangeType } from './with-commit/history/diff.js';
|
|
373
373
|
export { diffVault } from './with-cargo/vault-diff.js';
|
|
374
|
-
export type { VaultDiff, VaultDiffEntry, VaultDiffModifiedEntry, DiffOptions, DiffCandidate, } from './with-cargo/vault-diff.js';
|
|
374
|
+
export type { VaultDiff, VaultDiffEntry, VaultDiffModifiedEntry, VaultDiffSkipped, DiffOptions, DiffCandidate, } from './with-cargo/vault-diff.js';
|
|
375
375
|
export { withCargo, NO_CARGO } from './with-cargo/index.js';
|
|
376
376
|
export type { CargoStrategy } from './with-cargo/index.js';
|
|
377
377
|
export { CargoNotEnabledError } from './kernel/errors.js';
|