@noy-db/hub 0.4.0-pre.6 → 0.4.0-pre.7
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/dist/api-3NKVNZPM.js +20 -0
- package/dist/attestation/index.js +18 -18
- package/dist/{backup-USYSNCYM.js → backup-PTSVXDDW.js} +13 -13
- package/dist/blobs/index.js +13 -13
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +12 -12
- package/dist/cargo/index.js +31 -29
- package/dist/{chunk-5WLDZZ6S.js → chunk-35NMVJ7I.js} +3 -3
- package/dist/{chunk-ZGEFBDPR.js → chunk-3HUYRN24.js} +3 -3
- package/dist/chunk-3HUYRN24.js.map +1 -0
- package/dist/{chunk-NA374QG7.js → chunk-3XKESW5E.js} +3 -3
- package/dist/{chunk-MUPZ6IZX.js → chunk-4JQK3L4V.js} +2 -2
- package/dist/{chunk-Z4D3YGAB.js → chunk-4ZKNC6A6.js} +2 -2
- package/dist/{chunk-ONB627HU.js → chunk-55LX6FSX.js} +2 -2
- package/dist/{chunk-M7W2KYTL.js → chunk-56IIVAEO.js} +2 -2
- package/dist/{chunk-FHHYCBBP.js → chunk-5DRROK5W.js} +2 -2
- package/dist/{chunk-GTNRMJYH.js → chunk-5GQEU4DN.js} +2 -2
- package/dist/{chunk-XSOGLHGY.js → chunk-6L3DKWRY.js} +6 -6
- package/dist/chunk-6LJY7X5A.js +18 -0
- package/dist/chunk-6LJY7X5A.js.map +1 -0
- package/dist/{chunk-44Y3P5U6.js → chunk-6M2I3DKF.js} +2 -2
- package/dist/{chunk-HDF5R2K6.js → chunk-6R6Q3MRN.js} +7 -7
- package/dist/{chunk-ZUDAK436.js → chunk-6UBZ6I5Z.js} +2 -2
- package/dist/{chunk-SEU6QHH4.js → chunk-6ZNSB3H6.js} +5 -17
- package/dist/chunk-6ZNSB3H6.js.map +1 -0
- package/dist/{chunk-7U6AB7DZ.js → chunk-AKKRXT23.js} +2 -2
- package/dist/{chunk-2PDBYF2O.js → chunk-AT2JJEKJ.js} +4 -4
- package/dist/chunk-AT2JJEKJ.js.map +1 -0
- package/dist/{chunk-OWLZONGX.js → chunk-BLBAQRBM.js} +2 -2
- package/dist/{chunk-XONZGK6J.js → chunk-BN4HRYAZ.js} +2 -2
- package/dist/{chunk-QVGEVZ5F.js → chunk-BQ6DHN4I.js} +3 -3
- package/dist/{chunk-LG2GUYRX.js → chunk-BYFXLDVV.js} +9 -9
- package/dist/{chunk-M4GO4ZJK.js → chunk-C25JXSOR.js} +137 -11
- package/dist/chunk-C25JXSOR.js.map +1 -0
- package/dist/{chunk-3TZUC4WS.js → chunk-CCDP6EPB.js} +13 -355
- package/dist/chunk-CCDP6EPB.js.map +1 -0
- package/dist/{chunk-QRHEAZ2Q.js → chunk-CUZLNGD5.js} +1 -1
- package/dist/{chunk-HXVRRJBD.js → chunk-DGBIHDVK.js} +5 -5
- package/dist/chunk-DSDXAKIP.js +50 -0
- package/dist/chunk-DSDXAKIP.js.map +1 -0
- package/dist/{chunk-JGOKAZNB.js → chunk-DZAF24PG.js} +5 -5
- package/dist/{chunk-NIKO2BBZ.js → chunk-DZFQVICS.js} +2 -2
- package/dist/chunk-DZFQVICS.js.map +1 -0
- package/dist/chunk-E23UGFVC.js +63 -0
- package/dist/chunk-E23UGFVC.js.map +1 -0
- package/dist/{chunk-YGMREQAK.js → chunk-EBKCYQ2D.js} +14 -14
- package/dist/chunk-EBKCYQ2D.js.map +1 -0
- package/dist/{chunk-TMR64XPL.js → chunk-EZNTORXE.js} +2 -2
- package/dist/{chunk-WCJJQV2D.js → chunk-FMNU7IUG.js} +3 -3
- package/dist/{chunk-H5GMROCB.js → chunk-FO6RNKKW.js} +8 -46
- package/dist/chunk-FO6RNKKW.js.map +1 -0
- package/dist/{chunk-YMUGBZN2.js → chunk-FQ5CHJR7.js} +1 -1
- package/dist/chunk-FQ5CHJR7.js.map +1 -0
- package/dist/{chunk-MQBFT2OT.js → chunk-FRMW23UK.js} +7 -7
- package/dist/chunk-FRMW23UK.js.map +1 -0
- package/dist/chunk-GJW4HX2O.js +1 -0
- package/dist/{chunk-JTIPVW4J.js → chunk-GP3UWP22.js} +4 -4
- package/dist/{chunk-DOZFU7OZ.js → chunk-GZACYEOB.js} +1 -1
- package/dist/chunk-GZACYEOB.js.map +1 -0
- package/dist/{chunk-XG7OZDOS.js → chunk-HFUAFR6B.js} +6 -6
- package/dist/{chunk-LN3MQFUE.js → chunk-IF6WNGAK.js} +9 -6
- package/dist/chunk-IF6WNGAK.js.map +1 -0
- package/dist/{chunk-ZX5FNWH7.js → chunk-IG6KUWBX.js} +2 -2
- package/dist/chunk-IG6KUWBX.js.map +1 -0
- package/dist/{chunk-VDTWFN2P.js → chunk-IMRB2C4O.js} +3 -3
- package/dist/{chunk-2BVW754E.js → chunk-ISRKW4YN.js} +3 -3
- package/dist/{chunk-P4NUJVWL.js → chunk-IXNCZTWA.js} +2 -2
- package/dist/{chunk-ZHZ4PET5.js → chunk-JIDLU57U.js} +3 -3
- package/dist/{chunk-PTT2NB46.js → chunk-JYJFGD2H.js} +2 -2
- package/dist/{chunk-XY6MNSAF.js → chunk-JYV4JJV2.js} +5 -5
- package/dist/{chunk-ZHMUFYZF.js → chunk-KBPU5M2E.js} +7 -7
- package/dist/{chunk-AZXEOEQK.js → chunk-KFRPNHWR.js} +4 -4
- package/dist/chunk-KFRPNHWR.js.map +1 -0
- package/dist/{chunk-ZDFU34XY.js → chunk-KPXM4WO6.js} +58 -54
- package/dist/chunk-KPXM4WO6.js.map +1 -0
- package/dist/{chunk-HA7P3BTB.js → chunk-KRCBZYTZ.js} +4 -4
- package/dist/{chunk-VNJMLOQS.js → chunk-KW42W6SV.js} +6 -6
- package/dist/{chunk-GQT6J4FJ.js → chunk-L3YYLT4E.js} +2 -2
- package/dist/chunk-L3YYLT4E.js.map +1 -0
- package/dist/{chunk-3GXDB3NQ.js → chunk-MANUDU7I.js} +6 -6
- package/dist/{chunk-YJ3TREAC.js → chunk-MHMLXJ3I.js} +2 -2
- package/dist/chunk-MHMLXJ3I.js.map +1 -0
- package/dist/{chunk-D4LAJ737.js → chunk-MSMJJB4J.js} +2 -2
- package/dist/chunk-MSMJJB4J.js.map +1 -0
- package/dist/{chunk-RM5EXCFF.js → chunk-MXUT7FTE.js} +2 -2
- package/dist/chunk-MXUT7FTE.js.map +1 -0
- package/dist/{chunk-IUATR5UE.js → chunk-N5PLUFH2.js} +5 -5
- package/dist/{chunk-C2V7AJO2.js → chunk-NEX7JCMO.js} +4 -4
- package/dist/{chunk-5HSSTOOG.js → chunk-NFZGZ4AK.js} +2 -2
- package/dist/{chunk-5ABOFAHN.js → chunk-NJ4DYYO5.js} +2 -2
- package/dist/chunk-NJ4DYYO5.js.map +1 -0
- package/dist/{chunk-2ZSC454H.js → chunk-NQSO4UAH.js} +8 -8
- package/dist/chunk-NQSO4UAH.js.map +1 -0
- package/dist/{chunk-GHEMAVTN.js → chunk-NYEFP7DY.js} +4 -4
- package/dist/chunk-NYEFP7DY.js.map +1 -0
- package/dist/{chunk-32467U5J.js → chunk-OBPVWOSQ.js} +4 -4
- package/dist/{chunk-6SSWOUUS.js → chunk-OLIWCCFM.js} +2 -5
- package/dist/{chunk-UNREYBZO.js → chunk-OLSARBZU.js} +2 -2
- package/dist/{chunk-V2R2VWER.js → chunk-PT4XLP6I.js} +12 -12
- package/dist/{chunk-V2R2VWER.js.map → chunk-PT4XLP6I.js.map} +1 -1
- package/dist/{chunk-LC7DSMHR.js → chunk-PTHKZWEH.js} +2 -14
- package/dist/{chunk-LC7DSMHR.js.map → chunk-PTHKZWEH.js.map} +1 -1
- package/dist/chunk-QADFHRQM.js +367 -0
- package/dist/chunk-QADFHRQM.js.map +1 -0
- package/dist/{chunk-7LP7FFJ2.js → chunk-QD46HPZG.js} +2 -2
- package/dist/{chunk-G4MFQXYX.js → chunk-QJNCB5SK.js} +2 -2
- package/dist/{chunk-6SYOHUHM.js → chunk-QZWTRENR.js} +2 -2
- package/dist/chunk-QZWTRENR.js.map +1 -0
- package/dist/{chunk-TSNRZSRC.js → chunk-RO5NM6UI.js} +2 -2
- package/dist/chunk-RO5NM6UI.js.map +1 -0
- package/dist/{chunk-MMVQ3SUO.js → chunk-RZPOZPZU.js} +8 -8
- package/dist/chunk-SGDPRCC4.js +1075 -0
- package/dist/chunk-SGDPRCC4.js.map +1 -0
- package/dist/{chunk-E7FSBI6I.js → chunk-SGQ4N5FS.js} +5 -5
- package/dist/{chunk-522MBPE5.js → chunk-SHEEBRZ4.js} +2 -2
- package/dist/{chunk-EPME33Y4.js → chunk-SHYIA73K.js} +6 -6
- package/dist/chunk-SKM35Y4Q.js +77 -0
- package/dist/chunk-SKM35Y4Q.js.map +1 -0
- package/dist/{chunk-MLCTPWSO.js → chunk-TE6LH6J2.js} +5 -5
- package/dist/chunk-TG634KCO.js +63 -0
- package/dist/chunk-TG634KCO.js.map +1 -0
- package/dist/{chunk-QVIZDLAR.js → chunk-TIVK6PRK.js} +9 -10
- package/dist/chunk-TIVK6PRK.js.map +1 -0
- package/dist/{chunk-JOCMXSR2.js → chunk-UADPR6F4.js} +3 -3
- package/dist/{chunk-SBOHNJUD.js → chunk-V6UQZA2H.js} +2 -2
- package/dist/chunk-VG2ZSFYD.js +32 -0
- package/dist/chunk-VG2ZSFYD.js.map +1 -0
- package/dist/{chunk-KCZAFDP5.js → chunk-VH6SOCXH.js} +2 -2
- package/dist/chunk-VSRSQ2CR.js +654 -0
- package/dist/chunk-VSRSQ2CR.js.map +1 -0
- package/dist/{chunk-4B3DL75F.js → chunk-W3G5REIU.js} +2 -2
- package/dist/{chunk-EGU4PWQW.js → chunk-W66AM5IB.js} +2 -2
- package/dist/chunk-W66AM5IB.js.map +1 -0
- package/dist/{chunk-MPPWL64H.js → chunk-WBKZUO5V.js} +3 -3
- package/dist/{chunk-WWBC4KLB.js → chunk-WO4T4OD5.js} +2 -2
- package/dist/{chunk-7IQWHYL2.js → chunk-WZ3NCMK6.js} +6 -5
- package/dist/{chunk-BAAUFCJK.js → chunk-X4MVWPHV.js} +3 -3
- package/dist/{chunk-HVPW6PCX.js → chunk-XIDQKFZF.js} +3 -3
- package/dist/{chunk-EWPS35AR.js → chunk-XOBHRD2M.js} +185 -333
- package/dist/chunk-XOBHRD2M.js.map +1 -0
- package/dist/chunk-Y2NBBT6K.js +18 -0
- package/dist/chunk-Y2NBBT6K.js.map +1 -0
- package/dist/{chunk-OWOT7CFC.js → chunk-Y6B6HVKC.js} +2 -2
- package/dist/{chunk-ICYC5YNI.js → chunk-Y6VZQGGH.js} +6 -6
- package/dist/{chunk-ZM72UO3Y.js → chunk-ZFUFAHZ3.js} +4 -4
- package/dist/{chunk-PWWWMRT7.js → chunk-ZTLOXFPB.js} +2 -2
- package/dist/chunk-ZTLOXFPB.js.map +1 -0
- package/dist/{walk-JXMWKKQW.js → chunk-ZWBKDKXC.js} +4 -13
- package/dist/{walk-JXMWKKQW.js.map → chunk-ZWBKDKXC.js.map} +1 -1
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-SVDRXLD3.js → classified-marker-EOOSMWFC.js} +3 -3
- package/dist/collection-facade-TTRF5NFJ.js +45 -0
- package/dist/{computed-33DRJDOC.js → computed-AB45PS4V.js} +3 -3
- package/dist/consent/index.js +9 -9
- package/dist/{cover-ADBCTIKN.js → cover/index.js} +7 -6
- package/dist/custody/index.js +26 -0
- package/dist/{dead-filter-HKDMTMVY.js → dead-filter-6DYY7S64.js} +2 -2
- package/dist/{chunk-ZF572E2M.js → delegation-ONOZVPIP.js} +12 -6
- package/dist/{chunk-ZF572E2M.js.map → delegation-ONOZVPIP.js.map} +1 -1
- package/dist/derivations/index.js +12 -12
- package/dist/derive-IGGVSUPH.js +22 -0
- package/dist/directory/index.js +46 -0
- package/dist/{dispatch-SPMYNXNW.js → dispatch-7T45NN7C.js} +18 -18
- package/dist/{dispatch-V5MSMQYX.js → dispatch-RPTLK7LJ.js} +5 -5
- package/dist/{enclave-ZA7C3H2L.js → enclave-CLJVSDFG.js} +9 -9
- package/dist/executor-IEBLTBCW.js +9 -0
- package/dist/executor-RM7XWQDU.js +9 -0
- package/dist/executor-XZYM4KHT.js +28 -0
- package/dist/export-accessible-24XCCD3A.js +23 -0
- package/dist/extract-partition-H2TPEEOF.js +38 -0
- package/dist/{fanout-sidecar-HRMHC34B.js → fanout-sidecar-TV7CXAJ6.js} +9 -9
- package/dist/find-OZMTRIK3.js +11 -0
- package/dist/forget/index.js +11 -11
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +4 -4
- package/dist/history/index.js +12 -12
- package/dist/i18n/index.js +14 -14
- package/dist/index.d.ts +14 -17
- package/dist/index.js +192 -1968
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +2 -2
- package/dist/indexing/index.js.map +1 -1
- package/dist/introspection/index.js +28 -0
- package/dist/issue-55HJE7JF.js +19 -0
- package/dist/kernel/collection-config.d.ts +1 -1
- package/dist/kernel/collection.d.ts +2 -2
- package/dist/kernel/errors.d.ts +2 -2
- package/dist/kernel/noydb.d.ts +1 -1
- package/dist/kernel/types.d.ts +20 -20
- package/dist/kernel/vault.d.ts +10 -10
- package/dist/{ledger-K6JBFL3Z.js → ledger-XY6NP3J2.js} +11 -11
- package/dist/liberate-LXOJ2EMB.js +24 -0
- package/dist/{link-set-XVZY2ODC.js → link-set-POQB7BU5.js} +11 -11
- package/dist/materialized-views/index.js +19 -19
- package/dist/money/index.js +31 -0
- package/dist/noydb-KXS35UJS.js +82 -0
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +13 -13
- package/dist/pod/index.js +11 -11
- package/dist/{policy-QWGJB7P7.js → policy/index.js} +6 -6
- package/dist/port/with/blob-strategy.d.ts +15 -5
- package/dist/port/with/strategies.d.ts +9 -9
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-5VHHVFJY.js → post-register-URQANI3B.js} +6 -6
- package/dist/query/index.js +3 -3
- package/dist/reduce/index.js +4 -4
- package/dist/register-5W6CG4RM.js +25 -0
- package/dist/registry-7Y5WF7GS.js +9 -0
- package/dist/{registry-VW6P6A3J.js → registry-BWD2ED52.js} +2 -2
- package/dist/registry-MCSGBZXI.js +18 -0
- package/dist/registry-UJFP3NWF.js +19 -0
- package/dist/request-withdrawal-IWYDM4SO.js +31 -0
- package/dist/{reveal-7OOT5XPD.js → reveal-BXZGWIOP.js} +6 -6
- package/dist/revoke-TINYPHYY.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +26 -0
- package/dist/schema-update/index.js.map +1 -0
- package/dist/sealed-record/index.js +12 -12
- package/dist/search/index.js +36 -0
- package/dist/search/index.js.map +1 -0
- package/dist/{seed-GVOI6QP6.js → seed-F7YYQTRC.js} +11 -11
- package/dist/sequence/index.js +30 -0
- package/dist/sequence/index.js.map +1 -0
- package/dist/session/index.js +9 -9
- package/dist/shadow/index.js +2 -2
- package/dist/signer-WMZKCNKC.js +25 -0
- package/dist/signer-WMZKCNKC.js.map +1 -0
- package/dist/snapshots/index.js +11 -11
- package/dist/snapshots/index.js.map +1 -1
- package/dist/{stale-BJO2WIN7.js → stale-JOE7GBAE.js} +10 -10
- package/dist/stale-JOE7GBAE.js.map +1 -0
- package/dist/storage-B3WBKXKT.js +23 -0
- package/dist/storage-B3WBKXKT.js.map +1 -0
- package/dist/store/index.js +22 -0
- package/dist/store/index.js.map +1 -0
- package/dist/{store-coordination-provider-DX5HECK3.js → store-coordination-provider-5LX2UFU2.js} +3 -3
- package/dist/sync/index.js +10 -10
- package/dist/team/index.js +29 -20
- package/dist/tiers/index.js +10 -10
- package/dist/to/index.js +1 -1
- package/dist/{tx → transactions}/index.js +3 -3
- package/dist/{tx → transactions}/index.js.map +1 -1
- package/dist/util/index.js +1 -1
- package/dist/{verify-5X37OXRY.js → verify-7XWHJWUN.js} +5 -5
- package/dist/via/blob/active.d.ts +7 -18
- package/dist/via/blob/binding.d.ts +1 -1
- package/dist/via/blob/index.d.ts +2 -2
- package/dist/walk-6OHAWGBS.js +21 -0
- package/dist/walk-6OHAWGBS.js.map +1 -0
- package/dist/with-audit/forget/active.d.ts +3 -3
- package/dist/with-audit/forget/index.d.ts +4 -4
- package/dist/with-audit/forget/strategy.d.ts +3 -3
- package/dist/with-audit/guards/executor.d.ts +4 -4
- package/dist/with-audit/guards/immutable-guard.d.ts +3 -3
- package/dist/with-audit/guards/index.d.ts +1 -1
- package/dist/with-audit/guards/registry.d.ts +3 -3
- package/dist/with-audit/guards/transition-guard.d.ts +3 -3
- package/dist/with-audit/guards/types.d.ts +10 -10
- package/dist/with-audit/guards/with-guard.d.ts +2 -2
- package/dist/with-commit/numbering/descriptor.d.ts +16 -6
- package/dist/with-commit/tx/active.d.ts +5 -5
- package/dist/with-commit/tx/index.d.ts +2 -2
- package/dist/with-commit/tx/invariants.d.ts +1 -1
- package/dist/with-commit/tx/strategy.d.ts +3 -3
- package/dist/with-fork/snapshots/active.d.ts +2 -2
- package/dist/with-fork/snapshots/index.d.ts +1 -1
- package/dist/with-fork/snapshots/noydb-facade.d.ts +3 -3
- package/dist/with-fork/snapshots/strategy.d.ts +2 -2
- package/dist/with-formula/derivations/executor.d.ts +2 -2
- package/dist/with-formula/derivations/index.d.ts +2 -1
- package/dist/with-formula/derivations/registry.d.ts +3 -3
- package/dist/with-formula/derivations/stale.d.ts +2 -2
- package/dist/with-formula/derivations/types.d.ts +3 -3
- package/dist/with-formula/derivations/with-derivation.d.ts +2 -2
- package/dist/with-formula/derivations/with-rollup.d.ts +15 -8
- package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +3 -3
- package/dist/with-formula/materialized-views/index.d.ts +1 -1
- package/dist/with-formula/materialized-views/registry.d.ts +4 -4
- package/dist/with-formula/materialized-views/types.d.ts +4 -4
- package/dist/with-formula/materialized-views/with-materialized-view.d.ts +2 -2
- package/dist/with-formula/overlay-views/index.d.ts +1 -1
- package/dist/with-formula/overlay-views/registry.d.ts +4 -4
- package/dist/with-formula/overlay-views/types.d.ts +3 -3
- package/dist/with-formula/overlay-views/virtual-collection.d.ts +2 -2
- package/dist/with-formula/overlay-views/with-overlayed-view.d.ts +2 -2
- package/dist/with-lookup/indexing/active.d.ts +5 -5
- package/dist/with-lookup/indexing/index.d.ts +1 -1
- package/dist/with-lookup/indexing/strategy.d.ts +3 -3
- package/dist/with-lookup/search/build-docs.d.ts +7 -2
- package/dist/with-lookup/search/index.d.ts +1 -1
- package/dist/with-party/directory/cover/index.d.ts +1 -0
- package/dist/with-party/directory/index.d.ts +2 -0
- package/dist/with-party/team/index.d.ts +2 -0
- package/dist/with-party/team/keyring.d.ts +49 -20
- package/dist/with-party/team/noydb-facade.d.ts +2 -2
- package/dist/with-shape/blobs/blob-set.d.ts +1 -1
- package/dist/with-shape/introspection/index.d.ts +6 -0
- package/dist/with-shape/schema-update/index.d.ts +1 -0
- package/dist/with-store/index.d.ts +3 -2
- package/dist/withdraw-accessible-DEUCOO4F.js +28 -0
- package/dist/withdraw-accessible-DEUCOO4F.js.map +1 -0
- package/package.json +45 -5
- package/dist/api-5QVQX4HG.js +0 -20
- package/dist/chunk-2PDBYF2O.js.map +0 -1
- package/dist/chunk-2ZSC454H.js.map +0 -1
- package/dist/chunk-3S2YNMUS.js +0 -134
- package/dist/chunk-3S2YNMUS.js.map +0 -1
- package/dist/chunk-3TZUC4WS.js.map +0 -1
- package/dist/chunk-5ABOFAHN.js.map +0 -1
- package/dist/chunk-6SYOHUHM.js.map +0 -1
- package/dist/chunk-AZXEOEQK.js.map +0 -1
- package/dist/chunk-D4LAJ737.js.map +0 -1
- package/dist/chunk-DOZFU7OZ.js.map +0 -1
- package/dist/chunk-EGU4PWQW.js.map +0 -1
- package/dist/chunk-EWPS35AR.js.map +0 -1
- package/dist/chunk-GHEMAVTN.js.map +0 -1
- package/dist/chunk-GQT6J4FJ.js.map +0 -1
- package/dist/chunk-H5GMROCB.js.map +0 -1
- package/dist/chunk-LN3MQFUE.js.map +0 -1
- package/dist/chunk-M4GO4ZJK.js.map +0 -1
- package/dist/chunk-MQBFT2OT.js.map +0 -1
- package/dist/chunk-NIKO2BBZ.js.map +0 -1
- package/dist/chunk-PWWWMRT7.js.map +0 -1
- package/dist/chunk-QVIZDLAR.js.map +0 -1
- package/dist/chunk-RM5EXCFF.js.map +0 -1
- package/dist/chunk-SEU6QHH4.js.map +0 -1
- package/dist/chunk-TSNRZSRC.js.map +0 -1
- package/dist/chunk-YGMREQAK.js.map +0 -1
- package/dist/chunk-YJ3TREAC.js.map +0 -1
- package/dist/chunk-YMUGBZN2.js.map +0 -1
- package/dist/chunk-ZDFU34XY.js.map +0 -1
- package/dist/chunk-ZGEFBDPR.js.map +0 -1
- package/dist/chunk-ZX5FNWH7.js.map +0 -1
- package/dist/collection-facade-S5PPKZD5.js +0 -44
- package/dist/delegation-EV7LKJPH.js +0 -25
- package/dist/derive-5LDJW76F.js +0 -21
- package/dist/executor-FCJEH3FU.js +0 -9
- package/dist/executor-OHET7TF7.js +0 -9
- package/dist/executor-SVHAJZ4A.js +0 -28
- package/dist/export-accessible-S35YKIBL.js +0 -23
- package/dist/extract-partition-UVHAM5WZ.js +0 -38
- package/dist/find-LEBUXVL7.js +0 -11
- package/dist/issue-5X3SMCF4.js +0 -19
- package/dist/liberate-NHTCKBU4.js +0 -24
- package/dist/noydb-TI3RFU6M.js +0 -78
- package/dist/register-CEX7R7NE.js +0 -23
- package/dist/registry-7CZWF3EQ.js +0 -9
- package/dist/registry-DIKMRXUC.js +0 -19
- package/dist/registry-EWIB5NTI.js +0 -18
- package/dist/request-withdrawal-AAG57QO4.js +0 -31
- package/dist/revoke-U5LCIJMF.js +0 -24
- package/dist/signer-NAA2OX7H.js +0 -25
- package/dist/storage-FL7XXZTN.js +0 -23
- package/dist/withdraw-accessible-GO6KQJVM.js +0 -28
- /package/dist/{api-5QVQX4HG.js.map → api-3NKVNZPM.js.map} +0 -0
- /package/dist/{backup-USYSNCYM.js.map → backup-PTSVXDDW.js.map} +0 -0
- /package/dist/{chunk-5WLDZZ6S.js.map → chunk-35NMVJ7I.js.map} +0 -0
- /package/dist/{chunk-NA374QG7.js.map → chunk-3XKESW5E.js.map} +0 -0
- /package/dist/{chunk-MUPZ6IZX.js.map → chunk-4JQK3L4V.js.map} +0 -0
- /package/dist/{chunk-Z4D3YGAB.js.map → chunk-4ZKNC6A6.js.map} +0 -0
- /package/dist/{chunk-ONB627HU.js.map → chunk-55LX6FSX.js.map} +0 -0
- /package/dist/{chunk-M7W2KYTL.js.map → chunk-56IIVAEO.js.map} +0 -0
- /package/dist/{chunk-FHHYCBBP.js.map → chunk-5DRROK5W.js.map} +0 -0
- /package/dist/{chunk-GTNRMJYH.js.map → chunk-5GQEU4DN.js.map} +0 -0
- /package/dist/{chunk-XSOGLHGY.js.map → chunk-6L3DKWRY.js.map} +0 -0
- /package/dist/{chunk-44Y3P5U6.js.map → chunk-6M2I3DKF.js.map} +0 -0
- /package/dist/{chunk-HDF5R2K6.js.map → chunk-6R6Q3MRN.js.map} +0 -0
- /package/dist/{chunk-ZUDAK436.js.map → chunk-6UBZ6I5Z.js.map} +0 -0
- /package/dist/{chunk-7U6AB7DZ.js.map → chunk-AKKRXT23.js.map} +0 -0
- /package/dist/{chunk-OWLZONGX.js.map → chunk-BLBAQRBM.js.map} +0 -0
- /package/dist/{chunk-XONZGK6J.js.map → chunk-BN4HRYAZ.js.map} +0 -0
- /package/dist/{chunk-QVGEVZ5F.js.map → chunk-BQ6DHN4I.js.map} +0 -0
- /package/dist/{chunk-LG2GUYRX.js.map → chunk-BYFXLDVV.js.map} +0 -0
- /package/dist/{chunk-QRHEAZ2Q.js.map → chunk-CUZLNGD5.js.map} +0 -0
- /package/dist/{chunk-HXVRRJBD.js.map → chunk-DGBIHDVK.js.map} +0 -0
- /package/dist/{chunk-JGOKAZNB.js.map → chunk-DZAF24PG.js.map} +0 -0
- /package/dist/{chunk-TMR64XPL.js.map → chunk-EZNTORXE.js.map} +0 -0
- /package/dist/{chunk-WCJJQV2D.js.map → chunk-FMNU7IUG.js.map} +0 -0
- /package/dist/{collection-facade-S5PPKZD5.js.map → chunk-GJW4HX2O.js.map} +0 -0
- /package/dist/{chunk-JTIPVW4J.js.map → chunk-GP3UWP22.js.map} +0 -0
- /package/dist/{chunk-XG7OZDOS.js.map → chunk-HFUAFR6B.js.map} +0 -0
- /package/dist/{chunk-VDTWFN2P.js.map → chunk-IMRB2C4O.js.map} +0 -0
- /package/dist/{chunk-2BVW754E.js.map → chunk-ISRKW4YN.js.map} +0 -0
- /package/dist/{chunk-P4NUJVWL.js.map → chunk-IXNCZTWA.js.map} +0 -0
- /package/dist/{chunk-ZHZ4PET5.js.map → chunk-JIDLU57U.js.map} +0 -0
- /package/dist/{chunk-PTT2NB46.js.map → chunk-JYJFGD2H.js.map} +0 -0
- /package/dist/{chunk-XY6MNSAF.js.map → chunk-JYV4JJV2.js.map} +0 -0
- /package/dist/{chunk-ZHMUFYZF.js.map → chunk-KBPU5M2E.js.map} +0 -0
- /package/dist/{chunk-HA7P3BTB.js.map → chunk-KRCBZYTZ.js.map} +0 -0
- /package/dist/{chunk-VNJMLOQS.js.map → chunk-KW42W6SV.js.map} +0 -0
- /package/dist/{chunk-3GXDB3NQ.js.map → chunk-MANUDU7I.js.map} +0 -0
- /package/dist/{chunk-IUATR5UE.js.map → chunk-N5PLUFH2.js.map} +0 -0
- /package/dist/{chunk-C2V7AJO2.js.map → chunk-NEX7JCMO.js.map} +0 -0
- /package/dist/{chunk-5HSSTOOG.js.map → chunk-NFZGZ4AK.js.map} +0 -0
- /package/dist/{chunk-32467U5J.js.map → chunk-OBPVWOSQ.js.map} +0 -0
- /package/dist/{chunk-6SSWOUUS.js.map → chunk-OLIWCCFM.js.map} +0 -0
- /package/dist/{chunk-UNREYBZO.js.map → chunk-OLSARBZU.js.map} +0 -0
- /package/dist/{chunk-7LP7FFJ2.js.map → chunk-QD46HPZG.js.map} +0 -0
- /package/dist/{chunk-G4MFQXYX.js.map → chunk-QJNCB5SK.js.map} +0 -0
- /package/dist/{chunk-MMVQ3SUO.js.map → chunk-RZPOZPZU.js.map} +0 -0
- /package/dist/{chunk-E7FSBI6I.js.map → chunk-SGQ4N5FS.js.map} +0 -0
- /package/dist/{chunk-522MBPE5.js.map → chunk-SHEEBRZ4.js.map} +0 -0
- /package/dist/{chunk-EPME33Y4.js.map → chunk-SHYIA73K.js.map} +0 -0
- /package/dist/{chunk-MLCTPWSO.js.map → chunk-TE6LH6J2.js.map} +0 -0
- /package/dist/{chunk-JOCMXSR2.js.map → chunk-UADPR6F4.js.map} +0 -0
- /package/dist/{chunk-SBOHNJUD.js.map → chunk-V6UQZA2H.js.map} +0 -0
- /package/dist/{chunk-KCZAFDP5.js.map → chunk-VH6SOCXH.js.map} +0 -0
- /package/dist/{chunk-4B3DL75F.js.map → chunk-W3G5REIU.js.map} +0 -0
- /package/dist/{chunk-MPPWL64H.js.map → chunk-WBKZUO5V.js.map} +0 -0
- /package/dist/{chunk-WWBC4KLB.js.map → chunk-WO4T4OD5.js.map} +0 -0
- /package/dist/{chunk-7IQWHYL2.js.map → chunk-WZ3NCMK6.js.map} +0 -0
- /package/dist/{chunk-BAAUFCJK.js.map → chunk-X4MVWPHV.js.map} +0 -0
- /package/dist/{chunk-HVPW6PCX.js.map → chunk-XIDQKFZF.js.map} +0 -0
- /package/dist/{chunk-OWOT7CFC.js.map → chunk-Y6B6HVKC.js.map} +0 -0
- /package/dist/{chunk-ICYC5YNI.js.map → chunk-Y6VZQGGH.js.map} +0 -0
- /package/dist/{chunk-ZM72UO3Y.js.map → chunk-ZFUFAHZ3.js.map} +0 -0
- /package/dist/{classified-marker-SVDRXLD3.js.map → classified-marker-EOOSMWFC.js.map} +0 -0
- /package/dist/{computed-33DRJDOC.js.map → collection-facade-TTRF5NFJ.js.map} +0 -0
- /package/dist/{cover-ADBCTIKN.js.map → computed-AB45PS4V.js.map} +0 -0
- /package/dist/{delegation-EV7LKJPH.js.map → cover/index.js.map} +0 -0
- /package/dist/{derive-5LDJW76F.js.map → custody/index.js.map} +0 -0
- /package/dist/{dead-filter-HKDMTMVY.js.map → dead-filter-6DYY7S64.js.map} +0 -0
- /package/dist/{enclave-ZA7C3H2L.js.map → derive-IGGVSUPH.js.map} +0 -0
- /package/dist/{executor-FCJEH3FU.js.map → directory/index.js.map} +0 -0
- /package/dist/{dispatch-SPMYNXNW.js.map → dispatch-7T45NN7C.js.map} +0 -0
- /package/dist/{dispatch-V5MSMQYX.js.map → dispatch-RPTLK7LJ.js.map} +0 -0
- /package/dist/{executor-OHET7TF7.js.map → enclave-CLJVSDFG.js.map} +0 -0
- /package/dist/{executor-SVHAJZ4A.js.map → executor-IEBLTBCW.js.map} +0 -0
- /package/dist/{export-accessible-S35YKIBL.js.map → executor-RM7XWQDU.js.map} +0 -0
- /package/dist/{extract-partition-UVHAM5WZ.js.map → executor-XZYM4KHT.js.map} +0 -0
- /package/dist/{find-LEBUXVL7.js.map → export-accessible-24XCCD3A.js.map} +0 -0
- /package/dist/{issue-5X3SMCF4.js.map → extract-partition-H2TPEEOF.js.map} +0 -0
- /package/dist/{fanout-sidecar-HRMHC34B.js.map → fanout-sidecar-TV7CXAJ6.js.map} +0 -0
- /package/dist/{ledger-K6JBFL3Z.js.map → find-OZMTRIK3.js.map} +0 -0
- /package/dist/{liberate-NHTCKBU4.js.map → introspection/index.js.map} +0 -0
- /package/dist/{link-set-XVZY2ODC.js.map → issue-55HJE7JF.js.map} +0 -0
- /package/dist/{noydb-TI3RFU6M.js.map → ledger-XY6NP3J2.js.map} +0 -0
- /package/dist/{policy-QWGJB7P7.js.map → liberate-LXOJ2EMB.js.map} +0 -0
- /package/dist/{register-CEX7R7NE.js.map → link-set-POQB7BU5.js.map} +0 -0
- /package/dist/{registry-7CZWF3EQ.js.map → money/index.js.map} +0 -0
- /package/dist/{registry-DIKMRXUC.js.map → noydb-KXS35UJS.js.map} +0 -0
- /package/dist/{registry-EWIB5NTI.js.map → policy/index.js.map} +0 -0
- /package/dist/{post-register-5VHHVFJY.js.map → post-register-URQANI3B.js.map} +0 -0
- /package/dist/{registry-VW6P6A3J.js.map → register-5W6CG4RM.js.map} +0 -0
- /package/dist/{request-withdrawal-AAG57QO4.js.map → registry-7Y5WF7GS.js.map} +0 -0
- /package/dist/{revoke-U5LCIJMF.js.map → registry-BWD2ED52.js.map} +0 -0
- /package/dist/{signer-NAA2OX7H.js.map → registry-MCSGBZXI.js.map} +0 -0
- /package/dist/{stale-BJO2WIN7.js.map → registry-UJFP3NWF.js.map} +0 -0
- /package/dist/{storage-FL7XXZTN.js.map → request-withdrawal-IWYDM4SO.js.map} +0 -0
- /package/dist/{reveal-7OOT5XPD.js.map → reveal-BXZGWIOP.js.map} +0 -0
- /package/dist/{withdraw-accessible-GO6KQJVM.js.map → revoke-TINYPHYY.js.map} +0 -0
- /package/dist/{seed-GVOI6QP6.js.map → seed-F7YYQTRC.js.map} +0 -0
- /package/dist/{store-coordination-provider-DX5HECK3.js.map → store-coordination-provider-5LX2UFU2.js.map} +0 -0
- /package/dist/{verify-5X37OXRY.js.map → verify-7XWHJWUN.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
UserApi
|
|
3
|
-
} from "./chunk-NA374QG7.js";
|
|
4
|
-
import {
|
|
5
|
-
DEFAULT_FRESHNESS_MS,
|
|
6
|
-
PERSONAL_POLICY,
|
|
7
|
-
STRICT_POLICY,
|
|
8
|
-
checkGate,
|
|
9
|
-
describeGate,
|
|
10
|
-
mergePolicy
|
|
11
|
-
} from "./chunk-WCJJQV2D.js";
|
|
12
1
|
import {
|
|
13
2
|
Collection,
|
|
14
3
|
ELEVATION_AUDIT_COLLECTION,
|
|
@@ -20,10 +9,6 @@ import {
|
|
|
20
9
|
RefScopeError,
|
|
21
10
|
Vault,
|
|
22
11
|
createNoydb,
|
|
23
|
-
describeAllUsersAuth,
|
|
24
|
-
describeAuthConfig,
|
|
25
|
-
describeUserAuth,
|
|
26
|
-
diagramAuthConfig,
|
|
27
12
|
isRefArray,
|
|
28
13
|
isViaFieldSpec,
|
|
29
14
|
memoryStore,
|
|
@@ -31,189 +16,222 @@ import {
|
|
|
31
16
|
refArray,
|
|
32
17
|
via,
|
|
33
18
|
withArchive
|
|
34
|
-
} from "./chunk-
|
|
35
|
-
import
|
|
36
|
-
NO_SEQUENCE,
|
|
37
|
-
SequenceStore,
|
|
38
|
-
compileSequenceFormat,
|
|
39
|
-
resolveSequenceKey,
|
|
40
|
-
withSequence
|
|
41
|
-
} from "./chunk-YGMREQAK.js";
|
|
42
|
-
import {
|
|
43
|
-
META_COLLECTION,
|
|
44
|
-
POLICY_RECORD_ID,
|
|
45
|
-
loadVaultPolicy,
|
|
46
|
-
saveVaultPolicy
|
|
47
|
-
} from "./chunk-M7W2KYTL.js";
|
|
48
|
-
import {
|
|
49
|
-
DELEGATIONS_COLLECTION,
|
|
50
|
-
issueDelegation,
|
|
51
|
-
loadActiveDelegations,
|
|
52
|
-
revokeDelegation
|
|
53
|
-
} from "./chunk-ZF572E2M.js";
|
|
54
|
-
import "./chunk-VYYM3MEN.js";
|
|
55
|
-
import {
|
|
56
|
-
COVER_FIELDS,
|
|
57
|
-
DEFAULT_COVER_SCHEMA,
|
|
58
|
-
resolveSchema
|
|
59
|
-
} from "./chunk-QRHEAZ2Q.js";
|
|
60
|
-
import "./chunk-5ABOFAHN.js";
|
|
19
|
+
} from "./chunk-XOBHRD2M.js";
|
|
20
|
+
import "./chunk-NJ4DYYO5.js";
|
|
61
21
|
import {
|
|
62
22
|
persistSchemaIfNeeded
|
|
63
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-FO6RNKKW.js";
|
|
64
24
|
import {
|
|
65
25
|
LinkEndpointError
|
|
66
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-HFUAFR6B.js";
|
|
67
27
|
import {
|
|
68
28
|
LinkIntegrityError,
|
|
69
29
|
isLinkCollectionName
|
|
70
|
-
} from "./chunk-
|
|
71
|
-
import "./chunk-
|
|
30
|
+
} from "./chunk-4JQK3L4V.js";
|
|
31
|
+
import "./chunk-SHEEBRZ4.js";
|
|
72
32
|
import {
|
|
73
33
|
ComputedFieldError,
|
|
74
34
|
evalComputedFields
|
|
75
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-5DRROK5W.js";
|
|
76
36
|
import {
|
|
77
37
|
WithdrawalRequestError,
|
|
78
38
|
approveWithdrawal,
|
|
79
39
|
listWithdrawalRequests,
|
|
80
40
|
rejectWithdrawal,
|
|
81
41
|
requestWithdrawal
|
|
82
|
-
} from "./chunk-
|
|
83
|
-
import "./chunk-
|
|
42
|
+
} from "./chunk-JYV4JJV2.js";
|
|
43
|
+
import "./chunk-6M2I3DKF.js";
|
|
44
|
+
import "./chunk-CCDP6EPB.js";
|
|
84
45
|
import {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
} from "./chunk-
|
|
46
|
+
COVER_FIELDS,
|
|
47
|
+
DEFAULT_COVER_SCHEMA,
|
|
48
|
+
resolveSchema
|
|
49
|
+
} from "./chunk-CUZLNGD5.js";
|
|
89
50
|
import {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
51
|
+
additiveOnly,
|
|
52
|
+
blindUpdate,
|
|
53
|
+
coordinatedCutover,
|
|
54
|
+
lockSchema
|
|
55
|
+
} from "./chunk-E23UGFVC.js";
|
|
56
|
+
import "./chunk-6LJY7X5A.js";
|
|
57
|
+
import "./chunk-DSDXAKIP.js";
|
|
58
|
+
import {
|
|
59
|
+
DEFAULT_FRESHNESS_MS,
|
|
60
|
+
PERSONAL_POLICY,
|
|
61
|
+
STRICT_POLICY,
|
|
62
|
+
checkGate,
|
|
63
|
+
describeGate,
|
|
64
|
+
mergePolicy
|
|
65
|
+
} from "./chunk-FMNU7IUG.js";
|
|
66
|
+
import "./chunk-GJW4HX2O.js";
|
|
67
|
+
import {
|
|
68
|
+
UserApi
|
|
69
|
+
} from "./chunk-3XKESW5E.js";
|
|
70
|
+
import "./chunk-GYGLAVCX.js";
|
|
71
|
+
import "./chunk-6R6Q3MRN.js";
|
|
72
|
+
import "./chunk-BLBAQRBM.js";
|
|
93
73
|
import {
|
|
94
74
|
decryptExtractedPartition,
|
|
95
75
|
diffVault,
|
|
96
76
|
withCargo
|
|
97
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-PT4XLP6I.js";
|
|
98
78
|
import {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
withCustody
|
|
103
|
-
} from "./chunk-3S2YNMUS.js";
|
|
104
|
-
import "./chunk-LG2GUYRX.js";
|
|
79
|
+
NO_CARGO
|
|
80
|
+
} from "./chunk-TG634KCO.js";
|
|
81
|
+
import "./chunk-BYFXLDVV.js";
|
|
105
82
|
import {
|
|
106
|
-
DEED_RECORD_ID,
|
|
107
83
|
createDeedOwner,
|
|
108
84
|
isDeedVault,
|
|
109
85
|
liberateVault,
|
|
110
86
|
loadDeedMarker
|
|
111
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-TIVK6PRK.js";
|
|
112
88
|
import {
|
|
113
89
|
MemoryRecipientSealer,
|
|
114
90
|
MemorySealingKeyProvider,
|
|
115
|
-
SEALED_SECRET_RECORD_ID,
|
|
116
91
|
aesGcmOpen,
|
|
117
|
-
loadSealedSecret,
|
|
118
92
|
parseRsaOaepTlv,
|
|
119
|
-
parseSealedEnvelope,
|
|
120
|
-
saveSealedSecret,
|
|
121
93
|
sealRsaOaepTlv
|
|
122
|
-
} from "./chunk-
|
|
94
|
+
} from "./chunk-OLIWCCFM.js";
|
|
123
95
|
import {
|
|
124
|
-
|
|
125
|
-
} from "./chunk-
|
|
96
|
+
withdrawAccessibleData
|
|
97
|
+
} from "./chunk-TE6LH6J2.js";
|
|
98
|
+
import {
|
|
99
|
+
exportAccessibleData
|
|
100
|
+
} from "./chunk-WO4T4OD5.js";
|
|
101
|
+
import {
|
|
102
|
+
routeStore,
|
|
103
|
+
withCache,
|
|
104
|
+
withCircuitBreaker,
|
|
105
|
+
withHealthCheck,
|
|
106
|
+
withLogging,
|
|
107
|
+
withMetrics,
|
|
108
|
+
withRetry,
|
|
109
|
+
wrapStore
|
|
110
|
+
} from "./chunk-VSRSQ2CR.js";
|
|
111
|
+
import {
|
|
112
|
+
applyListProjection
|
|
113
|
+
} from "./chunk-VG2ZSFYD.js";
|
|
114
|
+
import "./chunk-VYYM3MEN.js";
|
|
115
|
+
import {
|
|
116
|
+
derivePersistedSchema,
|
|
117
|
+
isZodSchema
|
|
118
|
+
} from "./chunk-6ZNSB3H6.js";
|
|
119
|
+
import "./chunk-Y2NBBT6K.js";
|
|
126
120
|
import {
|
|
127
121
|
SCHEMAS_COLLECTION,
|
|
128
122
|
loadPersistedSchema,
|
|
129
123
|
savePersistedSchema
|
|
130
|
-
} from "./chunk-
|
|
131
|
-
import "./chunk-GYGLAVCX.js";
|
|
124
|
+
} from "./chunk-OBPVWOSQ.js";
|
|
132
125
|
import {
|
|
133
|
-
|
|
134
|
-
|
|
126
|
+
MoneyCurrencyError,
|
|
127
|
+
MoneyPrecisionError,
|
|
128
|
+
MoneyUnsupportedError,
|
|
129
|
+
allocate,
|
|
130
|
+
asMoney,
|
|
131
|
+
isMoneyDescriptor,
|
|
132
|
+
isMoneyString,
|
|
133
|
+
money,
|
|
134
|
+
moneyNumber,
|
|
135
|
+
mulRate,
|
|
136
|
+
scaleForCurrency
|
|
137
|
+
} from "./chunk-SGDPRCC4.js";
|
|
135
138
|
import {
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
withDerivation,
|
|
140
|
+
withRollup
|
|
141
|
+
} from "./chunk-NYEFP7DY.js";
|
|
142
|
+
import "./chunk-AT2JJEKJ.js";
|
|
143
|
+
import "./chunk-4ZKNC6A6.js";
|
|
144
|
+
import "./chunk-MHMLXJ3I.js";
|
|
145
|
+
import {
|
|
146
|
+
withMaterializedView
|
|
147
|
+
} from "./chunk-MXUT7FTE.js";
|
|
148
|
+
import "./chunk-FRMW23UK.js";
|
|
149
|
+
import {
|
|
150
|
+
buildLookupSnapshot
|
|
151
|
+
} from "./chunk-GP3UWP22.js";
|
|
152
|
+
import "./chunk-3HUYRN24.js";
|
|
153
|
+
import "./chunk-IMRB2C4O.js";
|
|
154
|
+
import {
|
|
155
|
+
withOverlayedView
|
|
156
|
+
} from "./chunk-MSMJJB4J.js";
|
|
157
|
+
import "./chunk-ZTLOXFPB.js";
|
|
158
|
+
import "./chunk-IG6KUWBX.js";
|
|
138
159
|
import "./chunk-EP5L47XV.js";
|
|
139
160
|
import {
|
|
140
161
|
isDiscriminant
|
|
141
162
|
} from "./chunk-PY4KJPYU.js";
|
|
142
|
-
import "./chunk-
|
|
163
|
+
import "./chunk-5GQEU4DN.js";
|
|
143
164
|
import {
|
|
144
165
|
classified,
|
|
145
166
|
luhnCheck
|
|
146
|
-
} from "./chunk-
|
|
167
|
+
} from "./chunk-6L3DKWRY.js";
|
|
147
168
|
import {
|
|
148
169
|
ClassifiedNeverStoredError,
|
|
149
170
|
ClassifiedValidationError,
|
|
150
171
|
isClassifiedFieldSpec,
|
|
151
172
|
isClassifiedGroup,
|
|
152
173
|
resolveClassifiedFields
|
|
153
|
-
} from "./chunk-
|
|
154
|
-
import "./chunk-
|
|
155
|
-
import "./chunk-
|
|
156
|
-
import "./chunk-XONZGK6J.js";
|
|
157
|
-
import "./chunk-IUATR5UE.js";
|
|
174
|
+
} from "./chunk-ZFUFAHZ3.js";
|
|
175
|
+
import "./chunk-BN4HRYAZ.js";
|
|
176
|
+
import "./chunk-N5PLUFH2.js";
|
|
158
177
|
import "./chunk-GHVIKOHT.js";
|
|
159
178
|
import {
|
|
160
179
|
immutableGuard,
|
|
161
180
|
transitionGuard,
|
|
162
181
|
withGuard
|
|
163
|
-
} from "./chunk-
|
|
164
|
-
import "./chunk-
|
|
182
|
+
} from "./chunk-RO5NM6UI.js";
|
|
183
|
+
import "./chunk-FQ5CHJR7.js";
|
|
165
184
|
import "./chunk-JK733I5V.js";
|
|
166
|
-
import "./chunk-
|
|
185
|
+
import "./chunk-W66AM5IB.js";
|
|
167
186
|
import {
|
|
168
187
|
CollectionFrame,
|
|
169
188
|
VaultFrame
|
|
170
|
-
} from "./chunk-
|
|
189
|
+
} from "./chunk-55LX6FSX.js";
|
|
171
190
|
import "./chunk-SMY5X46Z.js";
|
|
172
|
-
import "./chunk-
|
|
191
|
+
import "./chunk-DZFQVICS.js";
|
|
173
192
|
import {
|
|
174
193
|
TxCollection,
|
|
175
194
|
TxContext,
|
|
176
195
|
TxVault,
|
|
177
196
|
runTransaction
|
|
178
|
-
} from "./chunk-
|
|
197
|
+
} from "./chunk-BQ6DHN4I.js";
|
|
198
|
+
import "./chunk-5D2ALSM5.js";
|
|
179
199
|
import {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
import "./chunk-Z4D3YGAB.js";
|
|
185
|
-
import "./chunk-YJ3TREAC.js";
|
|
200
|
+
NO_SEARCH,
|
|
201
|
+
tokenize,
|
|
202
|
+
withSearch
|
|
203
|
+
} from "./chunk-QADFHRQM.js";
|
|
186
204
|
import {
|
|
187
|
-
|
|
188
|
-
} from "./chunk-
|
|
189
|
-
import "./chunk-MQBFT2OT.js";
|
|
205
|
+
fuseRetrieval
|
|
206
|
+
} from "./chunk-AURFOK3D.js";
|
|
190
207
|
import {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
208
|
+
NO_SEQUENCE,
|
|
209
|
+
SequenceStore,
|
|
210
|
+
compileSequenceFormat,
|
|
211
|
+
resolveSequenceKey,
|
|
212
|
+
withSequence
|
|
213
|
+
} from "./chunk-EBKCYQ2D.js";
|
|
196
214
|
import {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
215
|
+
CustodyApi,
|
|
216
|
+
NO_CUSTODY,
|
|
217
|
+
withCustody
|
|
218
|
+
} from "./chunk-SKM35Y4Q.js";
|
|
201
219
|
import {
|
|
202
220
|
DEFAULT_CROSS_JOIN_MAX_ROWS,
|
|
203
221
|
Query,
|
|
204
222
|
ScanBuilder,
|
|
205
223
|
buildLiveQuery,
|
|
206
224
|
executePlan
|
|
207
|
-
} from "./chunk-
|
|
225
|
+
} from "./chunk-WBKZUO5V.js";
|
|
208
226
|
import {
|
|
209
227
|
DEFAULT_JOIN_MAX_ROWS,
|
|
210
228
|
applyJoins
|
|
211
|
-
} from "./chunk-
|
|
229
|
+
} from "./chunk-V6UQZA2H.js";
|
|
212
230
|
import {
|
|
213
231
|
importExternalObjects,
|
|
214
232
|
memoryObjectProjection
|
|
215
233
|
} from "./chunk-4Q6HSHHL.js";
|
|
216
|
-
import "./chunk-
|
|
234
|
+
import "./chunk-IF6WNGAK.js";
|
|
217
235
|
import {
|
|
218
236
|
BLOB_CHUNKS_COLLECTION,
|
|
219
237
|
BLOB_COLLECTION,
|
|
@@ -230,8 +248,8 @@ import {
|
|
|
230
248
|
getIntent,
|
|
231
249
|
isPreCompressed,
|
|
232
250
|
sweepBlobIntents
|
|
233
|
-
} from "./chunk-
|
|
234
|
-
import "./chunk-
|
|
251
|
+
} from "./chunk-NQSO4UAH.js";
|
|
252
|
+
import "./chunk-L3YYLT4E.js";
|
|
235
253
|
import {
|
|
236
254
|
CollectionIndexes
|
|
237
255
|
} from "./chunk-KPZS5QAQ.js";
|
|
@@ -243,7 +261,7 @@ import {
|
|
|
243
261
|
estimateRecordBytes,
|
|
244
262
|
parseBytes
|
|
245
263
|
} from "./chunk-NO272T7Q.js";
|
|
246
|
-
import "./chunk-
|
|
264
|
+
import "./chunk-KRCBZYTZ.js";
|
|
247
265
|
import "./chunk-XZHEOSQ2.js";
|
|
248
266
|
import "./chunk-YMUFFJCO.js";
|
|
249
267
|
import "./chunk-CADUYBQD.js";
|
|
@@ -262,7 +280,7 @@ import {
|
|
|
262
280
|
createPodStore,
|
|
263
281
|
wrapBundleStore,
|
|
264
282
|
wrapPodStore
|
|
265
|
-
} from "./chunk-
|
|
283
|
+
} from "./chunk-Y6B6HVKC.js";
|
|
266
284
|
import {
|
|
267
285
|
NOYDB_BUNDLE_FORMAT_VERSION,
|
|
268
286
|
NOYDB_BUNDLE_MAGIC,
|
|
@@ -275,7 +293,7 @@ import {
|
|
|
275
293
|
readPodHeader,
|
|
276
294
|
writeNoydbBundle,
|
|
277
295
|
writePod
|
|
278
|
-
} from "./chunk-
|
|
296
|
+
} from "./chunk-SGQ4N5FS.js";
|
|
279
297
|
import {
|
|
280
298
|
COVER_RECORD_ID,
|
|
281
299
|
isCover,
|
|
@@ -283,21 +301,21 @@ import {
|
|
|
283
301
|
readCover,
|
|
284
302
|
saveCover,
|
|
285
303
|
validateCoverInput
|
|
286
|
-
} from "./chunk-
|
|
304
|
+
} from "./chunk-JIDLU57U.js";
|
|
287
305
|
import {
|
|
288
306
|
CONSENT_AUDIT_COLLECTION
|
|
289
|
-
} from "./chunk-
|
|
307
|
+
} from "./chunk-XIDQKFZF.js";
|
|
290
308
|
import "./chunk-PEOZ34EM.js";
|
|
291
|
-
import "./chunk-
|
|
309
|
+
import "./chunk-OLSARBZU.js";
|
|
292
310
|
import {
|
|
293
311
|
dictKey,
|
|
294
312
|
staticDict
|
|
295
|
-
} from "./chunk-
|
|
313
|
+
} from "./chunk-W3G5REIU.js";
|
|
296
314
|
import {
|
|
297
315
|
DICT_COLLECTION_PREFIX,
|
|
298
316
|
LookupHandle,
|
|
299
317
|
dictCollectionName
|
|
300
|
-
} from "./chunk-
|
|
318
|
+
} from "./chunk-NEX7JCMO.js";
|
|
301
319
|
import {
|
|
302
320
|
applyI18nLocale,
|
|
303
321
|
enforceScript,
|
|
@@ -312,10 +330,10 @@ import {
|
|
|
312
330
|
resolvePolicy,
|
|
313
331
|
setAtPathInPlace,
|
|
314
332
|
validateI18nTextValue
|
|
315
|
-
} from "./chunk-
|
|
333
|
+
} from "./chunk-UADPR6F4.js";
|
|
316
334
|
import {
|
|
317
335
|
installViaBinder
|
|
318
|
-
} from "./chunk-
|
|
336
|
+
} from "./chunk-6UBZ6I5Z.js";
|
|
319
337
|
import {
|
|
320
338
|
credentialStatus,
|
|
321
339
|
deleteCredential,
|
|
@@ -323,39 +341,55 @@ import {
|
|
|
323
341
|
listCredentials,
|
|
324
342
|
putCredential,
|
|
325
343
|
withTeam
|
|
326
|
-
} from "./chunk-
|
|
344
|
+
} from "./chunk-SHYIA73K.js";
|
|
327
345
|
import {
|
|
328
|
-
MAGIC_LINK_CONTENT_INFO_PREFIX,
|
|
329
346
|
MAGIC_LINK_GRANTS_COLLECTION,
|
|
330
|
-
MAGIC_LINK_KEK_INFO_PREFIX,
|
|
331
347
|
NO_TEAM,
|
|
332
348
|
burnPaperRecoveryEntry,
|
|
333
349
|
deriveMagicLinkContentKey,
|
|
350
|
+
describeAllUsersAuth,
|
|
351
|
+
describeAuthConfig,
|
|
352
|
+
describeUserAuth,
|
|
353
|
+
diagramAuthConfig,
|
|
334
354
|
enrollAuthenticator,
|
|
335
355
|
findAuthenticator,
|
|
336
|
-
hasRecoveryEnrolled,
|
|
337
356
|
isMagicLinkGrantExpired,
|
|
338
357
|
listMagicLinkGrants,
|
|
339
358
|
loadPaperRecoveryEntries,
|
|
340
|
-
loadShamirRecoveryEntries,
|
|
341
359
|
magicLinkGrantRecordId,
|
|
342
360
|
mintPaperRecoveryEntry,
|
|
343
|
-
mintShamirRecoveryEntry,
|
|
344
361
|
mintWrappedDeksBlob,
|
|
345
362
|
readMagicLinkGrantRecord,
|
|
346
|
-
recoverSecret,
|
|
347
363
|
recoverUser,
|
|
348
364
|
removeAuthenticator,
|
|
349
365
|
revokeMagicLinkGrant,
|
|
350
366
|
rotateSecret,
|
|
351
367
|
savePaperRecoveryEntries,
|
|
352
|
-
saveShamirRecoveryEntries,
|
|
353
368
|
unwrapDeksFromBlob,
|
|
354
369
|
unwrapDeksFromPaperEntry,
|
|
355
|
-
unwrapDeksFromShamirEntry,
|
|
356
370
|
unwrapMagicLinkGrant,
|
|
357
371
|
writeMagicLinkGrant
|
|
358
|
-
} from "./chunk-
|
|
372
|
+
} from "./chunk-C25JXSOR.js";
|
|
373
|
+
import {
|
|
374
|
+
META_COLLECTION,
|
|
375
|
+
POLICY_RECORD_ID,
|
|
376
|
+
loadVaultPolicy,
|
|
377
|
+
saveVaultPolicy
|
|
378
|
+
} from "./chunk-56IIVAEO.js";
|
|
379
|
+
import {
|
|
380
|
+
PresenceHandle,
|
|
381
|
+
SyncEngine,
|
|
382
|
+
SyncTransaction
|
|
383
|
+
} from "./chunk-KBPU5M2E.js";
|
|
384
|
+
import {
|
|
385
|
+
BUNDLE_STORE_POLICY,
|
|
386
|
+
INDEXED_STORE_POLICY,
|
|
387
|
+
POD_STORE_POLICY,
|
|
388
|
+
SyncScheduler
|
|
389
|
+
} from "./chunk-VQNJ7UZL.js";
|
|
390
|
+
import {
|
|
391
|
+
PERIODS_COLLECTION
|
|
392
|
+
} from "./chunk-EZNTORXE.js";
|
|
359
393
|
import {
|
|
360
394
|
SYNC_CREDENTIALS_COLLECTION,
|
|
361
395
|
WeakSecretError,
|
|
@@ -369,7 +403,7 @@ import {
|
|
|
369
403
|
listUsers,
|
|
370
404
|
listUsersWithEnvelopes,
|
|
371
405
|
validateSecret
|
|
372
|
-
} from "./chunk-
|
|
406
|
+
} from "./chunk-KPXM4WO6.js";
|
|
373
407
|
import {
|
|
374
408
|
DIRECTORY_RECORD_ID,
|
|
375
409
|
VISIBILITY_RECORD_PREFIX,
|
|
@@ -383,27 +417,9 @@ import {
|
|
|
383
417
|
readUserVisibility,
|
|
384
418
|
saveUserEnvelope,
|
|
385
419
|
visibilityRecordId
|
|
386
|
-
} from "./chunk-
|
|
387
|
-
import
|
|
388
|
-
|
|
389
|
-
SyncEngine,
|
|
390
|
-
SyncTransaction
|
|
391
|
-
} from "./chunk-ZHMUFYZF.js";
|
|
392
|
-
import {
|
|
393
|
-
BUNDLE_STORE_POLICY,
|
|
394
|
-
INDEXED_STORE_POLICY,
|
|
395
|
-
POD_STORE_POLICY,
|
|
396
|
-
SyncScheduler
|
|
397
|
-
} from "./chunk-VQNJ7UZL.js";
|
|
398
|
-
import {
|
|
399
|
-
PERIODS_COLLECTION
|
|
400
|
-
} from "./chunk-TMR64XPL.js";
|
|
401
|
-
import {
|
|
402
|
-
assertTierAccess,
|
|
403
|
-
dekKey,
|
|
404
|
-
effectiveClearance
|
|
405
|
-
} from "./chunk-LC7DSMHR.js";
|
|
406
|
-
import "./chunk-P4NUJVWL.js";
|
|
420
|
+
} from "./chunk-WZ3NCMK6.js";
|
|
421
|
+
import "./chunk-PTHKZWEH.js";
|
|
422
|
+
import "./chunk-IXNCZTWA.js";
|
|
407
423
|
import {
|
|
408
424
|
PolicyEnforcer,
|
|
409
425
|
activeSessionCount,
|
|
@@ -418,7 +434,7 @@ import {
|
|
|
418
434
|
revokeAllSessions,
|
|
419
435
|
revokeSession,
|
|
420
436
|
validateSessionPolicy
|
|
421
|
-
} from "./chunk-
|
|
437
|
+
} from "./chunk-X4MVWPHV.js";
|
|
422
438
|
import "./chunk-VKQCVU2Z.js";
|
|
423
439
|
import {
|
|
424
440
|
generateULID,
|
|
@@ -427,7 +443,7 @@ import {
|
|
|
427
443
|
import {
|
|
428
444
|
CollectionInstant,
|
|
429
445
|
VaultInstant
|
|
430
|
-
} from "./chunk-
|
|
446
|
+
} from "./chunk-MANUDU7I.js";
|
|
431
447
|
import "./chunk-AFHQATY4.js";
|
|
432
448
|
import {
|
|
433
449
|
diff,
|
|
@@ -437,12 +453,12 @@ import {
|
|
|
437
453
|
LedgerStore,
|
|
438
454
|
applyPatch,
|
|
439
455
|
computePatch
|
|
440
|
-
} from "./chunk-
|
|
456
|
+
} from "./chunk-Y6VZQGGH.js";
|
|
441
457
|
import {
|
|
442
458
|
LEDGER_COLLECTION,
|
|
443
459
|
LEDGER_DELTAS_COLLECTION
|
|
444
460
|
} from "./chunk-I7FD46FF.js";
|
|
445
|
-
import "./chunk-
|
|
461
|
+
import "./chunk-JYJFGD2H.js";
|
|
446
462
|
import {
|
|
447
463
|
canonicalJson,
|
|
448
464
|
envelopePayloadHash,
|
|
@@ -450,17 +466,17 @@ import {
|
|
|
450
466
|
paddedIndex,
|
|
451
467
|
parseIndex,
|
|
452
468
|
sha256Hex
|
|
453
|
-
} from "./chunk-
|
|
454
|
-
import "./chunk-
|
|
455
|
-
import "./chunk-
|
|
469
|
+
} from "./chunk-ISRKW4YN.js";
|
|
470
|
+
import "./chunk-KFRPNHWR.js";
|
|
471
|
+
import "./chunk-QD46HPZG.js";
|
|
456
472
|
import {
|
|
457
473
|
validateSchemaInput,
|
|
458
474
|
validateSchemaOutput
|
|
459
|
-
} from "./chunk-
|
|
460
|
-
import "./chunk-
|
|
461
|
-
import "./chunk-
|
|
462
|
-
import "./chunk-
|
|
463
|
-
import "./chunk-
|
|
475
|
+
} from "./chunk-RZPOZPZU.js";
|
|
476
|
+
import "./chunk-VH6SOCXH.js";
|
|
477
|
+
import "./chunk-35NMVJ7I.js";
|
|
478
|
+
import "./chunk-NFZGZ4AK.js";
|
|
479
|
+
import "./chunk-QJNCB5SK.js";
|
|
464
480
|
import "./chunk-LP7BEXCT.js";
|
|
465
481
|
import {
|
|
466
482
|
base64ToBuffer,
|
|
@@ -470,7 +486,7 @@ import {
|
|
|
470
486
|
derivePresenceKey,
|
|
471
487
|
encryptBytes,
|
|
472
488
|
encryptDeterministic
|
|
473
|
-
} from "./chunk-
|
|
489
|
+
} from "./chunk-AKKRXT23.js";
|
|
474
490
|
import {
|
|
475
491
|
NOYDB_BACKUP_VERSION,
|
|
476
492
|
NOYDB_FORMAT_VERSION,
|
|
@@ -478,7 +494,7 @@ import {
|
|
|
478
494
|
NOYDB_SYNC_VERSION,
|
|
479
495
|
SealedHandle,
|
|
480
496
|
createStore
|
|
481
|
-
} from "./chunk-
|
|
497
|
+
} from "./chunk-GZACYEOB.js";
|
|
482
498
|
import {
|
|
483
499
|
AlreadyElevatedError,
|
|
484
500
|
AmendmentForbiddenError,
|
|
@@ -608,1790 +624,18 @@ import {
|
|
|
608
624
|
UserEnvelopeOversizedError,
|
|
609
625
|
ValidationError,
|
|
610
626
|
VaultTemplateNotFoundError
|
|
611
|
-
} from "./chunk-
|
|
627
|
+
} from "./chunk-QZWTRENR.js";
|
|
612
628
|
import "./chunk-PZ5AY32C.js";
|
|
613
629
|
|
|
614
|
-
// src/with-shape/introspection/projection.ts
|
|
615
|
-
function applyListProjection(desc, record, opts) {
|
|
616
|
-
const out = { ...record };
|
|
617
|
-
for (const f of desc.fields) {
|
|
618
|
-
if (f.classified !== void 0) {
|
|
619
|
-
const list = f.classified.list;
|
|
620
|
-
if (list === "omit") {
|
|
621
|
-
delete out[f.key];
|
|
622
|
-
continue;
|
|
623
|
-
}
|
|
624
|
-
if ("mask" in list) {
|
|
625
|
-
out[f.key] = list.mask.replace(/\$\{(\w+)\}/g, (_m, rider) => {
|
|
626
|
-
const v = record[`${f.key}_${rider}`];
|
|
627
|
-
return v === void 0 || v === null ? "\u2022" : `${v}`;
|
|
628
|
-
});
|
|
629
|
-
continue;
|
|
630
|
-
}
|
|
631
|
-
out[f.key] = record[`${f.key}_${list.rider}`];
|
|
632
|
-
continue;
|
|
633
|
-
}
|
|
634
|
-
if (opts?.sensitivity !== void 0 && (f.sensitivity === "pii" || f.sensitivity === "secret")) {
|
|
635
|
-
if (opts.sensitivity === "omit") delete out[f.key];
|
|
636
|
-
else out[f.key] = "\u2022\u2022\u2022";
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
return out;
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
// src/with-shape/schema-update/strategies.ts
|
|
643
|
-
function blindUpdate() {
|
|
644
|
-
return { name: "blindUpdate", onSchemaDelta: () => ({ action: "allow" }) };
|
|
645
|
-
}
|
|
646
|
-
function additiveOnly() {
|
|
647
|
-
return {
|
|
648
|
-
name: "additiveOnly",
|
|
649
|
-
onSchemaDelta(delta) {
|
|
650
|
-
if (delta.kind === "non-additive") {
|
|
651
|
-
return {
|
|
652
|
-
action: "reject",
|
|
653
|
-
error: new NonAdditiveSchemaChangeError(
|
|
654
|
-
`Non-additive schema change to "${delta.collection}" (added: [${delta.added.join(", ")}], removed: [${delta.removed.join(", ")}], changed: [${delta.changed.map((c) => c.field).join(", ")}]). Register a coordinatedCutover() strategy to migrate, or revert the change.`
|
|
655
|
-
)
|
|
656
|
-
};
|
|
657
|
-
}
|
|
658
|
-
return { action: "allow" };
|
|
659
|
-
}
|
|
660
|
-
};
|
|
661
|
-
}
|
|
662
|
-
function lockSchema(opts) {
|
|
663
|
-
const fields = opts?.fields;
|
|
664
|
-
return {
|
|
665
|
-
name: "lockSchema",
|
|
666
|
-
onSchemaDelta(delta) {
|
|
667
|
-
if (delta.kind === "none") return { action: "allow" };
|
|
668
|
-
const touched = fields ? [...delta.added, ...delta.removed, ...delta.changed.map((c) => c.field)].filter((f) => fields.includes(f)) : ["<any>"];
|
|
669
|
-
if (touched.length === 0) return { action: "allow" };
|
|
670
|
-
return {
|
|
671
|
-
action: "reject",
|
|
672
|
-
error: new SchemaLockedError(
|
|
673
|
-
`Schema for "${delta.collection}" is locked` + (fields ? ` on fields [${fields.join(", ")}] (touched: [${touched.join(", ")}])` : "") + `; the change was refused.`
|
|
674
|
-
)
|
|
675
|
-
};
|
|
676
|
-
}
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
// src/with-shape/schema-update/cutover.ts
|
|
681
|
-
function coordinatedCutover(opts) {
|
|
682
|
-
return {
|
|
683
|
-
name: "coordinatedCutover",
|
|
684
|
-
onSchemaDelta(delta) {
|
|
685
|
-
if (delta.kind === "non-additive") {
|
|
686
|
-
return { action: "cutover", transform: opts.transform };
|
|
687
|
-
}
|
|
688
|
-
return { action: "allow" };
|
|
689
|
-
}
|
|
690
|
-
};
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
// src/with-store/route-store.ts
|
|
694
|
-
var BLOB_CHUNKS = "_blob_chunks";
|
|
695
|
-
var BLOB_INDEX = "_blob_index";
|
|
696
|
-
var BLOB_SLOTS = "_blob_slots_";
|
|
697
|
-
var BLOB_VERSIONS = "_blob_versions_";
|
|
698
|
-
function routeStore(opts) {
|
|
699
|
-
const primary = opts.default;
|
|
700
|
-
const blobsIsSimple = opts.blobs && "get" in opts.blobs;
|
|
701
|
-
const simpleBlobStore = blobsIsSimple ? opts.blobs : void 0;
|
|
702
|
-
const tieredBlobs = !blobsIsSimple ? opts.blobs : void 0;
|
|
703
|
-
const blobThreshold = tieredBlobs?.threshold ?? 400 * 1024;
|
|
704
|
-
const allStores = /* @__PURE__ */ new Set([primary]);
|
|
705
|
-
if (simpleBlobStore) allStores.add(simpleBlobStore);
|
|
706
|
-
if (tieredBlobs?.large) allStores.add(tieredBlobs.large);
|
|
707
|
-
if (tieredBlobs?.small) allStores.add(tieredBlobs.small);
|
|
708
|
-
if (opts.age?.cold) allStores.add(opts.age.cold);
|
|
709
|
-
if (opts.routes) for (const s of Object.values(opts.routes)) allStores.add(s);
|
|
710
|
-
if (opts.vaultRoutes) for (const s of Object.values(opts.vaultRoutes)) allStores.add(s);
|
|
711
|
-
if (opts.blobRoutes) for (const s of Object.values(opts.blobRoutes)) allStores.add(s);
|
|
712
|
-
if (opts.overflow) allStores.add(opts.overflow);
|
|
713
|
-
if (opts.blobLifecycle?.archiveStore) allStores.add(opts.blobLifecycle.archiveStore);
|
|
714
|
-
const overrides = /* @__PURE__ */ new Map();
|
|
715
|
-
const suspended = /* @__PURE__ */ new Set();
|
|
716
|
-
const writeQueues = /* @__PURE__ */ new Map();
|
|
717
|
-
const NULL_STORE = {
|
|
718
|
-
name: "suspended",
|
|
719
|
-
async get() {
|
|
720
|
-
return null;
|
|
721
|
-
},
|
|
722
|
-
async put() {
|
|
723
|
-
},
|
|
724
|
-
async delete() {
|
|
725
|
-
},
|
|
726
|
-
async list() {
|
|
727
|
-
return [];
|
|
728
|
-
},
|
|
729
|
-
async loadAll() {
|
|
730
|
-
return {};
|
|
731
|
-
},
|
|
732
|
-
async saveAll() {
|
|
733
|
-
}
|
|
734
|
-
};
|
|
735
|
-
function routeNameFor(vault, collection) {
|
|
736
|
-
if (opts.vaultRoutes) {
|
|
737
|
-
for (const prefix of Object.keys(opts.vaultRoutes)) {
|
|
738
|
-
if (vault.startsWith(prefix)) return prefix;
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
if (opts.routes && !collection.startsWith("_") && opts.routes[collection]) {
|
|
742
|
-
return collection;
|
|
743
|
-
}
|
|
744
|
-
if (isBlobChunks(collection) && (simpleBlobStore || tieredBlobs)) return "blobs";
|
|
745
|
-
if (opts.routeBlobMeta && isBlobMeta(collection) && (simpleBlobStore || tieredBlobs)) return "blobs";
|
|
746
|
-
if (opts.age && !collection.startsWith("_")) {
|
|
747
|
-
}
|
|
748
|
-
return "default";
|
|
749
|
-
}
|
|
750
|
-
const quotaExceeded = false;
|
|
751
|
-
function resolveOriginalStore(route) {
|
|
752
|
-
if (route === "blobs") return simpleBlobStore ?? tieredBlobs?.large ?? primary;
|
|
753
|
-
if (route === "cold") return opts.age?.cold ?? primary;
|
|
754
|
-
if (opts.routes?.[route]) return opts.routes[route];
|
|
755
|
-
if (opts.vaultRoutes?.[route]) return opts.vaultRoutes[route];
|
|
756
|
-
return primary;
|
|
757
|
-
}
|
|
758
|
-
function maybeQueueWrite(routeName, method, vault, collection, id, envelope, expectedVersion) {
|
|
759
|
-
if (!suspended.has(routeName)) return false;
|
|
760
|
-
const queue = writeQueues.get(routeName);
|
|
761
|
-
if (!queue) return false;
|
|
762
|
-
if (queue.writes.length >= queue.maxSize) {
|
|
763
|
-
queue.writes.shift();
|
|
764
|
-
}
|
|
765
|
-
queue.writes.push({
|
|
766
|
-
method,
|
|
767
|
-
vault,
|
|
768
|
-
collection,
|
|
769
|
-
id,
|
|
770
|
-
...envelope !== void 0 ? { envelope } : {},
|
|
771
|
-
...expectedVersion !== void 0 ? { expectedVersion } : {}
|
|
772
|
-
});
|
|
773
|
-
return true;
|
|
774
|
-
}
|
|
775
|
-
function isBlobChunks(collection) {
|
|
776
|
-
return collection === BLOB_CHUNKS;
|
|
777
|
-
}
|
|
778
|
-
function isBlobMeta(collection) {
|
|
779
|
-
return collection === BLOB_INDEX || collection.startsWith(BLOB_SLOTS) || collection.startsWith(BLOB_VERSIONS);
|
|
780
|
-
}
|
|
781
|
-
function isInternal(collection) {
|
|
782
|
-
return collection.startsWith("_");
|
|
783
|
-
}
|
|
784
|
-
function storeFor(vault, collection) {
|
|
785
|
-
const rName = routeNameFor(vault, collection);
|
|
786
|
-
if (suspended.has(rName)) return NULL_STORE;
|
|
787
|
-
if (overrides.has(rName)) return overrides.get(rName);
|
|
788
|
-
if (opts.vaultRoutes) {
|
|
789
|
-
for (const [prefix, store2] of Object.entries(opts.vaultRoutes)) {
|
|
790
|
-
if (vault.startsWith(prefix)) return store2;
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
if (opts.routes && !isInternal(collection) && opts.routes[collection]) {
|
|
794
|
-
return opts.routes[collection];
|
|
795
|
-
}
|
|
796
|
-
if (isBlobChunks(collection)) {
|
|
797
|
-
if (simpleBlobStore) return simpleBlobStore;
|
|
798
|
-
if (tieredBlobs) return tieredBlobs.large;
|
|
799
|
-
}
|
|
800
|
-
if (opts.routeBlobMeta && isBlobMeta(collection)) {
|
|
801
|
-
if (simpleBlobStore) return simpleBlobStore;
|
|
802
|
-
if (tieredBlobs) return tieredBlobs.large;
|
|
803
|
-
}
|
|
804
|
-
if (quotaExceeded && opts.overflow) return opts.overflow;
|
|
805
|
-
return primary;
|
|
806
|
-
}
|
|
807
|
-
function blobStoreForSize(dataSize) {
|
|
808
|
-
if (!tieredBlobs) return simpleBlobStore ?? primary;
|
|
809
|
-
if (dataSize <= blobThreshold) {
|
|
810
|
-
return tieredBlobs.small ?? primary;
|
|
811
|
-
}
|
|
812
|
-
return tieredBlobs.large;
|
|
813
|
-
}
|
|
814
|
-
function isCold(collection, envelope, before) {
|
|
815
|
-
if (!opts.age) return false;
|
|
816
|
-
if (isInternal(collection)) return false;
|
|
817
|
-
if (opts.age.collections && opts.age.collections.length > 0) {
|
|
818
|
-
if (!opts.age.collections.includes(collection)) return false;
|
|
819
|
-
}
|
|
820
|
-
const cutoffIso = before ?? (opts.age.coldAfterDays != null ? new Date(Date.now() - opts.age.coldAfterDays * 24 * 60 * 60 * 1e3).toISOString() : void 0);
|
|
821
|
-
if (cutoffIso === void 0) return false;
|
|
822
|
-
return envelope._ts < cutoffIso;
|
|
823
|
-
}
|
|
824
|
-
const store = {
|
|
825
|
-
name: buildName(),
|
|
826
|
-
...opts.age?.cold ? { capabilities: { ...primary.capabilities, coldArchival: true } } : primary.capabilities ? { capabilities: { ...primary.capabilities, coldArchival: false } } : {},
|
|
827
|
-
async get(vault, collection, id) {
|
|
828
|
-
const s = storeFor(vault, collection);
|
|
829
|
-
const result = await s.get(vault, collection, id);
|
|
830
|
-
if (result === null && opts.age && !isInternal(collection)) {
|
|
831
|
-
if (!opts.age.collections?.length || opts.age.collections.includes(collection)) {
|
|
832
|
-
return opts.age.cold.get(vault, collection, id);
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
return result;
|
|
836
|
-
},
|
|
837
|
-
async put(vault, collection, id, envelope, expectedVersion) {
|
|
838
|
-
const rn = routeNameFor(vault, collection);
|
|
839
|
-
if (maybeQueueWrite(rn, "put", vault, collection, id, envelope, expectedVersion)) return;
|
|
840
|
-
if (isBlobChunks(collection) && tieredBlobs) {
|
|
841
|
-
const dataSize = envelope._data.length;
|
|
842
|
-
const s2 = blobStoreForSize(dataSize);
|
|
843
|
-
return s2.put(vault, collection, id, envelope, expectedVersion);
|
|
844
|
-
}
|
|
845
|
-
const s = storeFor(vault, collection);
|
|
846
|
-
if (opts.age && !isInternal(collection)) {
|
|
847
|
-
opts.age.cold.delete(vault, collection, id).catch(() => {
|
|
848
|
-
});
|
|
849
|
-
}
|
|
850
|
-
return s.put(vault, collection, id, envelope, expectedVersion);
|
|
851
|
-
},
|
|
852
|
-
async delete(vault, collection, id) {
|
|
853
|
-
const rn = routeNameFor(vault, collection);
|
|
854
|
-
if (maybeQueueWrite(rn, "delete", vault, collection, id)) return;
|
|
855
|
-
const s = storeFor(vault, collection);
|
|
856
|
-
await s.delete(vault, collection, id);
|
|
857
|
-
if (opts.age && !isInternal(collection)) {
|
|
858
|
-
await opts.age.cold.delete(vault, collection, id).catch(() => {
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
},
|
|
862
|
-
async list(vault, collection) {
|
|
863
|
-
const s = storeFor(vault, collection);
|
|
864
|
-
const ids = await s.list(vault, collection);
|
|
865
|
-
if (opts.age && !isInternal(collection)) {
|
|
866
|
-
if (!opts.age.collections?.length || opts.age.collections.includes(collection)) {
|
|
867
|
-
const coldIds = await opts.age.cold.list(vault, collection).catch(() => []);
|
|
868
|
-
if (coldIds.length > 0) {
|
|
869
|
-
const merged = new Set(ids);
|
|
870
|
-
for (const id of coldIds) merged.add(id);
|
|
871
|
-
return [...merged];
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
return ids;
|
|
876
|
-
},
|
|
877
|
-
async loadAll(vault) {
|
|
878
|
-
const stores = getStoresForVault(vault);
|
|
879
|
-
const snapshots = await Promise.all(
|
|
880
|
-
stores.map((s) => s.loadAll(vault).catch(() => ({})))
|
|
881
|
-
);
|
|
882
|
-
return mergeSnapshots(snapshots);
|
|
883
|
-
},
|
|
884
|
-
async saveAll(vault, data) {
|
|
885
|
-
const partitioned = /* @__PURE__ */ new Map();
|
|
886
|
-
for (const [collection, records] of Object.entries(data)) {
|
|
887
|
-
const s = storeFor(vault, collection);
|
|
888
|
-
if (!partitioned.has(s)) partitioned.set(s, {});
|
|
889
|
-
partitioned.get(s)[collection] = records;
|
|
890
|
-
}
|
|
891
|
-
await Promise.all(
|
|
892
|
-
[...partitioned.entries()].map(([s, snap]) => s.saveAll(vault, snap))
|
|
893
|
-
);
|
|
894
|
-
},
|
|
895
|
-
async compact(vault, compactOpts) {
|
|
896
|
-
if (!opts.age) return 0;
|
|
897
|
-
let migrated = 0;
|
|
898
|
-
const collections = opts.age.collections?.length ? opts.age.collections : Object.keys(await primary.loadAll(vault).catch(() => ({})));
|
|
899
|
-
for (const collection of collections) {
|
|
900
|
-
const ids = await primary.list(vault, collection).catch(() => []);
|
|
901
|
-
for (const id of ids) {
|
|
902
|
-
const envelope = await primary.get(vault, collection, id);
|
|
903
|
-
if (!envelope) continue;
|
|
904
|
-
if (isCold(collection, envelope, compactOpts?.before)) {
|
|
905
|
-
await opts.age.cold.put(vault, collection, id, envelope);
|
|
906
|
-
await primary.delete(vault, collection, id);
|
|
907
|
-
migrated++;
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
return migrated;
|
|
912
|
-
},
|
|
913
|
-
// ── Runtime override / suspend ──────────────────────
|
|
914
|
-
override(route, overrideStore, overrideOpts) {
|
|
915
|
-
if (overrideOpts?.hydrate) {
|
|
916
|
-
return (async () => {
|
|
917
|
-
overrides.set(route, overrideStore);
|
|
918
|
-
})();
|
|
919
|
-
}
|
|
920
|
-
overrides.set(route, overrideStore);
|
|
921
|
-
},
|
|
922
|
-
clearOverride(route) {
|
|
923
|
-
overrides.delete(route);
|
|
924
|
-
},
|
|
925
|
-
suspend(route, suspendOpts) {
|
|
926
|
-
suspended.add(route);
|
|
927
|
-
if (suspendOpts?.queue) {
|
|
928
|
-
writeQueues.set(route, {
|
|
929
|
-
writes: [],
|
|
930
|
-
maxSize: suspendOpts.maxQueueSize ?? 1e4
|
|
931
|
-
});
|
|
932
|
-
}
|
|
933
|
-
},
|
|
934
|
-
async resume(route) {
|
|
935
|
-
suspended.delete(route);
|
|
936
|
-
const queue = writeQueues.get(route);
|
|
937
|
-
if (!queue || queue.writes.length === 0) {
|
|
938
|
-
writeQueues.delete(route);
|
|
939
|
-
return 0;
|
|
940
|
-
}
|
|
941
|
-
let replayed = 0;
|
|
942
|
-
const target = overrides.get(route) ?? resolveOriginalStore(route);
|
|
943
|
-
for (const write of queue.writes) {
|
|
944
|
-
try {
|
|
945
|
-
if (write.method === "put" && write.envelope) {
|
|
946
|
-
await target.put(write.vault, write.collection, write.id, write.envelope, write.expectedVersion);
|
|
947
|
-
} else if (write.method === "delete") {
|
|
948
|
-
await target.delete(write.vault, write.collection, write.id);
|
|
949
|
-
}
|
|
950
|
-
replayed++;
|
|
951
|
-
} catch {
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
writeQueues.delete(route);
|
|
955
|
-
return replayed;
|
|
956
|
-
},
|
|
957
|
-
routeStatus() {
|
|
958
|
-
const ov = {};
|
|
959
|
-
for (const [k, v] of overrides) ov[k] = v.name ?? "unnamed";
|
|
960
|
-
const q = {};
|
|
961
|
-
for (const [k, v] of writeQueues) q[k] = v.writes.length;
|
|
962
|
-
return { overrides: ov, suspended: [...suspended], queued: q };
|
|
963
|
-
},
|
|
964
|
-
resolveBackend(vaultId) {
|
|
965
|
-
if (opts.vaultRoutes) {
|
|
966
|
-
for (const [prefix, s] of Object.entries(opts.vaultRoutes)) {
|
|
967
|
-
if (vaultId.startsWith(prefix)) return s;
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
return primary;
|
|
971
|
-
}
|
|
972
|
-
};
|
|
973
|
-
if (anyHas("listVaults")) {
|
|
974
|
-
store.listVaults = async () => {
|
|
975
|
-
const results = await Promise.all(
|
|
976
|
-
[...allStores].filter((s) => s.listVaults !== void 0).map((s) => s.listVaults().catch(() => []))
|
|
977
|
-
);
|
|
978
|
-
return [...new Set(results.flat())];
|
|
979
|
-
};
|
|
980
|
-
}
|
|
981
|
-
if (anyHas("ping")) {
|
|
982
|
-
store.ping = async () => {
|
|
983
|
-
const results = await Promise.all(
|
|
984
|
-
[...allStores].filter((s) => s.ping !== void 0).map((s) => s.ping().catch(() => false))
|
|
985
|
-
);
|
|
986
|
-
return results.some(Boolean);
|
|
987
|
-
};
|
|
988
|
-
}
|
|
989
|
-
return store;
|
|
990
|
-
function buildName() {
|
|
991
|
-
const names = [...allStores].map((s) => s.name ?? "?").join("+");
|
|
992
|
-
return `route(${names})`;
|
|
993
|
-
}
|
|
994
|
-
function anyHas(method) {
|
|
995
|
-
return [...allStores].some((s) => s[method]);
|
|
996
|
-
}
|
|
997
|
-
function getStoresForVault(vault) {
|
|
998
|
-
const stores = /* @__PURE__ */ new Set();
|
|
999
|
-
if (opts.vaultRoutes) {
|
|
1000
|
-
for (const [prefix, s] of Object.entries(opts.vaultRoutes)) {
|
|
1001
|
-
if (vault.startsWith(prefix)) {
|
|
1002
|
-
stores.add(s);
|
|
1003
|
-
return [...stores];
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
}
|
|
1007
|
-
stores.add(primary);
|
|
1008
|
-
if (simpleBlobStore) stores.add(simpleBlobStore);
|
|
1009
|
-
if (tieredBlobs?.large) stores.add(tieredBlobs.large);
|
|
1010
|
-
if (tieredBlobs?.small && tieredBlobs.small !== primary) stores.add(tieredBlobs.small);
|
|
1011
|
-
if (opts.age?.cold) stores.add(opts.age.cold);
|
|
1012
|
-
if (opts.routes) {
|
|
1013
|
-
for (const s of Object.values(opts.routes)) stores.add(s);
|
|
1014
|
-
}
|
|
1015
|
-
return [...stores];
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
function mergeSnapshots(snapshots) {
|
|
1019
|
-
const merged = {};
|
|
1020
|
-
for (const snap of snapshots) {
|
|
1021
|
-
for (const [collection, records] of Object.entries(snap)) {
|
|
1022
|
-
if (!merged[collection]) {
|
|
1023
|
-
merged[collection] = { ...records };
|
|
1024
|
-
continue;
|
|
1025
|
-
}
|
|
1026
|
-
for (const [id, envelope] of Object.entries(records)) {
|
|
1027
|
-
const existing = merged[collection][id];
|
|
1028
|
-
if (!existing || envelope._ts >= existing._ts) {
|
|
1029
|
-
merged[collection][id] = envelope;
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
return merged;
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
// src/with-store/store-middleware.ts
|
|
1038
|
-
function wrapStore(store, ...middlewares) {
|
|
1039
|
-
let result = store;
|
|
1040
|
-
for (let i = middlewares.length - 1; i >= 0; i--) {
|
|
1041
|
-
result = middlewares[i](result);
|
|
1042
|
-
}
|
|
1043
|
-
return result;
|
|
1044
|
-
}
|
|
1045
|
-
function withRetry(opts = {}) {
|
|
1046
|
-
const maxRetries = opts.maxRetries ?? 3;
|
|
1047
|
-
const backoffMs = opts.backoffMs ?? 500;
|
|
1048
|
-
const jitter = opts.jitter ?? 0.3;
|
|
1049
|
-
const retryOn = opts.retryOn ? new Set(opts.retryOn) : null;
|
|
1050
|
-
function shouldRetry(err) {
|
|
1051
|
-
if (!retryOn) return true;
|
|
1052
|
-
if (err && typeof err === "object" && "code" in err) {
|
|
1053
|
-
return retryOn.has(err.code);
|
|
1054
|
-
}
|
|
1055
|
-
return true;
|
|
1056
|
-
}
|
|
1057
|
-
async function retryable(fn) {
|
|
1058
|
-
let lastError;
|
|
1059
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
1060
|
-
try {
|
|
1061
|
-
return await fn();
|
|
1062
|
-
} catch (err) {
|
|
1063
|
-
lastError = err;
|
|
1064
|
-
if (attempt >= maxRetries || !shouldRetry(err)) throw err;
|
|
1065
|
-
const delay = backoffMs * Math.pow(2, attempt) * (1 + Math.random() * jitter);
|
|
1066
|
-
await new Promise((r) => setTimeout(r, delay));
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
throw lastError;
|
|
1070
|
-
}
|
|
1071
|
-
return (next) => ({
|
|
1072
|
-
...next,
|
|
1073
|
-
name: next.name ? `retry(${next.name})` : "retry",
|
|
1074
|
-
get: (v, c, id) => retryable(() => next.get(v, c, id)),
|
|
1075
|
-
put: (v, c, id, env, ev) => retryable(() => next.put(v, c, id, env, ev)),
|
|
1076
|
-
delete: (v, c, id) => retryable(() => next.delete(v, c, id)),
|
|
1077
|
-
list: (v, c) => retryable(() => next.list(v, c)),
|
|
1078
|
-
loadAll: (v) => retryable(() => next.loadAll(v)),
|
|
1079
|
-
saveAll: (v, d) => retryable(() => next.saveAll(v, d))
|
|
1080
|
-
});
|
|
1081
|
-
}
|
|
1082
|
-
var LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
1083
|
-
function withLogging(opts = {}) {
|
|
1084
|
-
const minLevel = LOG_LEVELS[opts.level ?? "info"];
|
|
1085
|
-
const logger = opts.logger ?? console;
|
|
1086
|
-
const logData = opts.logData ?? false;
|
|
1087
|
-
function log(level, method, args, durationMs) {
|
|
1088
|
-
if (LOG_LEVELS[level] < minLevel) return;
|
|
1089
|
-
const parts = [`[noydb:${method}]`, ...Object.entries(args).map(([k, v]) => `${k}=${String(v)}`)];
|
|
1090
|
-
if (durationMs !== void 0) parts.push(`${durationMs}ms`);
|
|
1091
|
-
logger[level](parts.join(" "));
|
|
1092
|
-
}
|
|
1093
|
-
function timed(method, args, fn) {
|
|
1094
|
-
const start = Date.now();
|
|
1095
|
-
return fn().then(
|
|
1096
|
-
(result) => {
|
|
1097
|
-
log("debug", method, args, Date.now() - start);
|
|
1098
|
-
return result;
|
|
1099
|
-
},
|
|
1100
|
-
(err) => {
|
|
1101
|
-
log("error", method, { ...args, error: err.message }, Date.now() - start);
|
|
1102
|
-
throw err;
|
|
1103
|
-
}
|
|
1104
|
-
);
|
|
1105
|
-
}
|
|
1106
|
-
return (next) => ({
|
|
1107
|
-
...next,
|
|
1108
|
-
name: next.name ? `log(${next.name})` : "log",
|
|
1109
|
-
get: (v, c, id) => timed("get", { vault: v, collection: c, id }, () => next.get(v, c, id)),
|
|
1110
|
-
put: (v, c, id, env, ev) => timed("put", {
|
|
1111
|
-
vault: v,
|
|
1112
|
-
collection: c,
|
|
1113
|
-
id,
|
|
1114
|
-
version: env._v,
|
|
1115
|
-
...logData ? { data: env._data.slice(0, 40) + "..." } : {}
|
|
1116
|
-
}, () => next.put(v, c, id, env, ev)),
|
|
1117
|
-
delete: (v, c, id) => timed("delete", { vault: v, collection: c, id }, () => next.delete(v, c, id)),
|
|
1118
|
-
list: (v, c) => timed("list", { vault: v, collection: c }, () => next.list(v, c)),
|
|
1119
|
-
loadAll: (v) => timed("loadAll", { vault: v }, () => next.loadAll(v)),
|
|
1120
|
-
saveAll: (v, d) => timed("saveAll", { vault: v }, () => next.saveAll(v, d))
|
|
1121
|
-
});
|
|
1122
|
-
}
|
|
1123
|
-
function withMetrics(opts) {
|
|
1124
|
-
function tracked(method, vault, fn, collection, id) {
|
|
1125
|
-
const start = Date.now();
|
|
1126
|
-
return fn().then(
|
|
1127
|
-
(result) => {
|
|
1128
|
-
opts.onOperation({
|
|
1129
|
-
method,
|
|
1130
|
-
vault,
|
|
1131
|
-
...collection !== void 0 ? { collection } : {},
|
|
1132
|
-
...id !== void 0 ? { id } : {},
|
|
1133
|
-
durationMs: Date.now() - start,
|
|
1134
|
-
success: true
|
|
1135
|
-
});
|
|
1136
|
-
return result;
|
|
1137
|
-
},
|
|
1138
|
-
(err) => {
|
|
1139
|
-
opts.onOperation({
|
|
1140
|
-
method,
|
|
1141
|
-
vault,
|
|
1142
|
-
...collection !== void 0 ? { collection } : {},
|
|
1143
|
-
...id !== void 0 ? { id } : {},
|
|
1144
|
-
durationMs: Date.now() - start,
|
|
1145
|
-
success: false,
|
|
1146
|
-
error: err
|
|
1147
|
-
});
|
|
1148
|
-
throw err;
|
|
1149
|
-
}
|
|
1150
|
-
);
|
|
1151
|
-
}
|
|
1152
|
-
return (next) => ({
|
|
1153
|
-
...next,
|
|
1154
|
-
name: next.name ? `metrics(${next.name})` : "metrics",
|
|
1155
|
-
get: (v, c, id) => tracked("get", v, () => next.get(v, c, id), c, id),
|
|
1156
|
-
put: (v, c, id, env, ev) => tracked("put", v, () => next.put(v, c, id, env, ev), c, id),
|
|
1157
|
-
delete: (v, c, id) => tracked("delete", v, () => next.delete(v, c, id), c, id),
|
|
1158
|
-
list: (v, c) => tracked("list", v, () => next.list(v, c), c),
|
|
1159
|
-
loadAll: (v) => tracked("loadAll", v, () => next.loadAll(v)),
|
|
1160
|
-
saveAll: (v, d) => tracked("saveAll", v, () => next.saveAll(v, d))
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
function withCircuitBreaker(opts = {}) {
|
|
1164
|
-
const threshold = opts.failureThreshold ?? 5;
|
|
1165
|
-
const resetMs = opts.resetTimeoutMs ?? 3e4;
|
|
1166
|
-
let state = "closed";
|
|
1167
|
-
let failures = 0;
|
|
1168
|
-
let lastFailureTime = 0;
|
|
1169
|
-
function recordSuccess() {
|
|
1170
|
-
if (state === "half-open") {
|
|
1171
|
-
state = "closed";
|
|
1172
|
-
failures = 0;
|
|
1173
|
-
opts.onClose?.();
|
|
1174
|
-
}
|
|
1175
|
-
failures = 0;
|
|
1176
|
-
}
|
|
1177
|
-
function recordFailure() {
|
|
1178
|
-
failures++;
|
|
1179
|
-
lastFailureTime = Date.now();
|
|
1180
|
-
if (failures >= threshold && state === "closed") {
|
|
1181
|
-
state = "open";
|
|
1182
|
-
opts.onOpen?.();
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
function canAttempt() {
|
|
1186
|
-
if (state === "closed") return true;
|
|
1187
|
-
if (state === "open") {
|
|
1188
|
-
if (Date.now() - lastFailureTime >= resetMs) {
|
|
1189
|
-
state = "half-open";
|
|
1190
|
-
return true;
|
|
1191
|
-
}
|
|
1192
|
-
return false;
|
|
1193
|
-
}
|
|
1194
|
-
return true;
|
|
1195
|
-
}
|
|
1196
|
-
async function guarded(fn, fallback) {
|
|
1197
|
-
if (!canAttempt()) return fallback;
|
|
1198
|
-
try {
|
|
1199
|
-
const result = await fn();
|
|
1200
|
-
recordSuccess();
|
|
1201
|
-
return result;
|
|
1202
|
-
} catch (err) {
|
|
1203
|
-
recordFailure();
|
|
1204
|
-
throw err;
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
return (next) => ({
|
|
1208
|
-
...next,
|
|
1209
|
-
name: next.name ? `cb(${next.name})` : "cb",
|
|
1210
|
-
get: (v, c, id) => guarded(() => next.get(v, c, id), null),
|
|
1211
|
-
put: (v, c, id, env, ev) => guarded(() => next.put(v, c, id, env, ev), void 0),
|
|
1212
|
-
delete: (v, c, id) => guarded(() => next.delete(v, c, id), void 0),
|
|
1213
|
-
list: (v, c) => guarded(() => next.list(v, c), []),
|
|
1214
|
-
loadAll: (v) => guarded(() => next.loadAll(v), {}),
|
|
1215
|
-
saveAll: (v, d) => guarded(() => next.saveAll(v, d), void 0)
|
|
1216
|
-
});
|
|
1217
|
-
}
|
|
1218
|
-
function withCache(opts = {}) {
|
|
1219
|
-
const maxEntries = opts.maxEntries ?? 500;
|
|
1220
|
-
const ttlMs = opts.ttlMs ?? 6e4;
|
|
1221
|
-
const cache = /* @__PURE__ */ new Map();
|
|
1222
|
-
function cacheKey(vault, collection, id) {
|
|
1223
|
-
return `${vault}\0${collection}\0${id}`;
|
|
1224
|
-
}
|
|
1225
|
-
function getFromCache(key) {
|
|
1226
|
-
const entry = cache.get(key);
|
|
1227
|
-
if (!entry) return void 0;
|
|
1228
|
-
if (ttlMs > 0 && Date.now() - entry.cachedAt > ttlMs) {
|
|
1229
|
-
cache.delete(key);
|
|
1230
|
-
return void 0;
|
|
1231
|
-
}
|
|
1232
|
-
cache.delete(key);
|
|
1233
|
-
cache.set(key, entry);
|
|
1234
|
-
return entry.envelope;
|
|
1235
|
-
}
|
|
1236
|
-
function setInCache(key, envelope) {
|
|
1237
|
-
if (cache.size >= maxEntries) {
|
|
1238
|
-
const oldest = cache.keys().next().value;
|
|
1239
|
-
if (oldest !== void 0) cache.delete(oldest);
|
|
1240
|
-
}
|
|
1241
|
-
cache.set(key, { envelope, cachedAt: Date.now() });
|
|
1242
|
-
}
|
|
1243
|
-
function invalidate(key) {
|
|
1244
|
-
cache.delete(key);
|
|
1245
|
-
}
|
|
1246
|
-
return (next) => ({
|
|
1247
|
-
...next,
|
|
1248
|
-
name: next.name ? `cache(${next.name})` : "cache",
|
|
1249
|
-
async get(vault, collection, id) {
|
|
1250
|
-
const key = cacheKey(vault, collection, id);
|
|
1251
|
-
const cached = getFromCache(key);
|
|
1252
|
-
if (cached !== void 0) return cached;
|
|
1253
|
-
const result = await next.get(vault, collection, id);
|
|
1254
|
-
setInCache(key, result);
|
|
1255
|
-
return result;
|
|
1256
|
-
},
|
|
1257
|
-
async put(vault, collection, id, env, ev) {
|
|
1258
|
-
invalidate(cacheKey(vault, collection, id));
|
|
1259
|
-
await next.put(vault, collection, id, env, ev);
|
|
1260
|
-
setInCache(cacheKey(vault, collection, id), env);
|
|
1261
|
-
},
|
|
1262
|
-
async delete(vault, collection, id) {
|
|
1263
|
-
invalidate(cacheKey(vault, collection, id));
|
|
1264
|
-
await next.delete(vault, collection, id);
|
|
1265
|
-
},
|
|
1266
|
-
list: (v, c) => next.list(v, c),
|
|
1267
|
-
loadAll: (v) => next.loadAll(v),
|
|
1268
|
-
saveAll: (v, d) => next.saveAll(v, d)
|
|
1269
|
-
});
|
|
1270
|
-
}
|
|
1271
|
-
function withHealthCheck(opts = {}) {
|
|
1272
|
-
const intervalMs = opts.checkIntervalMs ?? 3e4;
|
|
1273
|
-
const failThreshold = opts.suspendAfterFailures ?? 3;
|
|
1274
|
-
const successThreshold = opts.resumeAfterSuccess ?? 1;
|
|
1275
|
-
let isSuspended = false;
|
|
1276
|
-
let consecutiveFailures = 0;
|
|
1277
|
-
let consecutiveSuccesses = 0;
|
|
1278
|
-
return (next) => {
|
|
1279
|
-
const checkFn = opts.check ?? (next.ping ? () => next.ping() : async () => {
|
|
1280
|
-
await next.list("__health__", "__ping__");
|
|
1281
|
-
return true;
|
|
1282
|
-
});
|
|
1283
|
-
async function doCheck() {
|
|
1284
|
-
try {
|
|
1285
|
-
const ok = await checkFn();
|
|
1286
|
-
if (ok) {
|
|
1287
|
-
consecutiveFailures = 0;
|
|
1288
|
-
consecutiveSuccesses++;
|
|
1289
|
-
if (isSuspended && consecutiveSuccesses >= successThreshold) {
|
|
1290
|
-
isSuspended = false;
|
|
1291
|
-
consecutiveSuccesses = 0;
|
|
1292
|
-
opts.onResume?.();
|
|
1293
|
-
}
|
|
1294
|
-
} else {
|
|
1295
|
-
throw new Error("Health check returned false");
|
|
1296
|
-
}
|
|
1297
|
-
} catch {
|
|
1298
|
-
consecutiveSuccesses = 0;
|
|
1299
|
-
consecutiveFailures++;
|
|
1300
|
-
if (!isSuspended && consecutiveFailures >= failThreshold) {
|
|
1301
|
-
isSuspended = true;
|
|
1302
|
-
consecutiveFailures = 0;
|
|
1303
|
-
opts.onSuspend?.();
|
|
1304
|
-
}
|
|
1305
|
-
}
|
|
1306
|
-
}
|
|
1307
|
-
setInterval(() => {
|
|
1308
|
-
void doCheck();
|
|
1309
|
-
}, intervalMs);
|
|
1310
|
-
const wrapped = {
|
|
1311
|
-
...next,
|
|
1312
|
-
name: next.name ? `health(${next.name})` : "health",
|
|
1313
|
-
async get(v, c, id) {
|
|
1314
|
-
return isSuspended ? null : next.get(v, c, id);
|
|
1315
|
-
},
|
|
1316
|
-
async put(v, c, id, env, ev) {
|
|
1317
|
-
if (!isSuspended) await next.put(v, c, id, env, ev);
|
|
1318
|
-
},
|
|
1319
|
-
async delete(v, c, id) {
|
|
1320
|
-
if (!isSuspended) await next.delete(v, c, id);
|
|
1321
|
-
},
|
|
1322
|
-
async list(v, c) {
|
|
1323
|
-
return isSuspended ? [] : next.list(v, c);
|
|
1324
|
-
},
|
|
1325
|
-
async loadAll(v) {
|
|
1326
|
-
return isSuspended ? {} : next.loadAll(v);
|
|
1327
|
-
},
|
|
1328
|
-
async saveAll(v, d) {
|
|
1329
|
-
if (!isSuspended) await next.saveAll(v, d);
|
|
1330
|
-
}
|
|
1331
|
-
};
|
|
1332
|
-
return wrapped;
|
|
1333
|
-
};
|
|
1334
|
-
}
|
|
1335
|
-
|
|
1336
630
|
// src/with-commit/numbering/descriptor.ts
|
|
1337
|
-
function withDeferredNumbering(
|
|
1338
|
-
return {
|
|
1339
|
-
series: config.series,
|
|
1340
|
-
collection: config.collection,
|
|
1341
|
-
field: config.field,
|
|
1342
|
-
settleWindowMs: config.settleWindowMs ?? 0
|
|
1343
|
-
};
|
|
1344
|
-
}
|
|
1345
|
-
|
|
1346
|
-
// src/via/money/iso4217.ts
|
|
1347
|
-
var MINOR_UNITS = {
|
|
1348
|
-
// 2-decimal majors
|
|
1349
|
-
EUR: 2,
|
|
1350
|
-
USD: 2,
|
|
1351
|
-
GBP: 2,
|
|
1352
|
-
CHF: 2,
|
|
1353
|
-
CAD: 2,
|
|
1354
|
-
AUD: 2,
|
|
1355
|
-
NZD: 2,
|
|
1356
|
-
SGD: 2,
|
|
1357
|
-
HKD: 2,
|
|
1358
|
-
CNY: 2,
|
|
1359
|
-
INR: 2,
|
|
1360
|
-
BRL: 2,
|
|
1361
|
-
MXN: 2,
|
|
1362
|
-
ZAR: 2,
|
|
1363
|
-
RUB: 2,
|
|
1364
|
-
TRY: 2,
|
|
1365
|
-
PLN: 2,
|
|
1366
|
-
SEK: 2,
|
|
1367
|
-
NOK: 2,
|
|
1368
|
-
DKK: 2,
|
|
1369
|
-
CZK: 2,
|
|
1370
|
-
HUF: 2,
|
|
1371
|
-
RON: 2,
|
|
1372
|
-
ILS: 2,
|
|
1373
|
-
THB: 2,
|
|
1374
|
-
PHP: 2,
|
|
1375
|
-
MYR: 2,
|
|
1376
|
-
IDR: 2,
|
|
1377
|
-
AED: 2,
|
|
1378
|
-
SAR: 2,
|
|
1379
|
-
QAR: 2,
|
|
1380
|
-
EGP: 2,
|
|
1381
|
-
// 0-decimal
|
|
1382
|
-
JPY: 0,
|
|
1383
|
-
KRW: 0,
|
|
1384
|
-
ISK: 0,
|
|
1385
|
-
CLP: 0,
|
|
1386
|
-
VND: 0,
|
|
1387
|
-
XOF: 0,
|
|
1388
|
-
XAF: 0,
|
|
1389
|
-
PYG: 0,
|
|
1390
|
-
// 3-decimal
|
|
1391
|
-
BHD: 3,
|
|
1392
|
-
KWD: 3,
|
|
1393
|
-
OMR: 3,
|
|
1394
|
-
TND: 3,
|
|
1395
|
-
JOD: 3,
|
|
1396
|
-
IQD: 3,
|
|
1397
|
-
LYD: 3
|
|
1398
|
-
};
|
|
1399
|
-
function scaleForCurrency(code) {
|
|
1400
|
-
const v = MINOR_UNITS[code];
|
|
1401
|
-
return v === void 0 ? null : v;
|
|
1402
|
-
}
|
|
1403
|
-
|
|
1404
|
-
// src/via/money/fixed-point.ts
|
|
1405
|
-
function expandExponent(s) {
|
|
1406
|
-
const m = /^([+-]?)(\d+)(?:\.(\d+))?[eE]([+-]?\d+)$/.exec(s);
|
|
1407
|
-
if (!m) return s;
|
|
1408
|
-
const sign = m[1] === "-" ? "-" : "";
|
|
1409
|
-
const intp = m[2];
|
|
1410
|
-
const frac = m[3] ?? "";
|
|
1411
|
-
const exp = Number(m[4]);
|
|
1412
|
-
const digits = intp + frac;
|
|
1413
|
-
const pointPos = intp.length + exp;
|
|
1414
|
-
let body;
|
|
1415
|
-
if (pointPos <= 0) {
|
|
1416
|
-
body = "0." + "0".repeat(-pointPos) + digits;
|
|
1417
|
-
} else if (pointPos >= digits.length) {
|
|
1418
|
-
body = digits + "0".repeat(pointPos - digits.length);
|
|
1419
|
-
} else {
|
|
1420
|
-
body = digits.slice(0, pointPos) + "." + digits.slice(pointPos);
|
|
1421
|
-
}
|
|
1422
|
-
return sign + body;
|
|
1423
|
-
}
|
|
1424
|
-
function toCanonicalDecimalString(input) {
|
|
1425
|
-
let s;
|
|
1426
|
-
if (typeof input === "number") {
|
|
1427
|
-
if (!Number.isFinite(input)) return null;
|
|
1428
|
-
s = String(input);
|
|
1429
|
-
} else {
|
|
1430
|
-
s = input.trim();
|
|
1431
|
-
}
|
|
1432
|
-
s = expandExponent(s);
|
|
1433
|
-
if (s.startsWith("+")) s = s.slice(1);
|
|
1434
|
-
if (!/^-?(\d+(\.\d*)?|\.\d+)$/.test(s)) return null;
|
|
1435
|
-
return s;
|
|
1436
|
-
}
|
|
1437
|
-
function shouldRoundUp(negative, lastKeptDigit, firstDiscarded, hasMoreNonZeroAfterFirst, mode) {
|
|
1438
|
-
switch (mode) {
|
|
1439
|
-
case "up":
|
|
1440
|
-
return true;
|
|
1441
|
-
case "down":
|
|
1442
|
-
return false;
|
|
1443
|
-
case "ceil":
|
|
1444
|
-
return !negative;
|
|
1445
|
-
case "floor":
|
|
1446
|
-
return negative;
|
|
1447
|
-
case "half-up":
|
|
1448
|
-
return firstDiscarded >= 5;
|
|
1449
|
-
case "half-down":
|
|
1450
|
-
return firstDiscarded > 5 || firstDiscarded === 5 && hasMoreNonZeroAfterFirst;
|
|
1451
|
-
case "half-even":
|
|
1452
|
-
if (firstDiscarded > 5) return true;
|
|
1453
|
-
if (firstDiscarded < 5) return false;
|
|
1454
|
-
return hasMoreNonZeroAfterFirst || lastKeptDigit % 2 === 1;
|
|
1455
|
-
}
|
|
1456
|
-
}
|
|
1457
|
-
function parseToScaledInt(input, scale, rounding) {
|
|
1458
|
-
const canonical = toCanonicalDecimalString(input);
|
|
1459
|
-
if (canonical === null) return { ok: false, reason: "nonfinite" };
|
|
1460
|
-
const negative = canonical.startsWith("-");
|
|
1461
|
-
const unsigned = negative ? canonical.slice(1) : canonical;
|
|
1462
|
-
const dot = unsigned.indexOf(".");
|
|
1463
|
-
const intPart = dot === -1 ? unsigned : unsigned.slice(0, dot);
|
|
1464
|
-
const fracPart = dot === -1 ? "" : unsigned.slice(dot + 1);
|
|
1465
|
-
const intDigits = intPart === "" ? "0" : intPart;
|
|
1466
|
-
if (fracPart.length <= scale) {
|
|
1467
|
-
const keep2 = fracPart.padEnd(scale, "0");
|
|
1468
|
-
const magnitude2 = BigInt(intDigits + keep2);
|
|
1469
|
-
return { ok: true, value: negative && magnitude2 !== 0n ? -magnitude2 : magnitude2 };
|
|
1470
|
-
}
|
|
1471
|
-
const keep = fracPart.slice(0, scale);
|
|
1472
|
-
const tail = fracPart.slice(scale);
|
|
1473
|
-
const magnitudeDigits = intDigits + keep;
|
|
1474
|
-
let magnitude = BigInt(magnitudeDigits);
|
|
1475
|
-
if (/^0+$/.test(tail)) {
|
|
1476
|
-
return { ok: true, value: negative && magnitude !== 0n ? -magnitude : magnitude };
|
|
1477
|
-
}
|
|
1478
|
-
if (rounding === void 0) return { ok: false, reason: "precision" };
|
|
1479
|
-
const lastKeptDigit = Number(magnitudeDigits[magnitudeDigits.length - 1]);
|
|
1480
|
-
const firstDiscarded = Number(tail[0]);
|
|
1481
|
-
const hasMoreNonZeroAfterFirst = /[1-9]/.test(tail.slice(1));
|
|
1482
|
-
if (shouldRoundUp(negative, lastKeptDigit, firstDiscarded, hasMoreNonZeroAfterFirst, rounding)) {
|
|
1483
|
-
magnitude += 1n;
|
|
1484
|
-
}
|
|
1485
|
-
return { ok: true, value: negative && magnitude !== 0n ? -magnitude : magnitude };
|
|
1486
|
-
}
|
|
1487
|
-
function decimalScaleOf(input) {
|
|
1488
|
-
const s = toCanonicalDecimalString(input);
|
|
1489
|
-
if (s === null) return null;
|
|
1490
|
-
const dot = s.indexOf(".");
|
|
1491
|
-
return dot === -1 ? 0 : s.length - dot - 1;
|
|
1492
|
-
}
|
|
1493
|
-
function rescaleScaledInt(value, fromScale, toScale, rounding = "half-up") {
|
|
1494
|
-
if (toScale >= fromScale) return value * 10n ** BigInt(toScale - fromScale);
|
|
1495
|
-
const drop = fromScale - toScale;
|
|
1496
|
-
const negative = value < 0n;
|
|
1497
|
-
const absStr = (negative ? -value : value).toString().padStart(drop + 1, "0");
|
|
1498
|
-
const keptStr = absStr.slice(0, absStr.length - drop);
|
|
1499
|
-
const tail = absStr.slice(absStr.length - drop);
|
|
1500
|
-
let magnitude = BigInt(keptStr);
|
|
1501
|
-
if (!/^0+$/.test(tail)) {
|
|
1502
|
-
const lastKeptDigit = Number(keptStr[keptStr.length - 1]);
|
|
1503
|
-
const firstDiscarded = Number(tail[0]);
|
|
1504
|
-
const hasMoreNonZeroAfterFirst = /[1-9]/.test(tail.slice(1));
|
|
1505
|
-
if (shouldRoundUp(negative, lastKeptDigit, firstDiscarded, hasMoreNonZeroAfterFirst, rounding)) {
|
|
1506
|
-
magnitude += 1n;
|
|
1507
|
-
}
|
|
1508
|
-
}
|
|
1509
|
-
return negative && magnitude !== 0n ? -magnitude : magnitude;
|
|
1510
|
-
}
|
|
1511
|
-
function formatScaledInt(value, scale) {
|
|
1512
|
-
const negative = value < 0n;
|
|
1513
|
-
const abs = (negative ? -value : value).toString();
|
|
1514
|
-
if (scale === 0) return (negative ? "-" : "") + abs;
|
|
1515
|
-
const padded = abs.padStart(scale + 1, "0");
|
|
1516
|
-
const cut = padded.length - scale;
|
|
1517
|
-
const intPart = padded.slice(0, cut);
|
|
1518
|
-
const fracPart = padded.slice(cut);
|
|
1519
|
-
return (negative ? "-" : "") + intPart + "." + fracPart;
|
|
1520
|
-
}
|
|
1521
|
-
|
|
1522
|
-
// src/via/money/paths.ts
|
|
1523
|
-
var SEGMENT_RE = /^(\*|[^.[\]*]+)(\[\])?$/;
|
|
1524
|
-
var parseCache = /* @__PURE__ */ new Map();
|
|
1525
|
-
function parseMoneyPath(path) {
|
|
1526
|
-
const cached = parseCache.get(path);
|
|
1527
|
-
if (cached) return cached;
|
|
1528
|
-
if (typeof path !== "string" || path.length === 0) {
|
|
1529
|
-
throw new ValidationError("moneyFields: path must be a non-empty string");
|
|
1530
|
-
}
|
|
1531
|
-
const segments = [];
|
|
1532
|
-
for (const part of path.split(".")) {
|
|
1533
|
-
const m = SEGMENT_RE.exec(part);
|
|
1534
|
-
if (!m) {
|
|
1535
|
-
throw new ValidationError(
|
|
1536
|
-
`moneyFields: invalid path "${path}" \u2014 segment "${part}" must be a key, "key[]", "*", or "*[]"`
|
|
1537
|
-
);
|
|
1538
|
-
}
|
|
1539
|
-
const array = m[2] === "[]";
|
|
1540
|
-
segments.push(
|
|
1541
|
-
m[1] === "*" ? { kind: "wildcard", array } : { kind: "key", key: m[1], array }
|
|
1542
|
-
);
|
|
1543
|
-
}
|
|
1544
|
-
parseCache.set(path, segments);
|
|
1545
|
-
return segments;
|
|
1546
|
-
}
|
|
1547
|
-
function isSimpleMoneyPath(path) {
|
|
1548
|
-
return !path.includes(".") && !path.includes("[") && !path.includes("*");
|
|
1549
|
-
}
|
|
1550
|
-
function validateMoneyFieldPaths(moneyFields) {
|
|
1551
|
-
for (const path of Object.keys(moneyFields)) parseMoneyPath(path);
|
|
1552
|
-
}
|
|
1553
|
-
function transformAtMoneyPath(node, path, segments, index, visit, lenient) {
|
|
1554
|
-
if (node === null || node === void 0) return node;
|
|
1555
|
-
const seg = segments[index];
|
|
1556
|
-
const last = index === segments.length - 1;
|
|
1557
|
-
if (seg.kind === "key") {
|
|
1558
|
-
if (typeof node !== "object" || Array.isArray(node)) {
|
|
1559
|
-
if (lenient) return node;
|
|
1560
|
-
throw new ValidationError(
|
|
1561
|
-
`moneyFields: path "${path}" expected an object at segment "${seg.key}", got ${Array.isArray(node) ? "an array" : typeof node}`
|
|
1562
|
-
);
|
|
1563
|
-
}
|
|
1564
|
-
const obj2 = node;
|
|
1565
|
-
if (!(seg.key in obj2) || obj2[seg.key] === null || obj2[seg.key] === void 0) return node;
|
|
1566
|
-
if (seg.array) {
|
|
1567
|
-
const arr = obj2[seg.key];
|
|
1568
|
-
if (!Array.isArray(arr)) {
|
|
1569
|
-
if (lenient) return node;
|
|
1570
|
-
throw new ValidationError(
|
|
1571
|
-
`moneyFields: path "${path}" declares "${seg.key}[]" but the value is not an array`
|
|
1572
|
-
);
|
|
1573
|
-
}
|
|
1574
|
-
const cloned = [...arr];
|
|
1575
|
-
if (last) {
|
|
1576
|
-
for (let i = 0; i < cloned.length; i++) visit(cloned, i);
|
|
1577
|
-
} else {
|
|
1578
|
-
for (let i = 0; i < cloned.length; i++) {
|
|
1579
|
-
cloned[i] = transformAtMoneyPath(cloned[i], path, segments, index + 1, visit, lenient);
|
|
1580
|
-
}
|
|
1581
|
-
}
|
|
1582
|
-
return { ...obj2, [seg.key]: cloned };
|
|
1583
|
-
}
|
|
1584
|
-
const clone2 = { ...obj2 };
|
|
1585
|
-
if (last) {
|
|
1586
|
-
visit(clone2, seg.key);
|
|
1587
|
-
} else {
|
|
1588
|
-
clone2[seg.key] = transformAtMoneyPath(clone2[seg.key], path, segments, index + 1, visit, lenient);
|
|
1589
|
-
}
|
|
1590
|
-
return clone2;
|
|
1591
|
-
}
|
|
1592
|
-
if (seg.array) {
|
|
1593
|
-
if (!Array.isArray(node)) {
|
|
1594
|
-
if (lenient) return node;
|
|
1595
|
-
throw new ValidationError(`moneyFields: path "${path}" declares "*[]" but the value is not an array`);
|
|
1596
|
-
}
|
|
1597
|
-
const cloned = [...node];
|
|
1598
|
-
if (last) {
|
|
1599
|
-
for (let i = 0; i < cloned.length; i++) visit(cloned, i);
|
|
1600
|
-
} else {
|
|
1601
|
-
for (let i = 0; i < cloned.length; i++) {
|
|
1602
|
-
cloned[i] = transformAtMoneyPath(cloned[i], path, segments, index + 1, visit, lenient);
|
|
1603
|
-
}
|
|
1604
|
-
}
|
|
1605
|
-
return cloned;
|
|
1606
|
-
}
|
|
1607
|
-
if (typeof node !== "object" || Array.isArray(node)) {
|
|
1608
|
-
if (lenient) return node;
|
|
1609
|
-
throw new ValidationError(
|
|
1610
|
-
`moneyFields: path "${path}" applies "*" to a non-object (${Array.isArray(node) ? 'array \u2014 use "*[]"' : typeof node})`
|
|
1611
|
-
);
|
|
1612
|
-
}
|
|
1613
|
-
const obj = node;
|
|
1614
|
-
const clone = { ...obj };
|
|
1615
|
-
for (const key of Object.keys(obj)) {
|
|
1616
|
-
const v = clone[key];
|
|
1617
|
-
if (v === null || v === void 0) continue;
|
|
1618
|
-
if (last) visit(clone, key);
|
|
1619
|
-
else clone[key] = transformAtMoneyPath(v, path, segments, index + 1, visit, lenient);
|
|
1620
|
-
}
|
|
1621
|
-
return clone;
|
|
1622
|
-
}
|
|
1623
|
-
|
|
1624
|
-
// src/via/money/normalize.ts
|
|
1625
|
-
function isMoneyValueObject(v) {
|
|
1626
|
-
return typeof v === "object" && v !== null && "currency" in v;
|
|
1627
|
-
}
|
|
1628
|
-
function quantizeAmount(field, input, scale, rounding) {
|
|
1629
|
-
const r = parseToScaledInt(input, scale, rounding);
|
|
1630
|
-
if (!r.ok) {
|
|
1631
|
-
if (r.reason === "precision") throw new MoneyPrecisionError(field, input, scale);
|
|
1632
|
-
throw new TypeError(`money: field "${field}" value ${JSON.stringify(input)} is not a finite decimal`);
|
|
1633
|
-
}
|
|
1634
|
-
return r.value.toString();
|
|
1635
|
-
}
|
|
1636
|
-
function canonicalizeStoredMoney(record, moneyFields) {
|
|
1637
|
-
if (record === null || record === void 0) return record;
|
|
1638
|
-
if (!moneyFields || Object.keys(moneyFields).length === 0) return record;
|
|
1639
|
-
return decodeMoneyFields(record, moneyFields, "raw");
|
|
1640
|
-
}
|
|
1641
|
-
function canonicalizeIncomingMoney(record, moneyFields) {
|
|
1642
|
-
if (!moneyFields || Object.keys(moneyFields).length === 0) return record;
|
|
1643
|
-
try {
|
|
1644
|
-
return decodeMoneyFields(
|
|
1645
|
-
quantizeMoneyFields(record, moneyFields),
|
|
1646
|
-
moneyFields,
|
|
1647
|
-
"raw"
|
|
1648
|
-
);
|
|
1649
|
-
} catch {
|
|
1650
|
-
return record;
|
|
1651
|
-
}
|
|
1652
|
-
}
|
|
1653
|
-
function quantizeValue(field, raw, desc) {
|
|
1654
|
-
if (desc.mode === "fixed") {
|
|
1655
|
-
const currency2 = desc.fixedCurrency;
|
|
1656
|
-
return quantizeAmount(field, raw, desc.scaleFor(currency2), desc.rounding);
|
|
1657
|
-
}
|
|
1658
|
-
let amount;
|
|
1659
|
-
let currency;
|
|
1660
|
-
if (isMoneyValueObject(raw)) {
|
|
1661
|
-
currency = String(raw.currency);
|
|
1662
|
-
amount = raw.amount;
|
|
1663
|
-
} else {
|
|
1664
|
-
const sole = desc.soleCurrency();
|
|
1665
|
-
if (sole === void 0) {
|
|
1666
|
-
throw new TypeError(
|
|
1667
|
-
`money: field "${field}" is multi-currency \u2014 write { amount, currency }, not a bare amount`
|
|
1668
|
-
);
|
|
1669
|
-
}
|
|
1670
|
-
currency = sole;
|
|
1671
|
-
amount = raw;
|
|
1672
|
-
}
|
|
1673
|
-
const scale = desc.scaleFor(currency);
|
|
1674
|
-
return { amount: quantizeAmount(field, amount, scale, desc.rounding), currency };
|
|
1675
|
-
}
|
|
1676
|
-
function quantizeMoneyFields(record, moneyFields) {
|
|
1677
|
-
let out = { ...record };
|
|
1678
|
-
for (const [path, desc] of Object.entries(moneyFields)) {
|
|
1679
|
-
if (isSimpleMoneyPath(path)) {
|
|
1680
|
-
const raw = out[path];
|
|
1681
|
-
if (raw === null || raw === void 0) continue;
|
|
1682
|
-
out[path] = quantizeValue(path, raw, desc);
|
|
1683
|
-
continue;
|
|
1684
|
-
}
|
|
1685
|
-
out = transformAtMoneyPath(
|
|
1686
|
-
out,
|
|
1687
|
-
path,
|
|
1688
|
-
parseMoneyPath(path),
|
|
1689
|
-
0,
|
|
1690
|
-
(container, key) => {
|
|
1691
|
-
const raw = container[key];
|
|
1692
|
-
if (raw === null || raw === void 0) return;
|
|
1693
|
-
container[key] = quantizeValue(path, raw, desc);
|
|
1694
|
-
},
|
|
1695
|
-
/* lenient */
|
|
1696
|
-
false
|
|
1697
|
-
);
|
|
1698
|
-
}
|
|
1699
|
-
return out;
|
|
1700
|
-
}
|
|
1701
|
-
function formatCurrency(decimal, currency, scale, locale) {
|
|
1702
|
-
const fmt = new Intl.NumberFormat(locale, {
|
|
1703
|
-
style: "currency",
|
|
1704
|
-
currency,
|
|
1705
|
-
minimumFractionDigits: scale,
|
|
1706
|
-
maximumFractionDigits: scale
|
|
1707
|
-
});
|
|
1708
|
-
return fmt.format(decimal);
|
|
1709
|
-
}
|
|
1710
|
-
function moneyScaledValue(stored, desc) {
|
|
1711
|
-
let raw;
|
|
1712
|
-
if (desc.mode === "fixed") {
|
|
1713
|
-
raw = stored;
|
|
1714
|
-
} else {
|
|
1715
|
-
if (!isMoneyValueObject(stored)) return null;
|
|
1716
|
-
raw = stored.amount;
|
|
1717
|
-
}
|
|
1718
|
-
if (typeof raw !== "string" && typeof raw !== "number") return null;
|
|
1719
|
-
try {
|
|
1720
|
-
return BigInt(String(raw));
|
|
1721
|
-
} catch {
|
|
1722
|
-
return null;
|
|
1723
|
-
}
|
|
1724
|
-
}
|
|
1725
|
-
function canonicalizeMoneyIndexKey(field, rawValue, moneyFields) {
|
|
1726
|
-
const desc = moneyFields[field];
|
|
1727
|
-
if (!desc || desc.mode !== "fixed") return void 0;
|
|
1728
|
-
return moneyScaledValue(rawValue, desc)?.toString();
|
|
1729
|
-
}
|
|
1730
|
-
function decodeValue(stored, desc) {
|
|
1731
|
-
let currency;
|
|
1732
|
-
let scaledIntString;
|
|
1733
|
-
if (desc.mode === "fixed") {
|
|
1734
|
-
if (typeof stored !== "string" && typeof stored !== "number") return null;
|
|
1735
|
-
currency = desc.fixedCurrency;
|
|
1736
|
-
scaledIntString = String(stored);
|
|
1737
|
-
} else {
|
|
1738
|
-
if (!isMoneyValueObject(stored)) return null;
|
|
1739
|
-
const amount = stored.amount;
|
|
1740
|
-
if (typeof stored.currency !== "string" || typeof amount !== "string" && typeof amount !== "number") return null;
|
|
1741
|
-
currency = stored.currency;
|
|
1742
|
-
scaledIntString = String(amount);
|
|
1743
|
-
}
|
|
1744
|
-
const scale = desc.scaleFor(currency);
|
|
1745
|
-
let decimal;
|
|
1746
|
-
try {
|
|
1747
|
-
decimal = formatScaledInt(BigInt(scaledIntString), scale);
|
|
1748
|
-
} catch {
|
|
1749
|
-
return null;
|
|
1750
|
-
}
|
|
631
|
+
function withDeferredNumbering(opts) {
|
|
1751
632
|
return {
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
633
|
+
series: opts.series,
|
|
634
|
+
collection: opts.collection,
|
|
635
|
+
field: opts.field,
|
|
636
|
+
settleWindowMs: opts.settleWindowMs ?? 0
|
|
1756
637
|
};
|
|
1757
638
|
}
|
|
1758
|
-
function presentVirtualMoneyFields(record, moneyFields, virtualMoney, locale) {
|
|
1759
|
-
let out = record;
|
|
1760
|
-
const format = locale !== "raw";
|
|
1761
|
-
const fmtLocale = typeof locale === "string" && locale !== "raw" ? locale : "en-US";
|
|
1762
|
-
for (const field of virtualMoney) {
|
|
1763
|
-
const desc = moneyFields[field];
|
|
1764
|
-
if (!desc || desc.mode !== "fixed") continue;
|
|
1765
|
-
const raw = out[field];
|
|
1766
|
-
if (raw === null || raw === void 0) continue;
|
|
1767
|
-
if (typeof raw !== "number" && typeof raw !== "string") continue;
|
|
1768
|
-
const currency = desc.fixedCurrency;
|
|
1769
|
-
const scale = desc.scaleFor(currency);
|
|
1770
|
-
const r = parseToScaledInt(raw, scale, desc.rounding);
|
|
1771
|
-
if (!r.ok) continue;
|
|
1772
|
-
if (out === record) out = { ...record };
|
|
1773
|
-
const decimal = formatScaledInt(r.value, scale);
|
|
1774
|
-
out[field] = decimal;
|
|
1775
|
-
if (format) {
|
|
1776
|
-
out[`${field}Formatted`] = formatCurrency(decimal, currency, scale, fmtLocale);
|
|
1777
|
-
out[`${field}Number`] = Number(decimal);
|
|
1778
|
-
}
|
|
1779
|
-
}
|
|
1780
|
-
return out;
|
|
1781
|
-
}
|
|
1782
|
-
function decodeMoneyFields(record, moneyFields, locale) {
|
|
1783
|
-
let out = { ...record };
|
|
1784
|
-
const format = locale !== "raw";
|
|
1785
|
-
const fmtLocale = typeof locale === "string" && locale !== "raw" ? locale : "en-US";
|
|
1786
|
-
for (const [path, desc] of Object.entries(moneyFields)) {
|
|
1787
|
-
if (isSimpleMoneyPath(path)) {
|
|
1788
|
-
const stored = out[path];
|
|
1789
|
-
if (stored === null || stored === void 0) continue;
|
|
1790
|
-
const r = decodeValue(stored, desc);
|
|
1791
|
-
if (r === null) continue;
|
|
1792
|
-
out[path] = r.decoded;
|
|
1793
|
-
if (format) {
|
|
1794
|
-
out[`${path}Formatted`] = formatCurrency(r.decimal, r.currency, r.scale, fmtLocale);
|
|
1795
|
-
out[`${path}Number`] = Number(r.decimal);
|
|
1796
|
-
}
|
|
1797
|
-
continue;
|
|
1798
|
-
}
|
|
1799
|
-
out = transformAtMoneyPath(
|
|
1800
|
-
out,
|
|
1801
|
-
path,
|
|
1802
|
-
parseMoneyPath(path),
|
|
1803
|
-
0,
|
|
1804
|
-
(container, key) => {
|
|
1805
|
-
const stored = container[key];
|
|
1806
|
-
if (stored === null || stored === void 0) return;
|
|
1807
|
-
const r = decodeValue(stored, desc);
|
|
1808
|
-
if (r === null) return;
|
|
1809
|
-
container[key] = r.decoded;
|
|
1810
|
-
if (format && typeof key === "string" && !Array.isArray(container)) {
|
|
1811
|
-
container[`${key}Formatted`] = formatCurrency(r.decimal, r.currency, r.scale, fmtLocale);
|
|
1812
|
-
container[`${key}Number`] = Number(r.decimal);
|
|
1813
|
-
}
|
|
1814
|
-
},
|
|
1815
|
-
/* lenient */
|
|
1816
|
-
true
|
|
1817
|
-
);
|
|
1818
|
-
}
|
|
1819
|
-
return out;
|
|
1820
|
-
}
|
|
1821
|
-
|
|
1822
|
-
// src/via/money/where.ts
|
|
1823
|
-
function isMoneyValueObject2(v) {
|
|
1824
|
-
return typeof v === "object" && v !== null && "currency" in v;
|
|
1825
|
-
}
|
|
1826
|
-
function parseOperand(field, raw, desc) {
|
|
1827
|
-
let amount;
|
|
1828
|
-
let currency;
|
|
1829
|
-
if (desc.mode === "fixed") {
|
|
1830
|
-
currency = desc.fixedCurrency;
|
|
1831
|
-
amount = raw;
|
|
1832
|
-
} else if (isMoneyValueObject2(raw)) {
|
|
1833
|
-
currency = String(raw.currency);
|
|
1834
|
-
amount = raw.amount;
|
|
1835
|
-
} else {
|
|
1836
|
-
const sole = desc.soleCurrency();
|
|
1837
|
-
if (sole === void 0) {
|
|
1838
|
-
throw new MoneyUnsupportedError(
|
|
1839
|
-
`where("${field}"): field is multi-currency \u2014 compare against { amount, currency }, not a bare amount`
|
|
1840
|
-
);
|
|
1841
|
-
}
|
|
1842
|
-
currency = sole;
|
|
1843
|
-
amount = raw;
|
|
1844
|
-
}
|
|
1845
|
-
if (typeof amount !== "number" && typeof amount !== "string") {
|
|
1846
|
-
throw new MoneyUnsupportedError(
|
|
1847
|
-
`where("${field}"): operand ${JSON.stringify(raw)} is not a money amount`
|
|
1848
|
-
);
|
|
1849
|
-
}
|
|
1850
|
-
const r = parseToScaledInt(amount, desc.scaleFor(currency), desc.rounding);
|
|
1851
|
-
if (!r.ok) {
|
|
1852
|
-
throw new MoneyUnsupportedError(
|
|
1853
|
-
`where("${field}"): operand ${JSON.stringify(amount)} is not a finite decimal`
|
|
1854
|
-
);
|
|
1855
|
-
}
|
|
1856
|
-
return { scaled: r.value.toString(), currency };
|
|
1857
|
-
}
|
|
1858
|
-
function moneyFieldClause(field, op, value, desc) {
|
|
1859
|
-
switch (op) {
|
|
1860
|
-
case "==":
|
|
1861
|
-
case "!=":
|
|
1862
|
-
case "<":
|
|
1863
|
-
case "<=":
|
|
1864
|
-
case ">":
|
|
1865
|
-
case ">=": {
|
|
1866
|
-
const e = parseOperand(field, value, desc);
|
|
1867
|
-
return { mode: desc.mode, entries: [e] };
|
|
1868
|
-
}
|
|
1869
|
-
case "between": {
|
|
1870
|
-
if (!Array.isArray(value) || value.length !== 2) {
|
|
1871
|
-
throw new MoneyUnsupportedError(`where("${field}"): 'between' needs a [lo, hi] tuple`);
|
|
1872
|
-
}
|
|
1873
|
-
const lo = parseOperand(field, value[0], desc);
|
|
1874
|
-
const hi = parseOperand(field, value[1], desc);
|
|
1875
|
-
if (lo.currency !== hi.currency) {
|
|
1876
|
-
throw new MoneyUnsupportedError(
|
|
1877
|
-
`where("${field}"): 'between' bounds mix currencies (${lo.currency} vs ${hi.currency})`
|
|
1878
|
-
);
|
|
1879
|
-
}
|
|
1880
|
-
return { mode: desc.mode, entries: [lo, hi] };
|
|
1881
|
-
}
|
|
1882
|
-
case "in": {
|
|
1883
|
-
if (!Array.isArray(value)) {
|
|
1884
|
-
throw new MoneyUnsupportedError(`where("${field}"): 'in' needs an array of amounts`);
|
|
1885
|
-
}
|
|
1886
|
-
return { mode: desc.mode, entries: value.map((v) => parseOperand(field, v, desc)) };
|
|
1887
|
-
}
|
|
1888
|
-
default:
|
|
1889
|
-
throw new MoneyUnsupportedError(
|
|
1890
|
-
`where("${field}"): operator '${op}' is not supported on a money field`
|
|
1891
|
-
);
|
|
1892
|
-
}
|
|
1893
|
-
}
|
|
1894
|
-
function moneyIndexProbe(op, payload) {
|
|
1895
|
-
if (payload.mode !== "fixed") return void 0;
|
|
1896
|
-
if (op === "==") return payload.entries[0]?.scaled;
|
|
1897
|
-
if (op === "in") return payload.entries.map((e) => e.scaled);
|
|
1898
|
-
return void 0;
|
|
1899
|
-
}
|
|
1900
|
-
function readStored(actual, operand) {
|
|
1901
|
-
let amount;
|
|
1902
|
-
let currency;
|
|
1903
|
-
if (operand.mode === "fixed") {
|
|
1904
|
-
if (typeof actual !== "string" && typeof actual !== "number") return null;
|
|
1905
|
-
amount = actual;
|
|
1906
|
-
currency = operand.entries[0]?.currency ?? "";
|
|
1907
|
-
} else {
|
|
1908
|
-
if (!isMoneyValueObject2(actual)) return null;
|
|
1909
|
-
if (typeof actual.currency !== "string") return null;
|
|
1910
|
-
amount = actual.amount;
|
|
1911
|
-
currency = actual.currency;
|
|
1912
|
-
}
|
|
1913
|
-
if (typeof amount !== "string" && typeof amount !== "number") return null;
|
|
1914
|
-
try {
|
|
1915
|
-
return { scaled: BigInt(amount).toString(), currency };
|
|
1916
|
-
} catch {
|
|
1917
|
-
return null;
|
|
1918
|
-
}
|
|
1919
|
-
}
|
|
1920
|
-
function evaluateMoneyClause(actual, op, operand) {
|
|
1921
|
-
const stored = readStored(actual, operand);
|
|
1922
|
-
if (stored === null) return op === "!=";
|
|
1923
|
-
const a = BigInt(stored.scaled);
|
|
1924
|
-
if (op === "in") {
|
|
1925
|
-
return operand.entries.some(
|
|
1926
|
-
(e2) => e2.currency === stored.currency && BigInt(e2.scaled) === a
|
|
1927
|
-
);
|
|
1928
|
-
}
|
|
1929
|
-
if (op === "between") {
|
|
1930
|
-
const [lo, hi] = operand.entries;
|
|
1931
|
-
if (!lo || !hi || lo.currency !== stored.currency) return false;
|
|
1932
|
-
return a >= BigInt(lo.scaled) && a <= BigInt(hi.scaled);
|
|
1933
|
-
}
|
|
1934
|
-
const e = operand.entries[0];
|
|
1935
|
-
if (!e) return false;
|
|
1936
|
-
if (e.currency !== stored.currency) return op === "!=";
|
|
1937
|
-
const b = BigInt(e.scaled);
|
|
1938
|
-
switch (op) {
|
|
1939
|
-
case "==":
|
|
1940
|
-
return a === b;
|
|
1941
|
-
case "!=":
|
|
1942
|
-
return a !== b;
|
|
1943
|
-
case "<":
|
|
1944
|
-
return a < b;
|
|
1945
|
-
case "<=":
|
|
1946
|
-
return a <= b;
|
|
1947
|
-
case ">":
|
|
1948
|
-
return a > b;
|
|
1949
|
-
case ">=":
|
|
1950
|
-
return a >= b;
|
|
1951
|
-
default:
|
|
1952
|
-
return false;
|
|
1953
|
-
}
|
|
1954
|
-
}
|
|
1955
|
-
|
|
1956
|
-
// src/via/money/money-reducer.ts
|
|
1957
|
-
function toScaledIntFromAny(v, scale) {
|
|
1958
|
-
if (typeof v === "bigint") return v;
|
|
1959
|
-
if (typeof v === "number") {
|
|
1960
|
-
const r = parseToScaledInt(v, scale);
|
|
1961
|
-
return r.ok ? r.value : null;
|
|
1962
|
-
}
|
|
1963
|
-
if (typeof v === "string") {
|
|
1964
|
-
if (!v.includes(".")) {
|
|
1965
|
-
try {
|
|
1966
|
-
return BigInt(v);
|
|
1967
|
-
} catch {
|
|
1968
|
-
return null;
|
|
1969
|
-
}
|
|
1970
|
-
}
|
|
1971
|
-
const r = parseToScaledInt(v, scale);
|
|
1972
|
-
return r.ok ? r.value : null;
|
|
1973
|
-
}
|
|
1974
|
-
return null;
|
|
1975
|
-
}
|
|
1976
|
-
function readMoney(record, field, desc) {
|
|
1977
|
-
const raw = readPath(record, field);
|
|
1978
|
-
if (raw === null || raw === void 0) return null;
|
|
1979
|
-
if (desc.mode === "fixed") {
|
|
1980
|
-
const cur = desc.fixedCurrency;
|
|
1981
|
-
const value2 = toScaledIntFromAny(raw, desc.scaleFor(cur));
|
|
1982
|
-
return value2 === null ? null : { currency: cur, value: value2 };
|
|
1983
|
-
}
|
|
1984
|
-
if (typeof raw !== "object") return null;
|
|
1985
|
-
const o = raw;
|
|
1986
|
-
if (typeof o.currency !== "string") return null;
|
|
1987
|
-
const scale = desc.allows(o.currency) ? desc.scaleFor(o.currency) : 0;
|
|
1988
|
-
const value = toScaledIntFromAny(o.amount, scale);
|
|
1989
|
-
return value === null ? null : { currency: o.currency, value };
|
|
1990
|
-
}
|
|
1991
|
-
function targetScaleFor(desc, currency) {
|
|
1992
|
-
if (desc.allows(currency)) return desc.scaleFor(currency);
|
|
1993
|
-
const s = scaleForCurrency(currency);
|
|
1994
|
-
if (s === null) {
|
|
1995
|
-
throw new Error(`money: cannot determine scale for conversion target "${currency}"`);
|
|
1996
|
-
}
|
|
1997
|
-
return s;
|
|
1998
|
-
}
|
|
1999
|
-
function parseRate(rate) {
|
|
2000
|
-
const s = String(rate).trim();
|
|
2001
|
-
const neg = s.startsWith("-");
|
|
2002
|
-
const body = neg ? s.slice(1) : s;
|
|
2003
|
-
const dot = body.indexOf(".");
|
|
2004
|
-
const intPart = dot === -1 ? body : body.slice(0, dot);
|
|
2005
|
-
const fracPart = dot === -1 ? "" : body.slice(dot + 1);
|
|
2006
|
-
const int = BigInt((intPart === "" ? "0" : intPart) + fracPart);
|
|
2007
|
-
return { int: neg ? -int : int, scale: fracPart.length };
|
|
2008
|
-
}
|
|
2009
|
-
function divRoundHalfEven(n, d) {
|
|
2010
|
-
const q = n / d;
|
|
2011
|
-
const r = n % d;
|
|
2012
|
-
const twiceR = (r < 0n ? -r : r) * 2n;
|
|
2013
|
-
if (twiceR < d) return q;
|
|
2014
|
-
if (twiceR > d) return q + (n < 0n ? -1n : 1n);
|
|
2015
|
-
return q % 2n === 0n ? q : q + (n < 0n ? -1n : 1n);
|
|
2016
|
-
}
|
|
2017
|
-
function convertScaled(value, srcScale, rate, targetScale) {
|
|
2018
|
-
const { int: rateInt, scale: rateScale } = parseRate(rate);
|
|
2019
|
-
const product = value * rateInt;
|
|
2020
|
-
const curScale = srcScale + rateScale;
|
|
2021
|
-
if (curScale === targetScale) return product;
|
|
2022
|
-
if (curScale < targetScale) return product * 10n ** BigInt(targetScale - curScale);
|
|
2023
|
-
return divRoundHalfEven(product, 10n ** BigInt(curScale - targetScale));
|
|
2024
|
-
}
|
|
2025
|
-
function finalizeSum(state, desc, convertTo, fx) {
|
|
2026
|
-
if (convertTo !== void 0) {
|
|
2027
|
-
if (fx === void 0) {
|
|
2028
|
-
throw new Error(`money: sum convertTo "${convertTo}" requires an fx rate map`);
|
|
2029
|
-
}
|
|
2030
|
-
const targetScale = targetScaleFor(desc, convertTo);
|
|
2031
|
-
let total = 0n;
|
|
2032
|
-
for (const [cur, v] of state) {
|
|
2033
|
-
if (cur === convertTo) {
|
|
2034
|
-
total += convertScaled(v, desc.scaleFor(cur), 1, targetScale);
|
|
2035
|
-
continue;
|
|
2036
|
-
}
|
|
2037
|
-
const rate = fx[`${cur}->${convertTo}`];
|
|
2038
|
-
if (rate === void 0) {
|
|
2039
|
-
throw new Error(`money: no fx rate for "${cur}->${convertTo}"`);
|
|
2040
|
-
}
|
|
2041
|
-
total += convertScaled(v, desc.scaleFor(cur), rate, targetScale);
|
|
2042
|
-
}
|
|
2043
|
-
return formatScaledInt(total, targetScale);
|
|
2044
|
-
}
|
|
2045
|
-
if (desc.mode === "fixed") {
|
|
2046
|
-
const cur = desc.fixedCurrency;
|
|
2047
|
-
return formatScaledInt(state.get(cur) ?? 0n, desc.scaleFor(cur));
|
|
2048
|
-
}
|
|
2049
|
-
const out = {};
|
|
2050
|
-
for (const [cur, v] of state) out[cur] = formatScaledInt(v, desc.scaleFor(cur));
|
|
2051
|
-
return out;
|
|
2052
|
-
}
|
|
2053
|
-
function moneySumReducer(field, desc, convertTo, fx) {
|
|
2054
|
-
return {
|
|
2055
|
-
op: "sum",
|
|
2056
|
-
field,
|
|
2057
|
-
init: () => /* @__PURE__ */ new Map(),
|
|
2058
|
-
step: (state, record) => {
|
|
2059
|
-
const m = readMoney(record, field, desc);
|
|
2060
|
-
if (m) state.set(m.currency, (state.get(m.currency) ?? 0n) + m.value);
|
|
2061
|
-
return state;
|
|
2062
|
-
},
|
|
2063
|
-
remove: (state, record) => {
|
|
2064
|
-
const m = readMoney(record, field, desc);
|
|
2065
|
-
if (m) state.set(m.currency, (state.get(m.currency) ?? 0n) - m.value);
|
|
2066
|
-
return state;
|
|
2067
|
-
},
|
|
2068
|
-
finalize: (state) => finalizeSum(state, desc, convertTo, fx)
|
|
2069
|
-
};
|
|
2070
|
-
}
|
|
2071
|
-
function extremum(values, op) {
|
|
2072
|
-
let out = values[0];
|
|
2073
|
-
for (let i = 1; i < values.length; i++) {
|
|
2074
|
-
const v = values[i];
|
|
2075
|
-
if (op === "min" ? v < out : v > out) out = v;
|
|
2076
|
-
}
|
|
2077
|
-
return out;
|
|
2078
|
-
}
|
|
2079
|
-
function moneyMinMaxReducer(op, field, desc) {
|
|
2080
|
-
return {
|
|
2081
|
-
op,
|
|
2082
|
-
field,
|
|
2083
|
-
init: () => /* @__PURE__ */ new Map(),
|
|
2084
|
-
step: (state, record) => {
|
|
2085
|
-
const m = readMoney(record, field, desc);
|
|
2086
|
-
if (m) {
|
|
2087
|
-
const arr = state.get(m.currency);
|
|
2088
|
-
if (arr) arr.push(m.value);
|
|
2089
|
-
else state.set(m.currency, [m.value]);
|
|
2090
|
-
}
|
|
2091
|
-
return state;
|
|
2092
|
-
},
|
|
2093
|
-
remove: (state, record) => {
|
|
2094
|
-
const m = readMoney(record, field, desc);
|
|
2095
|
-
if (m) {
|
|
2096
|
-
const arr = state.get(m.currency);
|
|
2097
|
-
if (arr) {
|
|
2098
|
-
const idx = arr.indexOf(m.value);
|
|
2099
|
-
if (idx >= 0) arr.splice(idx, 1);
|
|
2100
|
-
}
|
|
2101
|
-
}
|
|
2102
|
-
return state;
|
|
2103
|
-
},
|
|
2104
|
-
finalize: (state) => {
|
|
2105
|
-
if (desc.mode === "fixed") {
|
|
2106
|
-
const cur = desc.fixedCurrency;
|
|
2107
|
-
const arr = state.get(cur);
|
|
2108
|
-
if (!arr || arr.length === 0) return null;
|
|
2109
|
-
return formatScaledInt(extremum(arr, op), desc.scaleFor(cur));
|
|
2110
|
-
}
|
|
2111
|
-
const out = {};
|
|
2112
|
-
for (const [cur, arr] of state) {
|
|
2113
|
-
if (arr.length > 0) out[cur] = formatScaledInt(extremum(arr, op), desc.scaleFor(cur));
|
|
2114
|
-
}
|
|
2115
|
-
return out;
|
|
2116
|
-
}
|
|
2117
|
-
};
|
|
2118
|
-
}
|
|
2119
|
-
function wrapMoneyReducers(spec, moneyFields) {
|
|
2120
|
-
let changed = false;
|
|
2121
|
-
const out = {};
|
|
2122
|
-
for (const [key, reducer] of Object.entries(spec)) {
|
|
2123
|
-
const field = reducer.field;
|
|
2124
|
-
const desc = field ? moneyFields[field] : void 0;
|
|
2125
|
-
if (desc && reducer.op === "avg") {
|
|
2126
|
-
throw new MoneyUnsupportedError(
|
|
2127
|
-
field,
|
|
2128
|
-
`avg() is not supported on money field "${field}" in v1 \u2014 use sum() and count() and divide at the boundary.`
|
|
2129
|
-
);
|
|
2130
|
-
}
|
|
2131
|
-
if (desc && (reducer.op === "sum" || reducer.op === "min" || reducer.op === "max")) {
|
|
2132
|
-
changed = true;
|
|
2133
|
-
out[key] = reducer.op === "sum" ? moneySumReducer(field, desc, reducer.convertTo, reducer.fx) : moneyMinMaxReducer(reducer.op, field, desc);
|
|
2134
|
-
} else {
|
|
2135
|
-
out[key] = reducer;
|
|
2136
|
-
}
|
|
2137
|
-
}
|
|
2138
|
-
return changed ? out : spec;
|
|
2139
|
-
}
|
|
2140
|
-
|
|
2141
|
-
// src/via/money/binding.ts
|
|
2142
|
-
function moneyBinding(moneyFields, virtualMoneyFields) {
|
|
2143
|
-
validateMoneyFieldPaths(moneyFields);
|
|
2144
|
-
const hasVirtualMoney = virtualMoneyFields !== void 0 && virtualMoneyFields.size > 0;
|
|
2145
|
-
const ordinaryPresentFields = hasVirtualMoney ? Object.fromEntries(Object.entries(moneyFields).filter(([f]) => !virtualMoneyFields.has(f))) : moneyFields;
|
|
2146
|
-
return {
|
|
2147
|
-
brand: "money",
|
|
2148
|
-
posture: { encryptedAtRest: "envelope", queryable: "ordered", exportable: true, forgettable: true },
|
|
2149
|
-
covers: (field) => field in moneyFields,
|
|
2150
|
-
ingest: (r) => canonicalizeIncomingMoney(r, moneyFields),
|
|
2151
|
-
canonicalizeStored: (r) => canonicalizeStoredMoney(r, moneyFields),
|
|
2152
|
-
encodeWrite: (r) => quantizeMoneyFields(r, moneyFields),
|
|
2153
|
-
present: (r, ctx) => decodeMoneyFields(r, ordinaryPresentFields, typeof ctx.locale === "string" ? ctx.locale : void 0),
|
|
2154
|
-
...hasVirtualMoney ? {
|
|
2155
|
-
presentLate: (r, ctx) => presentVirtualMoneyFields(r, moneyFields, virtualMoneyFields, typeof ctx.locale === "string" ? ctx.locale : void 0)
|
|
2156
|
-
} : {},
|
|
2157
|
-
buildClause: (field, op, value) => {
|
|
2158
|
-
const desc = moneyFields[field];
|
|
2159
|
-
if (!desc) return void 0;
|
|
2160
|
-
return moneyFieldClause(field, op, value, desc);
|
|
2161
|
-
},
|
|
2162
|
-
evaluateClause: (actual, op, payload) => evaluateMoneyClause(actual, op, payload),
|
|
2163
|
-
indexProbe: (op, payload) => moneyIndexProbe(op, payload),
|
|
2164
|
-
canonicalizeIndexKey: (field, rawValue) => canonicalizeMoneyIndexKey(field, rawValue, moneyFields),
|
|
2165
|
-
decodeResults: (r) => decodeMoneyFields(r, moneyFields, "raw"),
|
|
2166
|
-
compareForOrder: (field, a, b) => {
|
|
2167
|
-
const desc = moneyFields[field];
|
|
2168
|
-
if (!desc) return void 0;
|
|
2169
|
-
const av = moneyScaledValue(a, desc);
|
|
2170
|
-
const bv = moneyScaledValue(b, desc);
|
|
2171
|
-
if (av === null) return bv === null ? 0 : 1;
|
|
2172
|
-
if (bv === null) return -1;
|
|
2173
|
-
return av < bv ? -1 : av > bv ? 1 : 0;
|
|
2174
|
-
},
|
|
2175
|
-
wrapReducers: (spec) => wrapMoneyReducers(spec, moneyFields)
|
|
2176
|
-
};
|
|
2177
|
-
}
|
|
2178
|
-
function linkMoneyVia() {
|
|
2179
|
-
installViaBinder("money", (cfg) => {
|
|
2180
|
-
const c = cfg;
|
|
2181
|
-
return moneyBinding(c.moneyFields, c.virtualMoneyFields);
|
|
2182
|
-
});
|
|
2183
|
-
}
|
|
2184
|
-
|
|
2185
|
-
// src/via/money/descriptor.ts
|
|
2186
|
-
var MoneyPrecisionError = class extends NoydbError {
|
|
2187
|
-
constructor(field, value, scale) {
|
|
2188
|
-
super(
|
|
2189
|
-
"MONEY_PRECISION",
|
|
2190
|
-
`money: value ${JSON.stringify(value)} for field "${field}" exceeds scale ${scale} and no rounding mode is configured`
|
|
2191
|
-
);
|
|
2192
|
-
this.field = field;
|
|
2193
|
-
this.value = value;
|
|
2194
|
-
this.scale = scale;
|
|
2195
|
-
this.name = "MoneyPrecisionError";
|
|
2196
|
-
}
|
|
2197
|
-
field;
|
|
2198
|
-
value;
|
|
2199
|
-
scale;
|
|
2200
|
-
};
|
|
2201
|
-
var MoneyCurrencyError = class extends NoydbError {
|
|
2202
|
-
constructor(currency, reason, field) {
|
|
2203
|
-
super(
|
|
2204
|
-
"MONEY_CURRENCY",
|
|
2205
|
-
reason === "not-allowed" ? `money: currency "${currency}" is not allowed${field ? ` for field "${field}"` : ""}` : `money: no scale known for currency "${currency}"${field ? ` (field "${field}")` : ""} \u2014 pass an explicit scale / scaleOverrides`
|
|
2206
|
-
);
|
|
2207
|
-
this.currency = currency;
|
|
2208
|
-
this.reason = reason;
|
|
2209
|
-
this.field = field;
|
|
2210
|
-
this.name = "MoneyCurrencyError";
|
|
2211
|
-
}
|
|
2212
|
-
currency;
|
|
2213
|
-
reason;
|
|
2214
|
-
field;
|
|
2215
|
-
};
|
|
2216
|
-
var MoneyUnsupportedError = class extends NoydbError {
|
|
2217
|
-
constructor(field, message) {
|
|
2218
|
-
super(
|
|
2219
|
-
"MONEY_UNSUPPORTED",
|
|
2220
|
-
message ?? `money: operation is not supported on field "${field}" \u2014 use sum() and count() and divide at the boundary`
|
|
2221
|
-
);
|
|
2222
|
-
this.field = field;
|
|
2223
|
-
this.name = "MoneyUnsupportedError";
|
|
2224
|
-
}
|
|
2225
|
-
field;
|
|
2226
|
-
};
|
|
2227
|
-
function isMultiOptions(o) {
|
|
2228
|
-
return "currencies" in o;
|
|
2229
|
-
}
|
|
2230
|
-
function money(options) {
|
|
2231
|
-
linkMoneyVia();
|
|
2232
|
-
const hasFixed = "currency" in options;
|
|
2233
|
-
const hasMulti = "currencies" in options;
|
|
2234
|
-
if (hasFixed && hasMulti) {
|
|
2235
|
-
throw new TypeError("money: `currency` and `currencies` are mutually exclusive");
|
|
2236
|
-
}
|
|
2237
|
-
if (!hasFixed && !hasMulti) {
|
|
2238
|
-
throw new TypeError("money: one of `currency` or `currencies` is required");
|
|
2239
|
-
}
|
|
2240
|
-
const rounding = options.rounding;
|
|
2241
|
-
if (isMultiOptions(options)) {
|
|
2242
|
-
const overrides = options.scaleOverrides ?? {};
|
|
2243
|
-
const allowList = options.currencies;
|
|
2244
|
-
const allows = (c) => allowList === "any" ? true : allowList.includes(c);
|
|
2245
|
-
const scaleFor = (c) => {
|
|
2246
|
-
if (!allows(c)) throw new MoneyCurrencyError(c, "not-allowed");
|
|
2247
|
-
const s = overrides[c] ?? scaleForCurrency(c);
|
|
2248
|
-
if (s === null || s === void 0) throw new MoneyCurrencyError(c, "unknown-scale");
|
|
2249
|
-
return s;
|
|
2250
|
-
};
|
|
2251
|
-
if (allowList !== "any") for (const c of allowList) scaleFor(c);
|
|
2252
|
-
const soleCurrency = () => allowList !== "any" && allowList.length === 1 ? allowList[0] : void 0;
|
|
2253
|
-
return {
|
|
2254
|
-
_noydbMoney: true,
|
|
2255
|
-
_viaBrand: "money",
|
|
2256
|
-
mode: "multi",
|
|
2257
|
-
options,
|
|
2258
|
-
rounding,
|
|
2259
|
-
fixedCurrency: void 0,
|
|
2260
|
-
scaleFor,
|
|
2261
|
-
allows,
|
|
2262
|
-
soleCurrency
|
|
2263
|
-
};
|
|
2264
|
-
}
|
|
2265
|
-
const currency = options.currency;
|
|
2266
|
-
const resolvedScale = options.scale ?? scaleForCurrency(currency);
|
|
2267
|
-
if (resolvedScale === null || resolvedScale === void 0) {
|
|
2268
|
-
throw new MoneyCurrencyError(currency, "unknown-scale");
|
|
2269
|
-
}
|
|
2270
|
-
return {
|
|
2271
|
-
_noydbMoney: true,
|
|
2272
|
-
_viaBrand: "money",
|
|
2273
|
-
mode: "fixed",
|
|
2274
|
-
options,
|
|
2275
|
-
rounding,
|
|
2276
|
-
fixedCurrency: currency,
|
|
2277
|
-
scaleFor(c) {
|
|
2278
|
-
if (c !== currency) throw new MoneyCurrencyError(c, "not-allowed");
|
|
2279
|
-
return resolvedScale;
|
|
2280
|
-
},
|
|
2281
|
-
allows: (c) => c === currency,
|
|
2282
|
-
soleCurrency: () => currency
|
|
2283
|
-
};
|
|
2284
|
-
}
|
|
2285
|
-
function isMoneyDescriptor(x) {
|
|
2286
|
-
return typeof x === "object" && x !== null && x._noydbMoney === true;
|
|
2287
|
-
}
|
|
2288
|
-
|
|
2289
|
-
// src/via/money/arith.ts
|
|
2290
|
-
function parseAmount(label, amount, scale, rounding) {
|
|
2291
|
-
const r = parseToScaledInt(amount, scale, rounding);
|
|
2292
|
-
if (!r.ok) {
|
|
2293
|
-
throw new MoneyUnsupportedError(
|
|
2294
|
-
r.reason === "precision" ? `${label}: amount ${JSON.stringify(amount)} has more precision than scale ${scale} and no rounding mode is configured` : `${label}: amount ${JSON.stringify(amount)} is not a finite decimal`
|
|
2295
|
-
);
|
|
2296
|
-
}
|
|
2297
|
-
return r.value;
|
|
2298
|
-
}
|
|
2299
|
-
function resolveScale(label, amount, explicit) {
|
|
2300
|
-
if (explicit !== void 0) {
|
|
2301
|
-
if (!Number.isInteger(explicit) || explicit < 0) {
|
|
2302
|
-
throw new MoneyUnsupportedError(`${label}: scale must be a non-negative integer`);
|
|
2303
|
-
}
|
|
2304
|
-
return explicit;
|
|
2305
|
-
}
|
|
2306
|
-
const inferred = decimalScaleOf(amount);
|
|
2307
|
-
if (inferred === null) {
|
|
2308
|
-
throw new MoneyUnsupportedError(`${label}: amount ${JSON.stringify(amount)} is not a finite decimal`);
|
|
2309
|
-
}
|
|
2310
|
-
return inferred;
|
|
2311
|
-
}
|
|
2312
|
-
function mulRate(amount, rate, opts = {}) {
|
|
2313
|
-
const scale = resolveScale("mulRate", amount, opts.scale);
|
|
2314
|
-
const rounding = opts.rounding ?? "half-up";
|
|
2315
|
-
const a = parseAmount("mulRate", amount, scale, rounding);
|
|
2316
|
-
const rateScale = decimalScaleOf(rate);
|
|
2317
|
-
if (rateScale === null) {
|
|
2318
|
-
throw new MoneyUnsupportedError(`mulRate: rate ${JSON.stringify(rate)} is not a finite decimal`);
|
|
2319
|
-
}
|
|
2320
|
-
const r = parseToScaledInt(rate, rateScale);
|
|
2321
|
-
if (!r.ok) {
|
|
2322
|
-
throw new MoneyUnsupportedError(`mulRate: rate ${JSON.stringify(rate)} is not a finite decimal`);
|
|
2323
|
-
}
|
|
2324
|
-
const product = a * r.value;
|
|
2325
|
-
return formatScaledInt(rescaleScaledInt(product, scale + rateScale, scale, rounding), scale);
|
|
2326
|
-
}
|
|
2327
|
-
function allocate(amount, weights, opts = {}) {
|
|
2328
|
-
if (weights.length === 0) {
|
|
2329
|
-
throw new MoneyUnsupportedError("allocate: weights must not be empty");
|
|
2330
|
-
}
|
|
2331
|
-
const scale = resolveScale("allocate", amount, opts.scale);
|
|
2332
|
-
const a = parseAmount("allocate", amount, scale);
|
|
2333
|
-
let weightScale = 0;
|
|
2334
|
-
for (const w of weights) {
|
|
2335
|
-
const s = decimalScaleOf(w);
|
|
2336
|
-
if (s === null) {
|
|
2337
|
-
throw new MoneyUnsupportedError(`allocate: weight ${JSON.stringify(w)} is not a finite decimal`);
|
|
2338
|
-
}
|
|
2339
|
-
if (s > weightScale) weightScale = s;
|
|
2340
|
-
}
|
|
2341
|
-
const scaledWeights = weights.map((w) => {
|
|
2342
|
-
const r = parseToScaledInt(w, weightScale);
|
|
2343
|
-
if (!r.ok || r.value < 0n) {
|
|
2344
|
-
throw new MoneyUnsupportedError(`allocate: weight ${JSON.stringify(w)} must be a non-negative decimal`);
|
|
2345
|
-
}
|
|
2346
|
-
return r.value;
|
|
2347
|
-
});
|
|
2348
|
-
const sumW = scaledWeights.reduce((acc, w) => acc + w, 0n);
|
|
2349
|
-
if (sumW === 0n) {
|
|
2350
|
-
throw new MoneyUnsupportedError("allocate: weights must not all be zero");
|
|
2351
|
-
}
|
|
2352
|
-
const negative = a < 0n;
|
|
2353
|
-
const mag = negative ? -a : a;
|
|
2354
|
-
const base = [];
|
|
2355
|
-
const remainders = [];
|
|
2356
|
-
let distributed = 0n;
|
|
2357
|
-
for (let i = 0; i < scaledWeights.length; i++) {
|
|
2358
|
-
const product = mag * scaledWeights[i];
|
|
2359
|
-
const share = product / sumW;
|
|
2360
|
-
base.push(share);
|
|
2361
|
-
distributed += share;
|
|
2362
|
-
remainders.push({ index: i, rem: product % sumW });
|
|
2363
|
-
}
|
|
2364
|
-
let leftover = mag - distributed;
|
|
2365
|
-
remainders.sort((x, y) => y.rem > x.rem ? 1 : y.rem < x.rem ? -1 : x.index - y.index);
|
|
2366
|
-
for (const { index } of remainders) {
|
|
2367
|
-
if (leftover === 0n) break;
|
|
2368
|
-
base[index] = base[index] + 1n;
|
|
2369
|
-
leftover -= 1n;
|
|
2370
|
-
}
|
|
2371
|
-
return base.map((p) => formatScaledInt(negative && p !== 0n ? -p : p, scale));
|
|
2372
|
-
}
|
|
2373
|
-
|
|
2374
|
-
// src/via/money/branded.ts
|
|
2375
|
-
function asMoney(value) {
|
|
2376
|
-
if (!isMoneyLike(value)) {
|
|
2377
|
-
throw new MoneyUnsupportedError(`asMoney: ${JSON.stringify(value)} is not a finite decimal`);
|
|
2378
|
-
}
|
|
2379
|
-
return String(value).trim();
|
|
2380
|
-
}
|
|
2381
|
-
function isMoneyString(value) {
|
|
2382
|
-
return typeof value === "string" && isMoneyLike(value);
|
|
2383
|
-
}
|
|
2384
|
-
function moneyNumber(value) {
|
|
2385
|
-
if (!isMoneyLike(value)) {
|
|
2386
|
-
throw new MoneyUnsupportedError(`moneyNumber: ${JSON.stringify(value)} is not a finite decimal`);
|
|
2387
|
-
}
|
|
2388
|
-
return Number(value);
|
|
2389
|
-
}
|
|
2390
|
-
function isMoneyLike(value) {
|
|
2391
|
-
if (typeof value === "number") return Number.isFinite(value);
|
|
2392
|
-
if (typeof value !== "string") return false;
|
|
2393
|
-
return decimalScaleOf(value) !== null;
|
|
2394
|
-
}
|
|
2395
639
|
|
|
2396
640
|
// src/via/computed/descriptor.ts
|
|
2397
641
|
function computed(fn, opts) {
|
|
@@ -2723,13 +967,11 @@ export {
|
|
|
2723
967
|
CrossJoinTooLargeError,
|
|
2724
968
|
CustodyApi,
|
|
2725
969
|
CustodyNotEnabledError,
|
|
2726
|
-
DEED_RECORD_ID,
|
|
2727
970
|
DEFAULT_CHUNK_SIZE,
|
|
2728
971
|
DEFAULT_COVER_SCHEMA,
|
|
2729
972
|
DEFAULT_CROSS_JOIN_MAX_ROWS,
|
|
2730
973
|
DEFAULT_FRESHNESS_MS,
|
|
2731
974
|
DEFAULT_JOIN_MAX_ROWS,
|
|
2732
|
-
DELEGATIONS_COLLECTION,
|
|
2733
975
|
DICT_COLLECTION_PREFIX,
|
|
2734
976
|
DIRECTORY_RECORD_ID,
|
|
2735
977
|
DanglingReferenceError,
|
|
@@ -2775,9 +1017,7 @@ export {
|
|
|
2775
1017
|
LinkIntegrityError,
|
|
2776
1018
|
LocaleNotSpecifiedError,
|
|
2777
1019
|
Lru,
|
|
2778
|
-
MAGIC_LINK_CONTENT_INFO_PREFIX,
|
|
2779
1020
|
MAGIC_LINK_GRANTS_COLLECTION,
|
|
2780
|
-
MAGIC_LINK_KEK_INFO_PREFIX,
|
|
2781
1021
|
META_COLLECTION,
|
|
2782
1022
|
ManagedRecoveryNotEnrolledError,
|
|
2783
1023
|
MaterializedViewConfigError,
|
|
@@ -2845,7 +1085,6 @@ export {
|
|
|
2845
1085
|
ReservedVaultNameError,
|
|
2846
1086
|
RestrictRefUnresolvableError,
|
|
2847
1087
|
SCHEMAS_COLLECTION,
|
|
2848
|
-
SEALED_SECRET_RECORD_ID,
|
|
2849
1088
|
STATE_VAULT_NAME,
|
|
2850
1089
|
STRICT_POLICY,
|
|
2851
1090
|
SYNC_CREDENTIALS_COLLECTION,
|
|
@@ -2913,7 +1152,6 @@ export {
|
|
|
2913
1152
|
approveWithdrawal,
|
|
2914
1153
|
asMoney,
|
|
2915
1154
|
assertStrongSecret,
|
|
2916
|
-
assertTierAccess,
|
|
2917
1155
|
base64ToBuffer,
|
|
2918
1156
|
blindUpdate,
|
|
2919
1157
|
bufferToBase64,
|
|
@@ -2940,7 +1178,6 @@ export {
|
|
|
2940
1178
|
decryptBytes,
|
|
2941
1179
|
decryptDeterministic,
|
|
2942
1180
|
decryptExtractedPartition,
|
|
2943
|
-
dekKey,
|
|
2944
1181
|
deleteCredential,
|
|
2945
1182
|
deleteIntent,
|
|
2946
1183
|
deleteUserEnvelope,
|
|
@@ -2960,7 +1197,6 @@ export {
|
|
|
2960
1197
|
dictKey,
|
|
2961
1198
|
diff,
|
|
2962
1199
|
diffVault,
|
|
2963
|
-
effectiveClearance,
|
|
2964
1200
|
enableDevUnlock,
|
|
2965
1201
|
encryptBytes,
|
|
2966
1202
|
encryptDeterministic,
|
|
@@ -2987,7 +1223,6 @@ export {
|
|
|
2987
1223
|
hasExportCapability,
|
|
2988
1224
|
hasImportCapability,
|
|
2989
1225
|
hasNoydbBundleMagic,
|
|
2990
|
-
hasRecoveryEnrolled,
|
|
2991
1226
|
hashEntry,
|
|
2992
1227
|
i18nText,
|
|
2993
1228
|
immutableGuard,
|
|
@@ -3014,8 +1249,6 @@ export {
|
|
|
3014
1249
|
isULID,
|
|
3015
1250
|
isViaFieldSpec,
|
|
3016
1251
|
isZodSchema,
|
|
3017
|
-
issueDelegation,
|
|
3018
|
-
recoverSecret as keyringRecoverSecret,
|
|
3019
1252
|
rotateSecret as keyringRotateSecret,
|
|
3020
1253
|
liberateVault,
|
|
3021
1254
|
listCredentials,
|
|
@@ -3024,14 +1257,11 @@ export {
|
|
|
3024
1257
|
listUsers,
|
|
3025
1258
|
listUsersWithEnvelopes,
|
|
3026
1259
|
listWithdrawalRequests,
|
|
3027
|
-
loadActiveDelegations,
|
|
3028
1260
|
loadCover,
|
|
3029
1261
|
loadDeedMarker,
|
|
3030
1262
|
loadDevUnlock,
|
|
3031
1263
|
loadPaperRecoveryEntries,
|
|
3032
1264
|
loadPersistedSchema,
|
|
3033
|
-
loadSealedSecret,
|
|
3034
|
-
loadShamirRecoveryEntries,
|
|
3035
1265
|
loadUserEnvelope,
|
|
3036
1266
|
loadVaultPolicy,
|
|
3037
1267
|
lockSchema,
|
|
@@ -3043,7 +1273,6 @@ export {
|
|
|
3043
1273
|
mergeCrdtStates,
|
|
3044
1274
|
mergePolicy,
|
|
3045
1275
|
mintPaperRecoveryEntry,
|
|
3046
|
-
mintShamirRecoveryEntry,
|
|
3047
1276
|
mintWrappedDeksBlob,
|
|
3048
1277
|
money,
|
|
3049
1278
|
moneyNumber,
|
|
@@ -3052,7 +1281,6 @@ export {
|
|
|
3052
1281
|
parseBytes,
|
|
3053
1282
|
parseIndex,
|
|
3054
1283
|
parseRsaOaepTlv,
|
|
3055
|
-
parseSealedEnvelope,
|
|
3056
1284
|
persistDirectoryConfig,
|
|
3057
1285
|
persistSchemaIfNeeded,
|
|
3058
1286
|
persistUserVisibility,
|
|
@@ -3081,7 +1309,6 @@ export {
|
|
|
3081
1309
|
resolveSequenceKey,
|
|
3082
1310
|
resolveSession,
|
|
3083
1311
|
revokeAllSessions,
|
|
3084
|
-
revokeDelegation,
|
|
3085
1312
|
revokeMagicLinkGrant,
|
|
3086
1313
|
revokeSession,
|
|
3087
1314
|
routeStore,
|
|
@@ -3089,8 +1316,6 @@ export {
|
|
|
3089
1316
|
saveCover,
|
|
3090
1317
|
savePaperRecoveryEntries,
|
|
3091
1318
|
savePersistedSchema,
|
|
3092
|
-
saveSealedSecret,
|
|
3093
|
-
saveShamirRecoveryEntries,
|
|
3094
1319
|
saveUserEnvelope,
|
|
3095
1320
|
saveVaultPolicy,
|
|
3096
1321
|
scaleForCurrency,
|
|
@@ -3102,7 +1327,6 @@ export {
|
|
|
3102
1327
|
transitionGuard,
|
|
3103
1328
|
unwrapDeksFromBlob,
|
|
3104
1329
|
unwrapDeksFromPaperEntry,
|
|
3105
|
-
unwrapDeksFromShamirEntry,
|
|
3106
1330
|
unwrapMagicLinkGrant,
|
|
3107
1331
|
validateCoverInput,
|
|
3108
1332
|
validateI18nTextValue,
|