@struktoai/mirage-node 0.0.3-alpha.0 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/aliyun-PGI57A43.js +10 -0
- package/dist/backblaze-TSPL6Y56.js +10 -0
- package/dist/box-7XTZYDSO.js +8 -0
- package/dist/cas.lua +15 -0
- package/dist/ceph-C265UI5T.js +10 -0
- package/dist/{chunk-IQVNVTOP.js → chunk-25W4XQJZ.js} +5 -5
- package/dist/{chunk-QGRDPSAH.js → chunk-2ERLWAGG.js} +4 -2
- package/dist/chunk-2ERLWAGG.js.map +1 -0
- package/dist/{chunk-NJMGCT63.js → chunk-2QNPKPZZ.js} +7 -2
- package/dist/chunk-2QNPKPZZ.js.map +1 -0
- package/dist/{chunk-ZNWVJ6UW.js → chunk-3ASOQTZB.js} +7 -2
- package/dist/chunk-3ASOQTZB.js.map +1 -0
- package/dist/{chunk-ERELJ7BS.js → chunk-3JZN3GYO.js} +14 -13
- package/dist/chunk-3JZN3GYO.js.map +1 -0
- package/dist/{chunk-DTAY7LPC.js → chunk-4GYB7DGC.js} +295 -706
- package/dist/chunk-4GYB7DGC.js.map +1 -0
- package/dist/{chunk-G5BZE7UA.js → chunk-4M73WHIE.js} +3 -3
- package/dist/{chunk-Q6CDMOM6.js → chunk-4X6CLF4F.js} +3 -3
- package/dist/{chunk-3IJSIVKT.js → chunk-5I7Q7RHW.js} +3 -3
- package/dist/{chunk-YPT4JBUY.js → chunk-5YRWF5RP.js} +18 -16
- package/dist/chunk-5YRWF5RP.js.map +1 -0
- package/dist/chunk-5ZHNPNDD.js +944 -0
- package/dist/chunk-5ZHNPNDD.js.map +1 -0
- package/dist/{chunk-VGLHY6BK.js → chunk-AULFV3KY.js} +1 -2
- package/dist/chunk-AULFV3KY.js.map +1 -0
- package/dist/{chunk-A4Z6DZ22.js → chunk-BWLUBJQG.js} +20 -16
- package/dist/chunk-BWLUBJQG.js.map +1 -0
- package/dist/{chunk-OYV2DN66.js → chunk-BWWU5T2D.js} +3 -3
- package/dist/chunk-C7TNKIK5.js +39 -0
- package/dist/chunk-C7TNKIK5.js.map +1 -0
- package/dist/{chunk-HEHERHQ5.js → chunk-CB76WPUS.js} +13 -14
- package/dist/chunk-CB76WPUS.js.map +1 -0
- package/dist/chunk-CGGO5NKD.js +1194 -0
- package/dist/chunk-CGGO5NKD.js.map +1 -0
- package/dist/{chunk-B2ZOKNN4.js → chunk-CQCTCW4S.js} +1 -2
- package/dist/chunk-CQCTCW4S.js.map +1 -0
- package/dist/{chunk-AJICZLHT.js → chunk-CXQGMFI7.js} +3 -3
- package/dist/{chunk-LW25LMIH.js → chunk-D3U7VQCG.js} +1 -2
- package/dist/{chunk-LW25LMIH.js.map → chunk-D3U7VQCG.js.map} +1 -1
- package/dist/{chunk-RQYEEA2O.js → chunk-DXU7NZPH.js} +3 -3
- package/dist/{chunk-XGJ2QERC.js → chunk-E3KXVEYI.js} +8 -4
- package/dist/chunk-E3KXVEYI.js.map +1 -0
- package/dist/{chunk-L6JPBJAS.js → chunk-EGZNOUMH.js} +3 -3
- package/dist/{chunk-DNBAMB5J.js → chunk-EVK6HH6Z.js} +1 -2
- package/dist/{chunk-DNBAMB5J.js.map → chunk-EVK6HH6Z.js.map} +1 -1
- package/dist/{chunk-BYTU2YC3.js → chunk-F5NWRF32.js} +3 -3
- package/dist/{chunk-RLGWMJD3.js → chunk-FRGTDZQT.js} +146 -11
- package/dist/chunk-FRGTDZQT.js.map +1 -0
- package/dist/{chunk-DYXEITK3.js → chunk-GF75O2EN.js} +4 -2
- package/dist/chunk-GF75O2EN.js.map +1 -0
- package/dist/{chunk-W7FLHT65.js → chunk-GTAS3QVC.js} +1 -2
- package/dist/{chunk-W7FLHT65.js.map → chunk-GTAS3QVC.js.map} +1 -1
- package/dist/{chunk-RQK5UPMP.js → chunk-H62XQZUM.js} +4 -3
- package/dist/chunk-H62XQZUM.js.map +1 -0
- package/dist/{chunk-UT2OPSN4.js → chunk-HCU3B6FW.js} +1 -2
- package/dist/chunk-HCU3B6FW.js.map +1 -0
- package/dist/chunk-HEDE2377.js +754 -0
- package/dist/chunk-HEDE2377.js.map +1 -0
- package/dist/{chunk-JZQHKDSY.js → chunk-HGIPWY5Y.js} +22 -11
- package/dist/chunk-HGIPWY5Y.js.map +1 -0
- package/dist/{chunk-Q2IAILVC.js → chunk-HSD24IP2.js} +8 -4
- package/dist/chunk-HSD24IP2.js.map +1 -0
- package/dist/{chunk-5YOCVEUB.js → chunk-HWQPEBID.js} +19 -15
- package/dist/chunk-HWQPEBID.js.map +1 -0
- package/dist/{chunk-SFUCUARB.js → chunk-IEHPTILN.js} +4 -4
- package/dist/chunk-IEHPTILN.js.map +1 -0
- package/dist/{chunk-C6NHEDHY.js → chunk-IEVLWEBO.js} +15 -14
- package/dist/chunk-IEVLWEBO.js.map +1 -0
- package/dist/{chunk-YUK3X3B4.js → chunk-IKJQOYI4.js} +1 -2
- package/dist/{chunk-YUK3X3B4.js.map → chunk-IKJQOYI4.js.map} +1 -1
- package/dist/{chunk-MHCMHKM6.js → chunk-IUXXZHY3.js} +17 -23
- package/dist/chunk-IUXXZHY3.js.map +1 -0
- package/dist/{chunk-ABTEGAFB.js → chunk-JBDFYIN2.js} +13 -14
- package/dist/chunk-JBDFYIN2.js.map +1 -0
- package/dist/{chunk-A7X4L4JM.js → chunk-JEBH5APX.js} +15 -15
- package/dist/chunk-JEBH5APX.js.map +1 -0
- package/dist/{chunk-H3BST2LI.js → chunk-JHI2PHHD.js} +1 -2
- package/dist/{chunk-H3BST2LI.js.map → chunk-JHI2PHHD.js.map} +1 -1
- package/dist/{chunk-EGB7V74Z.js → chunk-KAWDDS27.js} +1 -3
- package/dist/chunk-KAWDDS27.js.map +1 -0
- package/dist/{chunk-DP2PP5V2.js → chunk-KGC2OGXI.js} +5 -4
- package/dist/chunk-KGC2OGXI.js.map +1 -0
- package/dist/{chunk-FXFDBF3P.js → chunk-L4GMDSMB.js} +3 -3
- package/dist/{chunk-O7ODGJYL.js → chunk-L7FEZ7LU.js} +3 -3
- package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
- package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
- package/dist/{chunk-UGK4TAVK.js → chunk-LPLZLSMK.js} +1 -2
- package/dist/chunk-LPLZLSMK.js.map +1 -0
- package/dist/{chunk-5DLOHQJ2.js → chunk-M6E7VK4D.js} +14 -14
- package/dist/chunk-M6E7VK4D.js.map +1 -0
- package/dist/{chunk-2CC5VW7K.js → chunk-MIQ3ECZM.js} +4 -2
- package/dist/chunk-MIQ3ECZM.js.map +1 -0
- package/dist/chunk-MRXTUFBZ.js +30 -0
- package/dist/chunk-MRXTUFBZ.js.map +1 -0
- package/dist/{chunk-RO5IQEDQ.js → chunk-NJ42VNXG.js} +1 -2
- package/dist/chunk-NJ42VNXG.js.map +1 -0
- package/dist/{chunk-3T3RMDNX.js → chunk-NLXJMXVE.js} +3 -3
- package/dist/{chunk-E2ISWXLB.js → chunk-OQKNDS66.js} +1 -1
- package/dist/{chunk-E2ISWXLB.js.map → chunk-OQKNDS66.js.map} +1 -1
- package/dist/chunk-OSVZKYXS.js +946 -0
- package/dist/chunk-OSVZKYXS.js.map +1 -0
- package/dist/{chunk-LYDMMNL2.js → chunk-RHUEV4I7.js} +12 -13
- package/dist/chunk-RHUEV4I7.js.map +1 -0
- package/dist/{chunk-JALIYI6M.js → chunk-S4KVLPBR.js} +7 -2
- package/dist/chunk-S4KVLPBR.js.map +1 -0
- package/dist/{chunk-XRU5WXZX.js → chunk-SAOQW6ZJ.js} +15 -15
- package/dist/chunk-SAOQW6ZJ.js.map +1 -0
- package/dist/{chunk-CASCUFK2.js → chunk-SI4GMRXD.js} +14 -15
- package/dist/chunk-SI4GMRXD.js.map +1 -0
- package/dist/{chunk-HQ4KWN76.js → chunk-SYMNWNC3.js} +3 -3
- package/dist/{chunk-PJBQKMCD.js → chunk-TUNR4VUM.js} +3 -3
- package/dist/{chunk-XHCBHYN4.js → chunk-UAJYJP5C.js} +7 -2
- package/dist/chunk-UAJYJP5C.js.map +1 -0
- package/dist/{chunk-OPYQ5KIO.js → chunk-UYA3XL3J.js} +4 -2
- package/dist/chunk-UYA3XL3J.js.map +1 -0
- package/dist/{chunk-WL7HS7EM.js → chunk-V7JVMG63.js} +3 -3
- package/dist/{chunk-LAJJPLEV.js → chunk-VBYIDRNU.js} +7 -3
- package/dist/chunk-VBYIDRNU.js.map +1 -0
- package/dist/{chunk-NHS7WLEQ.js → chunk-VHED2STW.js} +11 -8
- package/dist/chunk-VHED2STW.js.map +1 -0
- package/dist/{chunk-JZT4QGIP.js → chunk-VIICUPWQ.js} +1 -2
- package/dist/{chunk-JZT4QGIP.js.map → chunk-VIICUPWQ.js.map} +1 -1
- package/dist/{chunk-TRTUHCS4.js → chunk-VLRSOWHP.js} +17 -15
- package/dist/chunk-VLRSOWHP.js.map +1 -0
- package/dist/chunk-W5ZLIQFR.js +764 -0
- package/dist/chunk-W5ZLIQFR.js.map +1 -0
- package/dist/{chunk-YGZMVNN5.js → chunk-WTSSEUOZ.js} +7 -2
- package/dist/chunk-WTSSEUOZ.js.map +1 -0
- package/dist/{chunk-OHROA3FQ.js → chunk-WWP2STF5.js} +7 -2
- package/dist/chunk-WWP2STF5.js.map +1 -0
- package/dist/{chunk-C6NHFMIP.js → chunk-XADEMW6B.js} +3 -3
- package/dist/{chunk-KTNDT45N.js → chunk-XEMLYWHK.js} +3 -3
- package/dist/{chunk-OZAEWZZ3.js → chunk-XFSEADPC.js} +6 -2
- package/dist/chunk-XFSEADPC.js.map +1 -0
- package/dist/{chunk-TWGVQLG2.js → chunk-XUUSWR4U.js} +1 -2
- package/dist/{chunk-TWGVQLG2.js.map → chunk-XUUSWR4U.js.map} +1 -1
- package/dist/{chunk-XLQI4IT2.js → chunk-YBVMZ7SR.js} +7 -2
- package/dist/chunk-YBVMZ7SR.js.map +1 -0
- package/dist/{chunk-E7RW3SBV.js → chunk-YRJICL2Q.js} +15 -15
- package/dist/chunk-YRJICL2Q.js.map +1 -0
- package/dist/{chunk-B6SXRCBO.js → chunk-ZM44MGC5.js} +3 -3
- package/dist/{chunk-YAVGCQUP.js → chunk-ZMREYTHA.js} +16 -15
- package/dist/chunk-ZMREYTHA.js.map +1 -0
- package/dist/{chunk-H3I2KZIY.js → chunk-ZPB3SLPK.js} +1 -2
- package/dist/{chunk-H3I2KZIY.js.map → chunk-ZPB3SLPK.js.map} +1 -1
- package/dist/chunk-ZPZQXHW2.js +1230 -0
- package/dist/chunk-ZPZQXHW2.js.map +1 -0
- package/dist/{config-34LHOGLM.js → config-2LASFFRD.js} +2 -4
- package/dist/config-3WDIJPTG.js +9 -0
- package/dist/config-4QV4QYI5.js +9 -0
- package/dist/{config-ZFJYQZCH.js → config-54USUVSE.js} +2 -4
- package/dist/config-5ZXN2T2H.js +9 -0
- package/dist/config-A2GQYJDB.js +9 -0
- package/dist/config-BBOLI7VE.js +9 -0
- package/dist/{config-VM526IKB.js → config-BIBFLUIR.js} +2 -4
- package/dist/{config-EO23EY62.js → config-CPYFOUQO.js} +2 -4
- package/dist/{config-3IVQJBNW.js → config-DWSJL3NH.js} +2 -4
- package/dist/config-E22XAGYN.js +9 -0
- package/dist/config-EHE52ZTK.js +9 -0
- package/dist/{config-GE4W4ZJC.js → config-EX3ZJTZI.js} +2 -4
- package/dist/{config-QNMKWJ4M.js → config-FRK7ZL37.js} +2 -4
- package/dist/{config-LHFFXVYI.js → config-HQXNFQZS.js} +2 -4
- package/dist/config-HTXOOAOD.js +9 -0
- package/dist/{config-HKRMKD76.js → config-IPNWAJHH.js} +2 -4
- package/dist/config-J2C53GOT.js +9 -0
- package/dist/config-K63RX6EU.js +9 -0
- package/dist/config-L7SBSH5L.js +9 -0
- package/dist/config-LEALEMKA.js +9 -0
- package/dist/{config-IVY5EQQ2.js → config-M3Z47VYU.js} +2 -4
- package/dist/{config-EIHSP5DZ.js → config-MZM3IPFM.js} +2 -4
- package/dist/{config-GHRUKEQ6.js → config-OJ2BPESH.js} +2 -4
- package/dist/{config-WDAZFXYD.js → config-QO2XUME4.js} +2 -4
- package/dist/config-QWQGOXQ5.js +9 -0
- package/dist/config-RI7IEZUF.js +9 -0
- package/dist/{config-CVZ2AGCO.js → config-SPW6NESU.js} +2 -6
- package/dist/{config-QAA646XB.js → config-T2IUIU5C.js} +2 -4
- package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
- package/dist/config-VKKZGC7V.js +9 -0
- package/dist/config-W7EVPJNK.js +11 -0
- package/dist/config-WKQ3FGTZ.js +9 -0
- package/dist/config-WVILHDFV.js +11 -0
- package/dist/{config-Q45Y46YT.js → config-XU6D5C7E.js} +2 -4
- package/dist/databricks_volume-ETRDJVVQ.js +7 -0
- package/dist/digitalocean-QP72DR4J.js +10 -0
- package/dist/discord-BSN5RB3E.js +8 -0
- package/dist/disk-24NWTN2I.js +7 -0
- package/dist/dropbox-OSTZXSIE.js +8 -0
- package/dist/email-4ZFPSWIN.js +8 -0
- package/dist/gcs-PFWR6MIW.js +10 -0
- package/dist/gdocs-GPAZRQG5.js +8 -0
- package/dist/gdrive-XSX6A7B3.js +8 -0
- package/dist/github-EQ4NXUTA.js +8 -0
- package/dist/github_ci-QL5B2Q2N.js +8 -0
- package/dist/gmail-2TBT4CVH.js +8 -0
- package/dist/gridfs-KZRZ6SIB.js +9 -0
- package/dist/gsheets-N53WEXN2.js +8 -0
- package/dist/gslides-TATSARTH.js +8 -0
- package/dist/hf_buckets-BK7NGJWS.js +10 -0
- package/dist/hf_datasets-UQ5QGM4L.js +10 -0
- package/dist/hf_models-75LFCQCS.js +10 -0
- package/dist/hf_spaces-6T2KB3UC.js +10 -0
- package/dist/index.d.ts +599 -79
- package/dist/index.js +1515 -422
- package/dist/index.js.map +1 -1
- package/dist/langfuse-AMQCQWNE.js +8 -0
- package/dist/linear-V3TXO6CV.js +8 -0
- package/dist/minio-IZRZY4C5.js +10 -0
- package/dist/mongodb-VMKPQCPX.js +7 -0
- package/dist/nextcloud-5RHQCGDO.js +9 -0
- package/dist/notion-6PPNTQFM.js +8 -0
- package/dist/oci-CKYBSFZJ.js +10 -0
- package/dist/postgres-WIQBVL5M.js +7 -0
- package/dist/qingstor-AP4IIPLY.js +10 -0
- package/dist/r2-C4XGEWQY.js +10 -0
- package/dist/redis-6D55Q2WB.js +8 -0
- package/dist/s3-XQBI2CXN.js +8 -0
- package/dist/scaleway-SEZJVURB.js +10 -0
- package/dist/seaweedfs-3XYIAFU2.js +10 -0
- package/dist/slack-ZHXDJQY4.js +8 -0
- package/dist/ssh-X2MO7JOV.js +8 -0
- package/dist/supabase-BBM44UTM.js +10 -0
- package/dist/supabase-BBM44UTM.js.map +1 -0
- package/dist/tencent-X72USLJ7.js +10 -0
- package/dist/tencent-X72USLJ7.js.map +1 -0
- package/dist/trello-EER5NG7L.js +8 -0
- package/dist/trello-EER5NG7L.js.map +1 -0
- package/dist/wasabi-O4MVIUFG.js +10 -0
- package/dist/wasabi-O4MVIUFG.js.map +1 -0
- package/package.json +9 -5
- package/dist/aliyun-TMZRUYCG.js +0 -10
- package/dist/backblaze-OHW57DLK.js +0 -10
- package/dist/box-UXTCAFOZ.js +0 -8
- package/dist/ceph-TNN4I2FT.js +0 -10
- package/dist/chunk-2CC5VW7K.js.map +0 -1
- package/dist/chunk-5DLOHQJ2.js.map +0 -1
- package/dist/chunk-5HCVKTP3.js +0 -2086
- package/dist/chunk-5HCVKTP3.js.map +0 -1
- package/dist/chunk-5YOCVEUB.js.map +0 -1
- package/dist/chunk-A4Z6DZ22.js.map +0 -1
- package/dist/chunk-A7X4L4JM.js.map +0 -1
- package/dist/chunk-ABTEGAFB.js.map +0 -1
- package/dist/chunk-B2ZOKNN4.js.map +0 -1
- package/dist/chunk-C6NHEDHY.js.map +0 -1
- package/dist/chunk-CASCUFK2.js.map +0 -1
- package/dist/chunk-DP2PP5V2.js.map +0 -1
- package/dist/chunk-DTAY7LPC.js.map +0 -1
- package/dist/chunk-DYXEITK3.js.map +0 -1
- package/dist/chunk-E7RW3SBV.js.map +0 -1
- package/dist/chunk-EGB7V74Z.js.map +0 -1
- package/dist/chunk-ERELJ7BS.js.map +0 -1
- package/dist/chunk-HEHERHQ5.js.map +0 -1
- package/dist/chunk-JALIYI6M.js.map +0 -1
- package/dist/chunk-JZQHKDSY.js.map +0 -1
- package/dist/chunk-LAJJPLEV.js.map +0 -1
- package/dist/chunk-LYDMMNL2.js.map +0 -1
- package/dist/chunk-MHCMHKM6.js.map +0 -1
- package/dist/chunk-N72CAZEH.js +0 -1990
- package/dist/chunk-N72CAZEH.js.map +0 -1
- package/dist/chunk-NHS7WLEQ.js.map +0 -1
- package/dist/chunk-NJMGCT63.js.map +0 -1
- package/dist/chunk-OHROA3FQ.js.map +0 -1
- package/dist/chunk-OPYQ5KIO.js.map +0 -1
- package/dist/chunk-OZAEWZZ3.js.map +0 -1
- package/dist/chunk-PBBG7VFT.js +0 -1896
- package/dist/chunk-PBBG7VFT.js.map +0 -1
- package/dist/chunk-Q2IAILVC.js.map +0 -1
- package/dist/chunk-QGRDPSAH.js.map +0 -1
- package/dist/chunk-RLGWMJD3.js.map +0 -1
- package/dist/chunk-RO5IQEDQ.js.map +0 -1
- package/dist/chunk-RQK5UPMP.js.map +0 -1
- package/dist/chunk-SFUCUARB.js.map +0 -1
- package/dist/chunk-TRTUHCS4.js.map +0 -1
- package/dist/chunk-U6QSXTUS.js +0 -7
- package/dist/chunk-U6QSXTUS.js.map +0 -1
- package/dist/chunk-UGK4TAVK.js.map +0 -1
- package/dist/chunk-UT2OPSN4.js.map +0 -1
- package/dist/chunk-VGLHY6BK.js.map +0 -1
- package/dist/chunk-WSGEIVY3.js +0 -1766
- package/dist/chunk-WSGEIVY3.js.map +0 -1
- package/dist/chunk-XGJ2QERC.js.map +0 -1
- package/dist/chunk-XHCBHYN4.js.map +0 -1
- package/dist/chunk-XLQI4IT2.js.map +0 -1
- package/dist/chunk-XRU5WXZX.js.map +0 -1
- package/dist/chunk-YAVGCQUP.js.map +0 -1
- package/dist/chunk-YGZMVNN5.js.map +0 -1
- package/dist/chunk-YPT4JBUY.js.map +0 -1
- package/dist/chunk-ZNWVJ6UW.js.map +0 -1
- package/dist/config-3BBWD5AB.js +0 -11
- package/dist/config-4UDVSUQJ.js +0 -11
- package/dist/config-CMDBAPDH.js +0 -11
- package/dist/config-D3RLSPNF.js +0 -11
- package/dist/config-DG65OEG3.js +0 -11
- package/dist/config-GCQK6NJY.js +0 -11
- package/dist/config-GVH27UPE.js +0 -11
- package/dist/config-HXVYIXP5.js +0 -11
- package/dist/config-IDZMEW73.js +0 -11
- package/dist/config-IJJXGLBQ.js +0 -11
- package/dist/config-KJOLGVB2.js +0 -11
- package/dist/config-KMVCVBYN.js +0 -15
- package/dist/config-KYTRXAB2.js +0 -15
- package/dist/config-OT2TQQCN.js +0 -11
- package/dist/config-QWCY3LBQ.js +0 -11
- package/dist/config-ZV6G2ZEC.js +0 -11
- package/dist/databricks_volume-HNQ4DJVJ.js +0 -7
- package/dist/digitalocean-6SPR4S7V.js +0 -10
- package/dist/discord-SAV2RBJV.js +0 -8
- package/dist/disk-POACMF4G.js +0 -8
- package/dist/dropbox-CQ7MTYX2.js +0 -8
- package/dist/email-KBQ7CXS7.js +0 -8
- package/dist/gcs-SMIE4VMT.js +0 -10
- package/dist/gdocs-X5Y2SIQX.js +0 -8
- package/dist/gdrive-SIQPRIGI.js +0 -8
- package/dist/github-KBHWANKQ.js +0 -8
- package/dist/github_ci-HPITNK37.js +0 -8
- package/dist/gmail-DKHAGJNX.js +0 -8
- package/dist/gsheets-ZSUDIWGK.js +0 -8
- package/dist/gslides-GYXM7IMJ.js +0 -8
- package/dist/hf_buckets-RIOMV7WG.js +0 -10
- package/dist/hf_datasets-QF4BQ3OK.js +0 -10
- package/dist/hf_models-62GC2HPZ.js +0 -10
- package/dist/hf_spaces-NVSMUNRM.js +0 -10
- package/dist/langfuse-HUAYVPHF.js +0 -8
- package/dist/linear-2MM55KBC.js +0 -8
- package/dist/minio-L3XE6PQS.js +0 -10
- package/dist/mongodb-ZOX4FRHJ.js +0 -7
- package/dist/notion-UK4GTMT4.js +0 -8
- package/dist/oci-NURLWPL2.js +0 -10
- package/dist/postgres-JNFMPAO2.js +0 -7
- package/dist/qingstor-W55D5YFO.js +0 -10
- package/dist/r2-FSZK7IFI.js +0 -10
- package/dist/redis-S6GIPA4Z.js +0 -8
- package/dist/s3-GMPUJ65D.js +0 -8
- package/dist/scaleway-5VM55Y6D.js +0 -10
- package/dist/seaweedfs-J3EPUEPE.js +0 -10
- package/dist/slack-FVBXY7KD.js +0 -8
- package/dist/ssh-GCXETJ3Z.js +0 -9
- package/dist/supabase-HLWNHBBE.js +0 -10
- package/dist/tencent-YDO73XBD.js +0 -10
- package/dist/trello-CQ53BQUL.js +0 -8
- package/dist/wasabi-SOZKPMRQ.js +0 -10
- /package/dist/{aliyun-TMZRUYCG.js.map → aliyun-PGI57A43.js.map} +0 -0
- /package/dist/{backblaze-OHW57DLK.js.map → backblaze-TSPL6Y56.js.map} +0 -0
- /package/dist/{box-UXTCAFOZ.js.map → box-7XTZYDSO.js.map} +0 -0
- /package/dist/{ceph-TNN4I2FT.js.map → ceph-C265UI5T.js.map} +0 -0
- /package/dist/{chunk-IQVNVTOP.js.map → chunk-25W4XQJZ.js.map} +0 -0
- /package/dist/{chunk-G5BZE7UA.js.map → chunk-4M73WHIE.js.map} +0 -0
- /package/dist/{chunk-Q6CDMOM6.js.map → chunk-4X6CLF4F.js.map} +0 -0
- /package/dist/{chunk-3IJSIVKT.js.map → chunk-5I7Q7RHW.js.map} +0 -0
- /package/dist/{chunk-OYV2DN66.js.map → chunk-BWWU5T2D.js.map} +0 -0
- /package/dist/{chunk-AJICZLHT.js.map → chunk-CXQGMFI7.js.map} +0 -0
- /package/dist/{chunk-RQYEEA2O.js.map → chunk-DXU7NZPH.js.map} +0 -0
- /package/dist/{chunk-L6JPBJAS.js.map → chunk-EGZNOUMH.js.map} +0 -0
- /package/dist/{chunk-BYTU2YC3.js.map → chunk-F5NWRF32.js.map} +0 -0
- /package/dist/{chunk-FXFDBF3P.js.map → chunk-L4GMDSMB.js.map} +0 -0
- /package/dist/{chunk-O7ODGJYL.js.map → chunk-L7FEZ7LU.js.map} +0 -0
- /package/dist/{chunk-3T3RMDNX.js.map → chunk-NLXJMXVE.js.map} +0 -0
- /package/dist/{chunk-HQ4KWN76.js.map → chunk-SYMNWNC3.js.map} +0 -0
- /package/dist/{chunk-PJBQKMCD.js.map → chunk-TUNR4VUM.js.map} +0 -0
- /package/dist/{chunk-WL7HS7EM.js.map → chunk-V7JVMG63.js.map} +0 -0
- /package/dist/{chunk-C6NHFMIP.js.map → chunk-XADEMW6B.js.map} +0 -0
- /package/dist/{chunk-KTNDT45N.js.map → chunk-XEMLYWHK.js.map} +0 -0
- /package/dist/{chunk-B6SXRCBO.js.map → chunk-ZM44MGC5.js.map} +0 -0
- /package/dist/{config-34LHOGLM.js.map → config-2LASFFRD.js.map} +0 -0
- /package/dist/{config-3BBWD5AB.js.map → config-3WDIJPTG.js.map} +0 -0
- /package/dist/{config-3IVQJBNW.js.map → config-4QV4QYI5.js.map} +0 -0
- /package/dist/{config-4UDVSUQJ.js.map → config-54USUVSE.js.map} +0 -0
- /package/dist/{config-CMDBAPDH.js.map → config-5ZXN2T2H.js.map} +0 -0
- /package/dist/{config-CVZ2AGCO.js.map → config-A2GQYJDB.js.map} +0 -0
- /package/dist/{config-D3RLSPNF.js.map → config-BBOLI7VE.js.map} +0 -0
- /package/dist/{config-DG65OEG3.js.map → config-BIBFLUIR.js.map} +0 -0
- /package/dist/{config-EIHSP5DZ.js.map → config-CPYFOUQO.js.map} +0 -0
- /package/dist/{config-EO23EY62.js.map → config-DWSJL3NH.js.map} +0 -0
- /package/dist/{config-GCQK6NJY.js.map → config-E22XAGYN.js.map} +0 -0
- /package/dist/{config-GE4W4ZJC.js.map → config-EHE52ZTK.js.map} +0 -0
- /package/dist/{config-GHRUKEQ6.js.map → config-EX3ZJTZI.js.map} +0 -0
- /package/dist/{config-GVH27UPE.js.map → config-FRK7ZL37.js.map} +0 -0
- /package/dist/{config-HKRMKD76.js.map → config-HQXNFQZS.js.map} +0 -0
- /package/dist/{config-HXVYIXP5.js.map → config-HTXOOAOD.js.map} +0 -0
- /package/dist/{config-IDZMEW73.js.map → config-IPNWAJHH.js.map} +0 -0
- /package/dist/{config-IJJXGLBQ.js.map → config-J2C53GOT.js.map} +0 -0
- /package/dist/{config-IVY5EQQ2.js.map → config-K63RX6EU.js.map} +0 -0
- /package/dist/{config-KJOLGVB2.js.map → config-L7SBSH5L.js.map} +0 -0
- /package/dist/{config-KMVCVBYN.js.map → config-LEALEMKA.js.map} +0 -0
- /package/dist/{config-KYTRXAB2.js.map → config-M3Z47VYU.js.map} +0 -0
- /package/dist/{config-LHFFXVYI.js.map → config-MZM3IPFM.js.map} +0 -0
- /package/dist/{config-NV5WXP64.js.map → config-OJ2BPESH.js.map} +0 -0
- /package/dist/{config-OT2TQQCN.js.map → config-QO2XUME4.js.map} +0 -0
- /package/dist/{config-Q45Y46YT.js.map → config-QWQGOXQ5.js.map} +0 -0
- /package/dist/{config-QAA646XB.js.map → config-RI7IEZUF.js.map} +0 -0
- /package/dist/{config-QNMKWJ4M.js.map → config-SPW6NESU.js.map} +0 -0
- /package/dist/{config-QWCY3LBQ.js.map → config-T2IUIU5C.js.map} +0 -0
- /package/dist/{config-VM526IKB.js.map → config-UU27ALAA.js.map} +0 -0
- /package/dist/{config-WDAZFXYD.js.map → config-VKKZGC7V.js.map} +0 -0
- /package/dist/{config-ZFJYQZCH.js.map → config-W7EVPJNK.js.map} +0 -0
- /package/dist/{config-ZV6G2ZEC.js.map → config-WKQ3FGTZ.js.map} +0 -0
- /package/dist/{databricks_volume-HNQ4DJVJ.js.map → config-WVILHDFV.js.map} +0 -0
- /package/dist/{digitalocean-6SPR4S7V.js.map → config-XU6D5C7E.js.map} +0 -0
- /package/dist/{discord-SAV2RBJV.js.map → databricks_volume-ETRDJVVQ.js.map} +0 -0
- /package/dist/{disk-POACMF4G.js.map → digitalocean-QP72DR4J.js.map} +0 -0
- /package/dist/{dropbox-CQ7MTYX2.js.map → discord-BSN5RB3E.js.map} +0 -0
- /package/dist/{email-KBQ7CXS7.js.map → disk-24NWTN2I.js.map} +0 -0
- /package/dist/{gcs-SMIE4VMT.js.map → dropbox-OSTZXSIE.js.map} +0 -0
- /package/dist/{gdocs-X5Y2SIQX.js.map → email-4ZFPSWIN.js.map} +0 -0
- /package/dist/{gdrive-SIQPRIGI.js.map → gcs-PFWR6MIW.js.map} +0 -0
- /package/dist/{github-KBHWANKQ.js.map → gdocs-GPAZRQG5.js.map} +0 -0
- /package/dist/{github_ci-HPITNK37.js.map → gdrive-XSX6A7B3.js.map} +0 -0
- /package/dist/{gmail-DKHAGJNX.js.map → github-EQ4NXUTA.js.map} +0 -0
- /package/dist/{gsheets-ZSUDIWGK.js.map → github_ci-QL5B2Q2N.js.map} +0 -0
- /package/dist/{gslides-GYXM7IMJ.js.map → gmail-2TBT4CVH.js.map} +0 -0
- /package/dist/{hf_buckets-RIOMV7WG.js.map → gridfs-KZRZ6SIB.js.map} +0 -0
- /package/dist/{hf_datasets-QF4BQ3OK.js.map → gsheets-N53WEXN2.js.map} +0 -0
- /package/dist/{hf_models-62GC2HPZ.js.map → gslides-TATSARTH.js.map} +0 -0
- /package/dist/{hf_spaces-NVSMUNRM.js.map → hf_buckets-BK7NGJWS.js.map} +0 -0
- /package/dist/{langfuse-HUAYVPHF.js.map → hf_datasets-UQ5QGM4L.js.map} +0 -0
- /package/dist/{linear-2MM55KBC.js.map → hf_models-75LFCQCS.js.map} +0 -0
- /package/dist/{minio-L3XE6PQS.js.map → hf_spaces-6T2KB3UC.js.map} +0 -0
- /package/dist/{mongodb-ZOX4FRHJ.js.map → langfuse-AMQCQWNE.js.map} +0 -0
- /package/dist/{notion-UK4GTMT4.js.map → linear-V3TXO6CV.js.map} +0 -0
- /package/dist/{oci-NURLWPL2.js.map → minio-IZRZY4C5.js.map} +0 -0
- /package/dist/{postgres-JNFMPAO2.js.map → mongodb-VMKPQCPX.js.map} +0 -0
- /package/dist/{qingstor-W55D5YFO.js.map → nextcloud-5RHQCGDO.js.map} +0 -0
- /package/dist/{r2-FSZK7IFI.js.map → notion-6PPNTQFM.js.map} +0 -0
- /package/dist/{redis-S6GIPA4Z.js.map → oci-CKYBSFZJ.js.map} +0 -0
- /package/dist/{s3-GMPUJ65D.js.map → postgres-WIQBVL5M.js.map} +0 -0
- /package/dist/{scaleway-5VM55Y6D.js.map → qingstor-AP4IIPLY.js.map} +0 -0
- /package/dist/{seaweedfs-J3EPUEPE.js.map → r2-C4XGEWQY.js.map} +0 -0
- /package/dist/{slack-FVBXY7KD.js.map → redis-6D55Q2WB.js.map} +0 -0
- /package/dist/{ssh-GCXETJ3Z.js.map → s3-XQBI2CXN.js.map} +0 -0
- /package/dist/{supabase-HLWNHBBE.js.map → scaleway-SEZJVURB.js.map} +0 -0
- /package/dist/{tencent-YDO73XBD.js.map → seaweedfs-3XYIAFU2.js.map} +0 -0
- /package/dist/{trello-CQ53BQUL.js.map → slack-ZHXDJQY4.js.map} +0 -0
- /package/dist/{wasabi-SOZKPMRQ.js.map → ssh-X2MO7JOV.js.map} +0 -0
|
@@ -0,0 +1,946 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadOptionalPeer
|
|
3
|
+
} from "./chunk-OQKNDS66.js";
|
|
4
|
+
|
|
5
|
+
// src/resource/redis/redis.ts
|
|
6
|
+
import {
|
|
7
|
+
BaseResource,
|
|
8
|
+
PathSpec,
|
|
9
|
+
REDACTED_SECRET,
|
|
10
|
+
ResourceName as ResourceName7,
|
|
11
|
+
makeResolveGlob,
|
|
12
|
+
mountKey,
|
|
13
|
+
mountPrefixOf as mountPrefixOf2
|
|
14
|
+
} from "@struktoai/mirage-core";
|
|
15
|
+
|
|
16
|
+
// src/commands/builtin/redis/index.ts
|
|
17
|
+
import {
|
|
18
|
+
ResourceName as ResourceName5,
|
|
19
|
+
makeFiletypeCommands,
|
|
20
|
+
makeGenericCommands
|
|
21
|
+
} from "@struktoai/mirage-core";
|
|
22
|
+
|
|
23
|
+
// src/core/redis/read.ts
|
|
24
|
+
import { record, ResourceName } from "@struktoai/mirage-core";
|
|
25
|
+
import { enoent } from "@struktoai/mirage-core";
|
|
26
|
+
|
|
27
|
+
// src/core/redis/utils.ts
|
|
28
|
+
import { norm, parent, gnuBasename } from "@struktoai/mirage-core";
|
|
29
|
+
function nowIso() {
|
|
30
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// src/core/redis/read.ts
|
|
34
|
+
async function read(accessor, path, _index) {
|
|
35
|
+
const start = performance.now();
|
|
36
|
+
const p = norm(path.mountPath);
|
|
37
|
+
const data = await accessor.store.getFile(p);
|
|
38
|
+
if (data === null) {
|
|
39
|
+
throw enoent(path);
|
|
40
|
+
}
|
|
41
|
+
record("read", p, ResourceName.REDIS, data.byteLength, start);
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/core/redis/stat.ts
|
|
46
|
+
import {
|
|
47
|
+
FileStat,
|
|
48
|
+
FileType,
|
|
49
|
+
guessType
|
|
50
|
+
} from "@struktoai/mirage-core";
|
|
51
|
+
import { enoent as enoent2 } from "@struktoai/mirage-core";
|
|
52
|
+
function decodeAttrs(raw) {
|
|
53
|
+
const out = {};
|
|
54
|
+
if (raw.mode !== void 0) out.mode = parseInt(raw.mode, 10);
|
|
55
|
+
for (const key of ["uid", "gid"]) {
|
|
56
|
+
const val = raw[key];
|
|
57
|
+
if (val !== void 0) out[key] = /^\d+$/.test(val) ? parseInt(val, 10) : val;
|
|
58
|
+
}
|
|
59
|
+
if (raw.atime !== void 0) out.atime = raw.atime;
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
async function stat(accessor, path, _index) {
|
|
63
|
+
const p = norm(path.mountPath);
|
|
64
|
+
const store = accessor.store;
|
|
65
|
+
if (await store.hasDir(p)) {
|
|
66
|
+
const attrs = decodeAttrs(await store.getAttrs(p));
|
|
67
|
+
return new FileStat({
|
|
68
|
+
name: gnuBasename(p),
|
|
69
|
+
modified: await store.getModified(p),
|
|
70
|
+
type: FileType.DIRECTORY,
|
|
71
|
+
mode: attrs.mode ?? null,
|
|
72
|
+
uid: attrs.uid ?? null,
|
|
73
|
+
gid: attrs.gid ?? null,
|
|
74
|
+
atime: attrs.atime ?? null
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (await store.hasFile(p)) {
|
|
78
|
+
const size = await store.fileLen(p);
|
|
79
|
+
const attrs = decodeAttrs(await store.getAttrs(p));
|
|
80
|
+
return new FileStat({
|
|
81
|
+
name: gnuBasename(p),
|
|
82
|
+
size,
|
|
83
|
+
modified: await store.getModified(p),
|
|
84
|
+
type: guessType(p),
|
|
85
|
+
mode: attrs.mode ?? null,
|
|
86
|
+
uid: attrs.uid ?? null,
|
|
87
|
+
gid: attrs.gid ?? null,
|
|
88
|
+
atime: attrs.atime ?? null
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
throw enoent2(path);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/core/redis/append.ts
|
|
95
|
+
import { ResourceName as ResourceName2, invalidateAfterWrite, record as record2 } from "@struktoai/mirage-core";
|
|
96
|
+
async function appendBytes(accessor, path, data) {
|
|
97
|
+
const start = performance.now();
|
|
98
|
+
const p = norm(path.mountPath);
|
|
99
|
+
const store = accessor.store;
|
|
100
|
+
const existing = await store.getFile(p);
|
|
101
|
+
if (existing !== null) {
|
|
102
|
+
const merged = new Uint8Array(existing.byteLength + data.byteLength);
|
|
103
|
+
merged.set(existing, 0);
|
|
104
|
+
merged.set(data, existing.byteLength);
|
|
105
|
+
await store.setFile(p, merged);
|
|
106
|
+
} else {
|
|
107
|
+
await store.setFile(p, data);
|
|
108
|
+
}
|
|
109
|
+
await store.setModified(p, nowIso());
|
|
110
|
+
record2("append", p, ResourceName2.REDIS, data.byteLength, start);
|
|
111
|
+
await invalidateAfterWrite(p);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/core/redis/constants.ts
|
|
115
|
+
var SCOPE_ERROR = 5e4;
|
|
116
|
+
|
|
117
|
+
// src/core/redis/copy.ts
|
|
118
|
+
import { invalidateAfterWrite as invalidateAfterWrite2 } from "@struktoai/mirage-core";
|
|
119
|
+
async function copy(accessor, src, dst) {
|
|
120
|
+
const s = norm(src.mountPath);
|
|
121
|
+
const d = norm(dst.mountPath);
|
|
122
|
+
const store = accessor.store;
|
|
123
|
+
const data = await store.getFile(s);
|
|
124
|
+
if (data === null) {
|
|
125
|
+
throw new Error(`file not found: ${s}`);
|
|
126
|
+
}
|
|
127
|
+
await store.setFile(d, data);
|
|
128
|
+
await store.setModified(d, nowIso());
|
|
129
|
+
await invalidateAfterWrite2(dst);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// src/core/redis/create.ts
|
|
133
|
+
import { invalidateAfterWrite as invalidateAfterWrite3 } from "@struktoai/mirage-core";
|
|
134
|
+
async function create(accessor, path) {
|
|
135
|
+
const p = norm(path.mountPath);
|
|
136
|
+
const store = accessor.store;
|
|
137
|
+
await store.setFile(p, new Uint8Array(0));
|
|
138
|
+
await store.setModified(p, nowIso());
|
|
139
|
+
await invalidateAfterWrite3(path);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// src/core/redis/du.ts
|
|
143
|
+
import { rstripSlash } from "@struktoai/mirage-core";
|
|
144
|
+
async function du(accessor, path) {
|
|
145
|
+
const p = norm(path.mountPath);
|
|
146
|
+
const store = accessor.store;
|
|
147
|
+
const prefix = rstripSlash(p) + "/";
|
|
148
|
+
let total = 0;
|
|
149
|
+
for (const key of await store.listFiles()) {
|
|
150
|
+
if (key === p || key.startsWith(prefix)) {
|
|
151
|
+
total += await store.fileLen(key);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return total;
|
|
155
|
+
}
|
|
156
|
+
async function duAll(accessor, path) {
|
|
157
|
+
const p = norm(path.mountPath);
|
|
158
|
+
const store = accessor.store;
|
|
159
|
+
const prefix = rstripSlash(p) + "/";
|
|
160
|
+
const entries = [];
|
|
161
|
+
let total = 0;
|
|
162
|
+
for (const key of await store.listFiles()) {
|
|
163
|
+
if (key === p || key.startsWith(prefix)) {
|
|
164
|
+
const size = await store.fileLen(key);
|
|
165
|
+
entries.push([key, size]);
|
|
166
|
+
total += size;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { entries, total };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/core/redis/exists.ts
|
|
173
|
+
async function exists(accessor, path) {
|
|
174
|
+
const p = norm(path.mountPath);
|
|
175
|
+
const store = accessor.store;
|
|
176
|
+
return await store.hasFile(p) || await store.hasDir(p);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// src/core/redis/find.ts
|
|
180
|
+
import {
|
|
181
|
+
buildTree,
|
|
182
|
+
computeNonemptyDirs,
|
|
183
|
+
emitStartPath,
|
|
184
|
+
keep,
|
|
185
|
+
rstripSlash as rstripSlash2,
|
|
186
|
+
startBasename
|
|
187
|
+
} from "@struktoai/mirage-core";
|
|
188
|
+
async function find(accessor, path, options = {}) {
|
|
189
|
+
const p = norm(path.mountPath);
|
|
190
|
+
const startName = startBasename(path.virtual);
|
|
191
|
+
const store = accessor.store;
|
|
192
|
+
const prefix = rstripSlash2(p) + "/";
|
|
193
|
+
const baseDepth = p === "/" ? 0 : (p.match(/\//g) ?? []).length;
|
|
194
|
+
const results = [];
|
|
195
|
+
const tree = options.tree ?? buildTree({
|
|
196
|
+
name: options.name,
|
|
197
|
+
iname: options.iname,
|
|
198
|
+
pathPattern: options.pathPattern,
|
|
199
|
+
type: options.type,
|
|
200
|
+
nameExclude: options.nameExclude,
|
|
201
|
+
orNames: options.orNames,
|
|
202
|
+
empty: options.empty
|
|
203
|
+
});
|
|
204
|
+
const empty = options.empty === true;
|
|
205
|
+
const allFiles = await store.listFiles();
|
|
206
|
+
const allDirs = await store.listDirs();
|
|
207
|
+
const nonempty = empty ? computeNonemptyDirs([...allFiles, ...[...allDirs].filter((k) => k !== "/")]) : /* @__PURE__ */ new Set();
|
|
208
|
+
const candidates = [];
|
|
209
|
+
if (options.type !== "d") {
|
|
210
|
+
for (const key of allFiles) candidates.push([key, "f"]);
|
|
211
|
+
}
|
|
212
|
+
if (options.type !== "f") {
|
|
213
|
+
for (const key of allDirs) {
|
|
214
|
+
candidates.push([key, "d"]);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
let rootKind = null;
|
|
218
|
+
let rootIsEmpty = null;
|
|
219
|
+
let rootSize = null;
|
|
220
|
+
for (const [key, kind] of candidates) {
|
|
221
|
+
if (key !== p && !key.startsWith(prefix)) continue;
|
|
222
|
+
if (key === p) {
|
|
223
|
+
rootKind = kind;
|
|
224
|
+
if (empty) {
|
|
225
|
+
rootIsEmpty = kind === "f" ? await store.fileLen(key) === 0 : !nonempty.has(key);
|
|
226
|
+
}
|
|
227
|
+
if (kind === "f") rootSize = await store.fileLen(key);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const depth = (key.match(/\//g) ?? []).length - baseDepth;
|
|
231
|
+
if (options.maxDepth !== null && options.maxDepth !== void 0 && depth > options.maxDepth)
|
|
232
|
+
continue;
|
|
233
|
+
const basename = key.slice(key.lastIndexOf("/") + 1);
|
|
234
|
+
let isEmpty = null;
|
|
235
|
+
if (empty) {
|
|
236
|
+
isEmpty = kind === "f" ? await store.fileLen(key) === 0 : !nonempty.has(key);
|
|
237
|
+
}
|
|
238
|
+
if (!keep({ key, name: basename, kind, depth, isEmpty }, tree, options.minDepth)) continue;
|
|
239
|
+
if (options.minSize != null || options.maxSize != null) {
|
|
240
|
+
const size = kind === "f" ? await store.fileLen(key) : 0;
|
|
241
|
+
if (options.minSize != null && size < options.minSize) continue;
|
|
242
|
+
if (options.maxSize != null && size > options.maxSize) continue;
|
|
243
|
+
}
|
|
244
|
+
results.push(key);
|
|
245
|
+
}
|
|
246
|
+
if (rootKind !== null) {
|
|
247
|
+
emitStartPath(results, p, startName, {
|
|
248
|
+
kind: rootKind,
|
|
249
|
+
isEmpty: rootIsEmpty,
|
|
250
|
+
exists: true,
|
|
251
|
+
tree,
|
|
252
|
+
maxDepth: options.maxDepth,
|
|
253
|
+
minDepth: options.minDepth,
|
|
254
|
+
size: rootSize,
|
|
255
|
+
minSize: options.minSize,
|
|
256
|
+
maxSize: options.maxSize
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
results.sort();
|
|
260
|
+
return results;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// src/core/redis/mkdir.ts
|
|
264
|
+
import { invalidateAfterWrite as invalidateAfterWrite4, invalidateAncestors } from "@struktoai/mirage-core";
|
|
265
|
+
import { stripSlash } from "@struktoai/mirage-core";
|
|
266
|
+
async function mkdir(accessor, path, parents = false) {
|
|
267
|
+
const p = norm(path.mountPath);
|
|
268
|
+
const store = accessor.store;
|
|
269
|
+
if (parents) {
|
|
270
|
+
const parts = stripSlash(p).split("/");
|
|
271
|
+
let current = "";
|
|
272
|
+
const now = nowIso();
|
|
273
|
+
for (const part of parts) {
|
|
274
|
+
current += `/${part}`;
|
|
275
|
+
await store.addDir(current);
|
|
276
|
+
const mod = await store.getModified(current);
|
|
277
|
+
if (mod === null) {
|
|
278
|
+
await store.setModified(current, now);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
await invalidateAfterWrite4(p);
|
|
282
|
+
await invalidateAncestors(path);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const par = parent(p);
|
|
286
|
+
if (par !== "/" && !await store.hasDir(par)) {
|
|
287
|
+
throw new Error(`parent directory does not exist: ${par}`);
|
|
288
|
+
}
|
|
289
|
+
await store.addDir(p);
|
|
290
|
+
await store.setModified(p, nowIso());
|
|
291
|
+
await invalidateAfterWrite4(p);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// src/core/redis/readdir.ts
|
|
295
|
+
import {
|
|
296
|
+
mountPrefixOf,
|
|
297
|
+
rstripSlash as rstripSlash3
|
|
298
|
+
} from "@struktoai/mirage-core";
|
|
299
|
+
import { enotdir } from "@struktoai/mirage-core";
|
|
300
|
+
|
|
301
|
+
// src/core/redis/entry.ts
|
|
302
|
+
import { IndexEntry } from "@struktoai/mirage-core";
|
|
303
|
+
var RedisResourceType = Object.freeze({
|
|
304
|
+
FILE: "file",
|
|
305
|
+
FOLDER: "folder"
|
|
306
|
+
});
|
|
307
|
+
var RedisIndexEntry = class _RedisIndexEntry extends IndexEntry {
|
|
308
|
+
// size defaults to null, not 0: a readdir knows a key exists but not
|
|
309
|
+
// its length, and a lying 0 would be trusted by index-first size
|
|
310
|
+
// lookups (provision estimates) over a real stat.
|
|
311
|
+
static file(path, size = null) {
|
|
312
|
+
const name = path.slice(path.lastIndexOf("/") + 1);
|
|
313
|
+
return new _RedisIndexEntry({
|
|
314
|
+
id: path,
|
|
315
|
+
name,
|
|
316
|
+
resourceType: RedisResourceType.FILE,
|
|
317
|
+
vfsName: name,
|
|
318
|
+
size
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
static folder(path) {
|
|
322
|
+
const name = path.slice(path.lastIndexOf("/") + 1);
|
|
323
|
+
return new _RedisIndexEntry({
|
|
324
|
+
id: path,
|
|
325
|
+
name,
|
|
326
|
+
resourceType: RedisResourceType.FOLDER,
|
|
327
|
+
vfsName: name
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// src/core/redis/readdir.ts
|
|
333
|
+
async function readdir(accessor, path, index) {
|
|
334
|
+
const virtual = path.pattern !== null ? path.directory : path.mountPath;
|
|
335
|
+
const mountPrefix = mountPrefixOf(path.virtual, path.resourcePath);
|
|
336
|
+
const virtualKey = rstripSlash3(mountPrefix + virtual) || "/";
|
|
337
|
+
if (index !== void 0) {
|
|
338
|
+
const cached = await index.listDir(virtualKey);
|
|
339
|
+
if (cached.entries !== void 0 && cached.entries !== null) {
|
|
340
|
+
return cached.entries;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
const store = accessor.store;
|
|
344
|
+
const p = norm(virtual);
|
|
345
|
+
if (!await store.hasDir(p)) {
|
|
346
|
+
throw enotdir(path);
|
|
347
|
+
}
|
|
348
|
+
const dirPrefix = p === "/" ? "/" : `${p}/`;
|
|
349
|
+
const seen = /* @__PURE__ */ new Set();
|
|
350
|
+
const files = await store.listFiles();
|
|
351
|
+
const dirs = await store.listDirs();
|
|
352
|
+
for (const key of [...files, ...dirs]) {
|
|
353
|
+
if (key === p) continue;
|
|
354
|
+
if (!key.startsWith(dirPrefix)) continue;
|
|
355
|
+
const remainder = key.slice(dirPrefix.length);
|
|
356
|
+
const first = remainder.split("/")[0];
|
|
357
|
+
if (first !== void 0 && first.length > 0) seen.add(dirPrefix + first);
|
|
358
|
+
}
|
|
359
|
+
const sorted = [...seen].sort();
|
|
360
|
+
const virtualEntries = sorted.map((entry) => `${mountPrefix}${entry}`);
|
|
361
|
+
if (index !== void 0) {
|
|
362
|
+
const fileSet = new Set(files);
|
|
363
|
+
const entries = sorted.map((e) => {
|
|
364
|
+
const name = e.slice(e.lastIndexOf("/") + 1);
|
|
365
|
+
return [name, fileSet.has(e) ? RedisIndexEntry.file(e) : RedisIndexEntry.folder(e)];
|
|
366
|
+
});
|
|
367
|
+
await index.setDir(virtualKey, entries);
|
|
368
|
+
}
|
|
369
|
+
return virtualEntries;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// src/core/redis/rename.ts
|
|
373
|
+
import { invalidateAfterUnlink, invalidateAfterWrite as invalidateAfterWrite5 } from "@struktoai/mirage-core";
|
|
374
|
+
import { rstripSlash as rstripSlash4 } from "@struktoai/mirage-core";
|
|
375
|
+
async function rename(accessor, src, dst) {
|
|
376
|
+
const s = norm(src.mountPath);
|
|
377
|
+
const d = norm(dst.mountPath);
|
|
378
|
+
const now = nowIso();
|
|
379
|
+
const store = accessor.store;
|
|
380
|
+
if (await store.hasFile(s)) {
|
|
381
|
+
const data = await store.getFile(s);
|
|
382
|
+
const mod = await store.getModified(s);
|
|
383
|
+
const attrs = await store.getAttrs(s);
|
|
384
|
+
if (data === null) throw new Error(`file not found: ${s}`);
|
|
385
|
+
await store.delFile(s);
|
|
386
|
+
await store.delModified(s);
|
|
387
|
+
await store.delAttrs(s);
|
|
388
|
+
await store.setFile(d, data);
|
|
389
|
+
await store.setModified(d, mod ?? now);
|
|
390
|
+
if (Object.keys(attrs).length > 0) await store.setAttrs(d, attrs);
|
|
391
|
+
await invalidateAfterUnlink(s);
|
|
392
|
+
await invalidateAfterWrite5(d);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (await store.hasDir(s)) {
|
|
396
|
+
const mod = await store.getModified(s);
|
|
397
|
+
const attrs = await store.getAttrs(s);
|
|
398
|
+
await store.removeDir(s);
|
|
399
|
+
await store.delModified(s);
|
|
400
|
+
await store.delAttrs(s);
|
|
401
|
+
await store.addDir(d);
|
|
402
|
+
await store.setModified(d, mod ?? now);
|
|
403
|
+
if (Object.keys(attrs).length > 0) await store.setAttrs(d, attrs);
|
|
404
|
+
const prefix = rstripSlash4(s) + "/";
|
|
405
|
+
const dPrefix = rstripSlash4(d) + "/";
|
|
406
|
+
const files = await store.listFiles();
|
|
407
|
+
for (const key of files) {
|
|
408
|
+
if (key.startsWith(prefix)) {
|
|
409
|
+
const newKey = dPrefix + key.slice(prefix.length);
|
|
410
|
+
const data = await store.getFile(key);
|
|
411
|
+
if (data === null) continue;
|
|
412
|
+
const subAttrs = await store.getAttrs(key);
|
|
413
|
+
await store.delFile(key);
|
|
414
|
+
await store.delAttrs(key);
|
|
415
|
+
await store.setFile(newKey, data);
|
|
416
|
+
if (Object.keys(subAttrs).length > 0) await store.setAttrs(newKey, subAttrs);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
await invalidateAfterUnlink(s);
|
|
420
|
+
await invalidateAfterWrite5(d);
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
throw new Error(`file not found: ${s}`);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// src/core/redis/rm.ts
|
|
427
|
+
import { invalidateAfterUnlink as invalidateAfterUnlink2, rstripSlash as rstripSlash5 } from "@struktoai/mirage-core";
|
|
428
|
+
async function rmR(accessor, path) {
|
|
429
|
+
const p = norm(path.mountPath);
|
|
430
|
+
const store = accessor.store;
|
|
431
|
+
const prefix = rstripSlash5(p) + "/";
|
|
432
|
+
const files = await store.listFiles();
|
|
433
|
+
for (const key of files) {
|
|
434
|
+
if (key === p || key.startsWith(prefix)) {
|
|
435
|
+
await store.delFile(key);
|
|
436
|
+
await store.delModified(key);
|
|
437
|
+
await store.delAttrs(key);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const dirs = await store.listDirs();
|
|
441
|
+
for (const key of dirs) {
|
|
442
|
+
if (key === p || key.startsWith(prefix)) {
|
|
443
|
+
await store.removeDir(key);
|
|
444
|
+
await store.delModified(key);
|
|
445
|
+
await store.delAttrs(key);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
await invalidateAfterUnlink2(path);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// src/core/redis/rmdir.ts
|
|
452
|
+
import { invalidateAfterUnlink as invalidateAfterUnlink3, rstripSlash as rstripSlash6 } from "@struktoai/mirage-core";
|
|
453
|
+
async function rmdir(accessor, path) {
|
|
454
|
+
const p = norm(path.mountPath);
|
|
455
|
+
const store = accessor.store;
|
|
456
|
+
if (!await store.hasDir(p)) {
|
|
457
|
+
throw new Error(`not a directory: ${p}`);
|
|
458
|
+
}
|
|
459
|
+
const prefix = rstripSlash6(p) + "/";
|
|
460
|
+
const files = await store.listFiles();
|
|
461
|
+
const dirs = await store.listDirs();
|
|
462
|
+
const candidates = [...files, ...dirs];
|
|
463
|
+
for (const k of candidates) {
|
|
464
|
+
if (k !== p && k.startsWith(prefix)) {
|
|
465
|
+
throw new Error(`directory not empty: ${p}`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
await store.removeDir(p);
|
|
469
|
+
await invalidateAfterUnlink3(path);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// src/core/redis/set_attrs.ts
|
|
473
|
+
import { enoent as enoent3 } from "@struktoai/mirage-core";
|
|
474
|
+
async function setAttrs(accessor, path, fields) {
|
|
475
|
+
const store = accessor.store;
|
|
476
|
+
const p = norm(path.mountPath);
|
|
477
|
+
if (!await store.hasFile(p) && !await store.hasDir(p)) {
|
|
478
|
+
throw enoent3(path);
|
|
479
|
+
}
|
|
480
|
+
const encoded = {};
|
|
481
|
+
if (fields.mode !== void 0) encoded.mode = String(fields.mode);
|
|
482
|
+
if (fields.uid !== void 0) encoded.uid = String(fields.uid);
|
|
483
|
+
if (fields.gid !== void 0) encoded.gid = String(fields.gid);
|
|
484
|
+
if (fields.atime !== void 0) encoded.atime = fields.atime;
|
|
485
|
+
if (Object.keys(encoded).length > 0) {
|
|
486
|
+
await store.setAttrs(p, encoded);
|
|
487
|
+
}
|
|
488
|
+
if (fields.mtime !== void 0) {
|
|
489
|
+
await store.setModified(p, fields.mtime);
|
|
490
|
+
}
|
|
491
|
+
return {};
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// src/core/redis/stream.ts
|
|
495
|
+
import {
|
|
496
|
+
recordStream,
|
|
497
|
+
ResourceName as ResourceName3
|
|
498
|
+
} from "@struktoai/mirage-core";
|
|
499
|
+
import { enoent as enoent4 } from "@struktoai/mirage-core";
|
|
500
|
+
async function* stream(accessor, path, _index) {
|
|
501
|
+
const p = norm(path.mountPath);
|
|
502
|
+
const data = await accessor.store.getFile(p);
|
|
503
|
+
if (data === null) throw enoent4(path);
|
|
504
|
+
const rec = recordStream("read", p, ResourceName3.REDIS);
|
|
505
|
+
if (rec !== null) rec.bytes = data.byteLength;
|
|
506
|
+
yield data;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// src/core/redis/truncate.ts
|
|
510
|
+
import { invalidateAfterWrite as invalidateAfterWrite6 } from "@struktoai/mirage-core";
|
|
511
|
+
async function truncate(accessor, path, length) {
|
|
512
|
+
const p = norm(path.mountPath);
|
|
513
|
+
const store = accessor.store;
|
|
514
|
+
const existing = await store.getFile(p);
|
|
515
|
+
const data = existing ?? new Uint8Array(0);
|
|
516
|
+
const out = new Uint8Array(length);
|
|
517
|
+
const copyLen = Math.min(data.byteLength, length);
|
|
518
|
+
out.set(data.subarray(0, copyLen), 0);
|
|
519
|
+
await store.setFile(p, out);
|
|
520
|
+
await store.setModified(p, nowIso());
|
|
521
|
+
await invalidateAfterWrite6(p);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// src/core/redis/unlink.ts
|
|
525
|
+
import { invalidateAfterUnlink as invalidateAfterUnlink4 } from "@struktoai/mirage-core";
|
|
526
|
+
async function unlink(accessor, path) {
|
|
527
|
+
const p = norm(path.mountPath);
|
|
528
|
+
const store = accessor.store;
|
|
529
|
+
if (!await store.hasFile(p)) {
|
|
530
|
+
throw new Error(`file not found: ${p}`);
|
|
531
|
+
}
|
|
532
|
+
await store.delFile(p);
|
|
533
|
+
await store.delModified(p);
|
|
534
|
+
await store.delAttrs(p);
|
|
535
|
+
await invalidateAfterUnlink4(p);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// src/core/redis/write.ts
|
|
539
|
+
import { ResourceName as ResourceName4, invalidateAfterWrite as invalidateAfterWrite7, record as record3 } from "@struktoai/mirage-core";
|
|
540
|
+
async function writeBytes(accessor, path, data) {
|
|
541
|
+
const start = performance.now();
|
|
542
|
+
const p = norm(path.mountPath);
|
|
543
|
+
const par = parent(p);
|
|
544
|
+
const store = accessor.store;
|
|
545
|
+
if (par !== "/" && !await store.hasDir(par)) {
|
|
546
|
+
throw new Error(`parent directory does not exist: ${par}`);
|
|
547
|
+
}
|
|
548
|
+
await store.setFile(p, data);
|
|
549
|
+
await store.setModified(p, nowIso());
|
|
550
|
+
record3("write", p, ResourceName4.REDIS, data.byteLength, start);
|
|
551
|
+
await invalidateAfterWrite7(p);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// src/commands/builtin/redis/io.ts
|
|
555
|
+
var REDIS_IO = {
|
|
556
|
+
readdir,
|
|
557
|
+
readBytes: read,
|
|
558
|
+
readStream: stream,
|
|
559
|
+
stat,
|
|
560
|
+
isMounted: () => true,
|
|
561
|
+
local: true,
|
|
562
|
+
maxGlobMatches: SCOPE_ERROR,
|
|
563
|
+
write: writeBytes,
|
|
564
|
+
exists,
|
|
565
|
+
mkdir,
|
|
566
|
+
unlink,
|
|
567
|
+
rmdir,
|
|
568
|
+
rmR,
|
|
569
|
+
rename,
|
|
570
|
+
copy,
|
|
571
|
+
create,
|
|
572
|
+
truncate,
|
|
573
|
+
append: appendBytes,
|
|
574
|
+
setAttrs,
|
|
575
|
+
find,
|
|
576
|
+
duTotal: du,
|
|
577
|
+
duAll: async (accessor, path) => {
|
|
578
|
+
const { entries, total } = await duAll(accessor, path);
|
|
579
|
+
return [entries, total];
|
|
580
|
+
}
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
// src/commands/builtin/redis/index.ts
|
|
584
|
+
var REDIS_COMMANDS = [
|
|
585
|
+
...makeFiletypeCommands({
|
|
586
|
+
resource: ResourceName5.REDIS,
|
|
587
|
+
readBytes: read,
|
|
588
|
+
statEntry: stat
|
|
589
|
+
}),
|
|
590
|
+
...makeGenericCommands(ResourceName5.REDIS, REDIS_IO)
|
|
591
|
+
];
|
|
592
|
+
|
|
593
|
+
// src/accessor/redis.ts
|
|
594
|
+
import { Accessor } from "@struktoai/mirage-core";
|
|
595
|
+
var RedisAccessor = class extends Accessor {
|
|
596
|
+
store;
|
|
597
|
+
constructor(store) {
|
|
598
|
+
super();
|
|
599
|
+
this.store = store;
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
// src/ops/redis/index.ts
|
|
604
|
+
import { ResourceName as ResourceName6, makeGenericOps } from "@struktoai/mirage-core";
|
|
605
|
+
var REDIS_OPS = makeGenericOps(ResourceName6.REDIS, REDIS_IO, {
|
|
606
|
+
filetypeRead: [".feather", ".hdf5", ".parquet"],
|
|
607
|
+
forwardIndex: false
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
// src/resource/redis/prompt.ts
|
|
611
|
+
var REDIS_PROMPT = `Redis-backed persistent filesystem. Behaves like a standard filesystem.
|
|
612
|
+
Standard commands: ls, cat, head, tail, grep, wc, find, tree, mkdir, touch, cp, mv, rm, tee.`;
|
|
613
|
+
|
|
614
|
+
// src/resource/redis/store.ts
|
|
615
|
+
var RedisStore = class {
|
|
616
|
+
url;
|
|
617
|
+
keyPrefix;
|
|
618
|
+
providedClient;
|
|
619
|
+
clientPromise = null;
|
|
620
|
+
constructor(options = {}) {
|
|
621
|
+
this.url = options.url ?? "redis://localhost:6379/0";
|
|
622
|
+
this.keyPrefix = options.keyPrefix ?? "mirage:fs:";
|
|
623
|
+
this.providedClient = options.client ?? null;
|
|
624
|
+
}
|
|
625
|
+
fk(path) {
|
|
626
|
+
return `${this.keyPrefix}file:${path}`;
|
|
627
|
+
}
|
|
628
|
+
dk() {
|
|
629
|
+
return `${this.keyPrefix}dir`;
|
|
630
|
+
}
|
|
631
|
+
mk(path) {
|
|
632
|
+
return `${this.keyPrefix}modified:${path}`;
|
|
633
|
+
}
|
|
634
|
+
ak(path) {
|
|
635
|
+
return `${this.keyPrefix}attrs:${path}`;
|
|
636
|
+
}
|
|
637
|
+
async client() {
|
|
638
|
+
if (this.providedClient !== null) return this.providedClient;
|
|
639
|
+
this.clientPromise ??= (async () => {
|
|
640
|
+
const mod = await loadOptionalPeer(
|
|
641
|
+
() => import("redis"),
|
|
642
|
+
{ feature: "RedisResource / RedisFileCacheStore", packageName: "redis" }
|
|
643
|
+
);
|
|
644
|
+
const c = mod.createClient({
|
|
645
|
+
url: this.url,
|
|
646
|
+
socket: { reconnectStrategy: false }
|
|
647
|
+
});
|
|
648
|
+
await c.connect();
|
|
649
|
+
await c.sAdd(this.dk(), "/");
|
|
650
|
+
return c;
|
|
651
|
+
})();
|
|
652
|
+
return this.clientPromise;
|
|
653
|
+
}
|
|
654
|
+
async getFile(path) {
|
|
655
|
+
const c = await this.client();
|
|
656
|
+
const typed = c;
|
|
657
|
+
const mod = await import("redis");
|
|
658
|
+
const blob = mod.RESP_TYPES.BLOB_STRING;
|
|
659
|
+
const mapping = { [blob]: Buffer };
|
|
660
|
+
const raw = await typed.withTypeMapping(mapping).get(this.fk(path));
|
|
661
|
+
if (raw === null) return null;
|
|
662
|
+
return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength);
|
|
663
|
+
}
|
|
664
|
+
async setFile(path, data) {
|
|
665
|
+
const c = await this.client();
|
|
666
|
+
await c.set(this.fk(path), Buffer.from(data.buffer, data.byteOffset, data.byteLength));
|
|
667
|
+
}
|
|
668
|
+
async delFile(path) {
|
|
669
|
+
const c = await this.client();
|
|
670
|
+
await c.del(this.fk(path));
|
|
671
|
+
}
|
|
672
|
+
async hasFile(path) {
|
|
673
|
+
const c = await this.client();
|
|
674
|
+
return await c.exists(this.fk(path)) > 0;
|
|
675
|
+
}
|
|
676
|
+
async listFiles(prefix = "") {
|
|
677
|
+
const c = await this.client();
|
|
678
|
+
const pattern = `${this.keyPrefix}file:${prefix}*`;
|
|
679
|
+
const strip = `${this.keyPrefix}file:`.length;
|
|
680
|
+
const result = [];
|
|
681
|
+
for await (const k of c.scanIterator({ MATCH: pattern })) {
|
|
682
|
+
const keys = Array.isArray(k) ? k : [k];
|
|
683
|
+
for (const key of keys) result.push(key.slice(strip));
|
|
684
|
+
}
|
|
685
|
+
return result.sort();
|
|
686
|
+
}
|
|
687
|
+
async fileLen(path) {
|
|
688
|
+
const c = await this.client();
|
|
689
|
+
return c.strLen(this.fk(path));
|
|
690
|
+
}
|
|
691
|
+
async hasDir(path) {
|
|
692
|
+
const c = await this.client();
|
|
693
|
+
return await c.sIsMember(this.dk(), path) === 1;
|
|
694
|
+
}
|
|
695
|
+
async addDir(path) {
|
|
696
|
+
const c = await this.client();
|
|
697
|
+
await c.sAdd(this.dk(), path);
|
|
698
|
+
}
|
|
699
|
+
async removeDir(path) {
|
|
700
|
+
const c = await this.client();
|
|
701
|
+
await c.sRem(this.dk(), path);
|
|
702
|
+
}
|
|
703
|
+
async listDirs() {
|
|
704
|
+
const c = await this.client();
|
|
705
|
+
const members = await c.sMembers(this.dk());
|
|
706
|
+
return new Set(members);
|
|
707
|
+
}
|
|
708
|
+
async getModified(path) {
|
|
709
|
+
const c = await this.client();
|
|
710
|
+
return c.get(this.mk(path));
|
|
711
|
+
}
|
|
712
|
+
async setModified(path, ts) {
|
|
713
|
+
const c = await this.client();
|
|
714
|
+
await c.set(this.mk(path), ts);
|
|
715
|
+
}
|
|
716
|
+
async delModified(path) {
|
|
717
|
+
const c = await this.client();
|
|
718
|
+
await c.del(this.mk(path));
|
|
719
|
+
}
|
|
720
|
+
async getAttrs(path) {
|
|
721
|
+
const c = await this.client();
|
|
722
|
+
const raw = await c.hGetAll(this.ak(path));
|
|
723
|
+
return { ...raw };
|
|
724
|
+
}
|
|
725
|
+
async setAttrs(path, fields) {
|
|
726
|
+
const c = await this.client();
|
|
727
|
+
await c.hSet(this.ak(path), fields);
|
|
728
|
+
}
|
|
729
|
+
async delAttrs(path) {
|
|
730
|
+
const c = await this.client();
|
|
731
|
+
await c.del(this.ak(path));
|
|
732
|
+
}
|
|
733
|
+
async clear() {
|
|
734
|
+
const c = await this.client();
|
|
735
|
+
for (const pattern of [
|
|
736
|
+
`${this.keyPrefix}file:*`,
|
|
737
|
+
`${this.keyPrefix}modified:*`,
|
|
738
|
+
`${this.keyPrefix}attrs:*`
|
|
739
|
+
]) {
|
|
740
|
+
const keys = [];
|
|
741
|
+
for await (const k of c.scanIterator({ MATCH: pattern })) {
|
|
742
|
+
if (Array.isArray(k)) keys.push(...k);
|
|
743
|
+
else keys.push(k);
|
|
744
|
+
}
|
|
745
|
+
if (keys.length > 0) await c.del(keys);
|
|
746
|
+
}
|
|
747
|
+
await c.del(this.dk());
|
|
748
|
+
}
|
|
749
|
+
async close() {
|
|
750
|
+
if (this.providedClient !== null) return;
|
|
751
|
+
if (this.clientPromise === null) return;
|
|
752
|
+
const c = await this.clientPromise;
|
|
753
|
+
const typed = c;
|
|
754
|
+
if (typeof typed.destroy === "function") typed.destroy();
|
|
755
|
+
else if (c.isOpen) await c.quit();
|
|
756
|
+
this.clientPromise = null;
|
|
757
|
+
}
|
|
758
|
+
};
|
|
759
|
+
|
|
760
|
+
// src/resource/redis/redis.ts
|
|
761
|
+
var globCore = makeResolveGlob(readdir, SCOPE_ERROR);
|
|
762
|
+
var RedisResource = class extends BaseResource {
|
|
763
|
+
kind = ResourceName7.REDIS;
|
|
764
|
+
cachesReads = false;
|
|
765
|
+
indexTtl = 0;
|
|
766
|
+
prompt = REDIS_PROMPT;
|
|
767
|
+
url;
|
|
768
|
+
keyPrefix;
|
|
769
|
+
store;
|
|
770
|
+
accessor;
|
|
771
|
+
opsMap = {
|
|
772
|
+
read_bytes: read,
|
|
773
|
+
write: writeBytes,
|
|
774
|
+
readdir,
|
|
775
|
+
stat,
|
|
776
|
+
unlink,
|
|
777
|
+
rmdir,
|
|
778
|
+
copy,
|
|
779
|
+
rename,
|
|
780
|
+
mkdir,
|
|
781
|
+
read_stream: stream,
|
|
782
|
+
rm_recursive: rmR,
|
|
783
|
+
du_total: du,
|
|
784
|
+
du_all: duAll,
|
|
785
|
+
create,
|
|
786
|
+
truncate,
|
|
787
|
+
exists,
|
|
788
|
+
find_flat: find,
|
|
789
|
+
append: appendBytes
|
|
790
|
+
};
|
|
791
|
+
constructor(options = {}) {
|
|
792
|
+
super();
|
|
793
|
+
this.url = options.url ?? "redis://localhost:6379/0";
|
|
794
|
+
this.keyPrefix = options.keyPrefix ?? "mirage:fs:";
|
|
795
|
+
this.store = new RedisStore({ url: this.url, keyPrefix: this.keyPrefix });
|
|
796
|
+
this.accessor = new RedisAccessor(this.store);
|
|
797
|
+
}
|
|
798
|
+
async open() {
|
|
799
|
+
await this.store.client();
|
|
800
|
+
}
|
|
801
|
+
close() {
|
|
802
|
+
return this.store.close();
|
|
803
|
+
}
|
|
804
|
+
client() {
|
|
805
|
+
return this.store.client();
|
|
806
|
+
}
|
|
807
|
+
module() {
|
|
808
|
+
return import("redis");
|
|
809
|
+
}
|
|
810
|
+
ops() {
|
|
811
|
+
return REDIS_OPS;
|
|
812
|
+
}
|
|
813
|
+
commands() {
|
|
814
|
+
return REDIS_COMMANDS;
|
|
815
|
+
}
|
|
816
|
+
streamPath(p) {
|
|
817
|
+
return stream(this.accessor, p);
|
|
818
|
+
}
|
|
819
|
+
readFile(p) {
|
|
820
|
+
return read(this.accessor, p);
|
|
821
|
+
}
|
|
822
|
+
writeFile(p, data) {
|
|
823
|
+
return writeBytes(this.accessor, p, data);
|
|
824
|
+
}
|
|
825
|
+
appendFile(p, data) {
|
|
826
|
+
return appendBytes(this.accessor, p, data);
|
|
827
|
+
}
|
|
828
|
+
readdir(p) {
|
|
829
|
+
return readdir(this.accessor, p, this.index);
|
|
830
|
+
}
|
|
831
|
+
stat(p) {
|
|
832
|
+
return stat(this.accessor, p);
|
|
833
|
+
}
|
|
834
|
+
exists(p) {
|
|
835
|
+
return exists(this.accessor, p);
|
|
836
|
+
}
|
|
837
|
+
mkdir(p, options) {
|
|
838
|
+
return mkdir(this.accessor, p, options?.recursive === true);
|
|
839
|
+
}
|
|
840
|
+
rmdir(p) {
|
|
841
|
+
return rmdir(this.accessor, p);
|
|
842
|
+
}
|
|
843
|
+
unlink(p) {
|
|
844
|
+
return unlink(this.accessor, p);
|
|
845
|
+
}
|
|
846
|
+
rename(src, dst) {
|
|
847
|
+
return rename(this.accessor, src, dst);
|
|
848
|
+
}
|
|
849
|
+
truncate(p, length) {
|
|
850
|
+
return truncate(this.accessor, p, length);
|
|
851
|
+
}
|
|
852
|
+
copy(src, dst) {
|
|
853
|
+
return copy(this.accessor, src, dst);
|
|
854
|
+
}
|
|
855
|
+
rmR(p) {
|
|
856
|
+
return rmR(this.accessor, p);
|
|
857
|
+
}
|
|
858
|
+
du(p) {
|
|
859
|
+
return du(this.accessor, p);
|
|
860
|
+
}
|
|
861
|
+
find(p, options = {}) {
|
|
862
|
+
return find(this.accessor, p, options);
|
|
863
|
+
}
|
|
864
|
+
glob(paths, prefix = "") {
|
|
865
|
+
const effective = prefix ? paths.map(
|
|
866
|
+
(p) => mountPrefixOf2(p.virtual, p.resourcePath) ? p : new PathSpec({
|
|
867
|
+
virtual: p.virtual,
|
|
868
|
+
directory: p.directory,
|
|
869
|
+
...p.pattern !== null ? { pattern: p.pattern } : {},
|
|
870
|
+
resolved: p.resolved,
|
|
871
|
+
resourcePath: mountKey(p.virtual, prefix)
|
|
872
|
+
})
|
|
873
|
+
) : paths;
|
|
874
|
+
return globCore(this.accessor, effective, this.index);
|
|
875
|
+
}
|
|
876
|
+
async getState() {
|
|
877
|
+
const files = {};
|
|
878
|
+
for (const key of await this.store.listFiles()) {
|
|
879
|
+
const data = await this.store.getFile(key);
|
|
880
|
+
if (data !== null) files[key] = data;
|
|
881
|
+
}
|
|
882
|
+
const dirs = [...await this.store.listDirs()].sort();
|
|
883
|
+
const c = await this.store.client();
|
|
884
|
+
const attrs = {};
|
|
885
|
+
const attrsStrip = `${this.keyPrefix}attrs:`.length;
|
|
886
|
+
for await (const key of c.scanIterator({ MATCH: `${this.keyPrefix}attrs:*` })) {
|
|
887
|
+
for (const k of Array.isArray(key) ? key : [key]) {
|
|
888
|
+
attrs[k.slice(attrsStrip)] = { ...await c.hGetAll(k) };
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
const modified = {};
|
|
892
|
+
const modStrip = `${this.keyPrefix}modified:`.length;
|
|
893
|
+
for await (const key of c.scanIterator({ MATCH: `${this.keyPrefix}modified:*` })) {
|
|
894
|
+
for (const k of Array.isArray(key) ? key : [key]) {
|
|
895
|
+
const val = await c.get(k);
|
|
896
|
+
if (val !== null) modified[k.slice(modStrip)] = val;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
return {
|
|
900
|
+
type: this.kind,
|
|
901
|
+
config: {
|
|
902
|
+
url: REDACTED_SECRET,
|
|
903
|
+
keyPrefix: this.keyPrefix
|
|
904
|
+
},
|
|
905
|
+
keyPrefix: this.keyPrefix,
|
|
906
|
+
files,
|
|
907
|
+
dirs,
|
|
908
|
+
attrs,
|
|
909
|
+
modified
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
async loadState(state) {
|
|
913
|
+
const c = await this.store.client();
|
|
914
|
+
const pipe = c.multi();
|
|
915
|
+
const dirKey = `${this.keyPrefix}dir`;
|
|
916
|
+
for (const [path, data] of Object.entries(state.files)) {
|
|
917
|
+
pipe.set(
|
|
918
|
+
`${this.keyPrefix}file:${path}`,
|
|
919
|
+
Buffer.from(data.buffer, data.byteOffset, data.byteLength)
|
|
920
|
+
);
|
|
921
|
+
}
|
|
922
|
+
for (const dir of state.dirs) {
|
|
923
|
+
pipe.sAdd(dirKey, dir);
|
|
924
|
+
}
|
|
925
|
+
for (const [path, fields] of Object.entries(state.attrs ?? {})) {
|
|
926
|
+
if (Object.keys(fields).length > 0) {
|
|
927
|
+
pipe.hSet(`${this.keyPrefix}attrs:${path}`, fields);
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
for (const [path, ts] of Object.entries(state.modified ?? {})) {
|
|
931
|
+
pipe.set(`${this.keyPrefix}modified:${path}`, ts);
|
|
932
|
+
}
|
|
933
|
+
await pipe.exec();
|
|
934
|
+
}
|
|
935
|
+
};
|
|
936
|
+
|
|
937
|
+
export {
|
|
938
|
+
stat,
|
|
939
|
+
REDIS_COMMANDS,
|
|
940
|
+
RedisAccessor,
|
|
941
|
+
REDIS_OPS,
|
|
942
|
+
REDIS_PROMPT,
|
|
943
|
+
RedisStore,
|
|
944
|
+
RedisResource
|
|
945
|
+
};
|
|
946
|
+
//# sourceMappingURL=chunk-OSVZKYXS.js.map
|