framefields 2.12.0 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audio/index.d.mts +6 -5
- package/dist/audio/index.mjs +13 -13
- package/dist/{audio-afTBdB3U.d.mts → audio-CHV33Od9.d.mts} +3 -4
- package/dist/audio-CHV33Od9.d.mts.map +1 -0
- package/dist/{audio-DHLoNcxD.mjs → audio-DHzLQ_RG.mjs} +4 -4
- package/dist/{audio-DHLoNcxD.mjs.map → audio-DHzLQ_RG.mjs.map} +1 -1
- package/dist/{audio-KHBadECb.mjs → audio-DS9Jg2ls.mjs} +1 -1
- package/dist/{audio-KHBadECb.mjs.map → audio-DS9Jg2ls.mjs.map} +1 -1
- package/dist/{check-result-Culfu7Nx.mjs → check-result-DZWx73V8.mjs} +1 -1
- package/dist/{check-result-Culfu7Nx.mjs.map → check-result-DZWx73V8.mjs.map} +1 -1
- package/dist/cli/check-worker.mjs +51 -51
- package/dist/cli/check-worker.mjs.map +1 -1
- package/dist/cli/local-worker.d.mts +28 -0
- package/dist/cli/local-worker.d.mts.map +1 -0
- package/dist/cli/local-worker.mjs +83 -0
- package/dist/cli/local-worker.mjs.map +1 -0
- package/dist/cli.mjs +229 -54
- package/dist/cli.mjs.map +1 -1
- package/dist/cloud/index.d.mts +2 -0
- package/dist/cloud/index.d.mts.map +1 -1
- package/dist/cloud/index.mjs +1 -1
- package/dist/{cloud-COid1Ipa.mjs → cloud-Cj1TIme8.mjs} +306 -7
- package/dist/cloud-Cj1TIme8.mjs.map +1 -0
- package/dist/components/index.d.mts +15 -14
- package/dist/components/index.mjs +47 -47
- package/dist/{dist-CySGkG54.mjs → dist-BSKAbyea.mjs} +2 -2
- package/dist/{dist-CySGkG54.mjs.map → dist-BSKAbyea.mjs.map} +1 -1
- package/dist/{dist-BwtxciN4.mjs → dist-B_rSWeOz.mjs} +1 -1
- package/dist/{dist-Bf2_efYP.mjs → dist-C8XSqfTx.mjs} +1 -1
- package/dist/{dist-Bf2_efYP.mjs.map → dist-C8XSqfTx.mjs.map} +1 -1
- package/dist/{dist-BSqeChht.mjs → dist-CUNvNDS3.mjs} +129 -82
- package/dist/dist-CUNvNDS3.mjs.map +1 -0
- package/dist/dist-CiTgmfUw.mjs +502 -0
- package/dist/dist-CiTgmfUw.mjs.map +1 -0
- package/dist/{dist-B-OPY7Cs.mjs → dist-D3BeAZ7X.mjs} +44 -10
- package/dist/dist-D3BeAZ7X.mjs.map +1 -0
- package/dist/{dist-BIE8fvlv.mjs → dist-DgZpN6IK.mjs} +1 -1
- package/dist/{dist-BIE8fvlv.mjs.map → dist-DgZpN6IK.mjs.map} +1 -1
- package/dist/{dist-2_lT3Dwc.mjs → dist-Kbf-JTry.mjs} +2 -2
- package/dist/{dist-2_lT3Dwc.mjs.map → dist-Kbf-JTry.mjs.map} +1 -1
- package/dist/effects/index.d.mts +6 -6
- package/dist/effects/index.mjs +36 -36
- package/dist/{effects-C8CL9cOq.mjs → effects-BiDgCK1L.mjs} +3 -3
- package/dist/{effects-C8CL9cOq.mjs.map → effects-BiDgCK1L.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +3 -3
- package/dist/{fonts-BQrDjnpV.mjs → fonts-DeDPWdvJ.mjs} +2 -2
- package/dist/{fonts-BQrDjnpV.mjs.map → fonts-DeDPWdvJ.mjs.map} +1 -1
- package/dist/{gpu-DHa-3Dou.mjs → gpu-CWjgql4C.mjs} +2 -2
- package/dist/{gpu-DHa-3Dou.mjs.map → gpu-CWjgql4C.mjs.map} +1 -1
- package/dist/index-BFTtXosj.d.mts +63 -0
- package/dist/index-BFTtXosj.d.mts.map +1 -0
- package/dist/{index-BW0Q1ygn.d.mts → index-C5sgRLlG.d.mts} +1 -1
- package/dist/{index-BW0Q1ygn.d.mts.map → index-C5sgRLlG.d.mts.map} +1 -1
- package/dist/{index-CdCrae-I.d.mts → index-CnZhBlob.d.mts} +2 -2
- package/dist/index-CnZhBlob.d.mts.map +1 -0
- package/dist/{index-CTv9ZieD.d.mts → index-D68eGFNE.d.mts} +3 -30
- package/dist/index-D68eGFNE.d.mts.map +1 -0
- package/dist/{index-WwuuX8ZJ.d.mts → index-DBh3WphX.d.mts} +2 -2
- package/dist/{index-WwuuX8ZJ.d.mts.map → index-DBh3WphX.d.mts.map} +1 -1
- package/dist/{index-gOVtTm-P.d.mts → index-DQ1U3HC3.d.mts} +14 -6
- package/dist/index-DQ1U3HC3.d.mts.map +1 -0
- package/dist/{index-CAuNuvIg.d.mts → index-Dibc_xpC.d.mts} +5 -5
- package/dist/{index-CAuNuvIg.d.mts.map → index-Dibc_xpC.d.mts.map} +1 -1
- package/dist/{index-BNClElng.d.mts → index-E2IXX0Cz.d.mts} +282 -284
- package/dist/index-E2IXX0Cz.d.mts.map +1 -0
- package/dist/{index-Fliv2Z-w.d.mts → index-X2u96TEo.d.mts} +131 -5
- package/dist/index-X2u96TEo.d.mts.map +1 -0
- package/dist/{index-Drk6HC2k.d.mts → index-YB9j9KUx.d.mts} +3 -3
- package/dist/{index-Drk6HC2k.d.mts.map → index-YB9j9KUx.d.mts.map} +1 -1
- package/dist/{index-COYNQ_mf.d.mts → index-a6JrbAK0.d.mts} +1 -1
- package/dist/{index-COYNQ_mf.d.mts.map → index-a6JrbAK0.d.mts.map} +1 -1
- package/dist/{index-DQa7mhzq.d.mts → index-rtCXNxGO.d.mts} +2 -2
- package/dist/{index-DQa7mhzq.d.mts.map → index-rtCXNxGO.d.mts.map} +1 -1
- package/dist/index.d.mts +16 -15
- package/dist/index.mjs +58 -58
- package/dist/preview/index.d.mts +5 -4
- package/dist/preview/index.mjs +12 -12
- package/dist/{preview-BUtt481A.mjs → preview-PDz7o2xg.mjs} +323 -35
- package/dist/preview-PDz7o2xg.mjs.map +1 -0
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/chunk-4P3MMJWD.mjs +1 -0
- package/dist/preview-engine/{chunk-4JNIEQS2.mjs → chunk-77WWW75O.mjs} +1 -1
- package/dist/preview-engine/{chunk-UKZVUYB6.mjs → chunk-7M5LE6EM.mjs} +1 -1
- package/dist/preview-engine/{chunk-KBCZKIIQ.mjs → chunk-CYM75INB.mjs} +1 -1
- package/dist/preview-engine/chunk-FRJPXWAG.mjs +1 -0
- package/dist/preview-engine/{chunk-FJTURGJV.mjs → chunk-IEEV5RB3.mjs} +1 -1
- package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
- package/dist/preview-engine/{chunk-RGKS6YIA.mjs → chunk-N2VISDTG.mjs} +1 -1
- package/dist/preview-engine/{chunk-O75BFM4S.mjs → chunk-NVXFEDJS.mjs} +1 -1
- package/dist/preview-engine/{chunk-VUO4K52B.mjs → chunk-PD2HKW2S.mjs} +1 -1
- package/dist/preview-engine/{chunk-HTAHYSCW.mjs → chunk-R4H52Q7S.mjs} +1 -1
- package/dist/preview-engine/{chunk-6O7UDVNL.mjs → chunk-RYSV44B4.mjs} +1 -1
- package/dist/preview-engine/{chunk-JAUMCOOJ.mjs → chunk-SMHEMYCV.mjs} +1 -1
- package/dist/preview-engine/{chunk-TKXOSEIJ.mjs → chunk-SV3ZNZQU.mjs} +1 -1
- package/dist/preview-engine/{chunk-32WC4FRR.mjs → chunk-UE7Y65C3.mjs} +3 -3
- package/dist/preview-engine/chunk-UFPA36D2.mjs +2227 -0
- package/dist/preview-engine/{chunk-M4QVCQ3O.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-EYKN2VET.mjs → chunk-XYCR3STG.mjs} +1 -1
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/{renderers-L6GFGHS6.mjs → renderers-AFTUFMQQ.mjs} +1 -1
- package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -1
- package/dist/preview-engine/{renderers-PREFONJG.mjs → renderers-EPSF5CSQ.mjs} +1 -1
- package/dist/preview-engine/{renderers-R22CDFO4.mjs → renderers-OJWWIVNW.mjs} +1 -1
- package/dist/preview-engine/{renderers-TS32FDV7.mjs → renderers-RHMRWX46.mjs} +1 -1
- package/dist/preview-engine/{renderers-PSBTV2DO.mjs → renderers-TTXTV4PC.mjs} +1 -1
- package/dist/preview-engine/renderers-VEHYARKY.mjs +1 -0
- package/dist/preview-engine/renderers-VRXAG3FR.mjs +1 -0
- package/dist/preview-engine/renderers-ZHSOWEMQ.mjs +1 -0
- package/dist/preview-engine/renderers-ZMDRNYSS.mjs +1 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/preview-engine/{src-GPF7RIBU.mjs → src-YXNX4MLK.mjs} +1 -1
- package/dist/{program-Cvv_nb9T.mjs → program-Bn6ko_I4.mjs} +4 -4
- package/dist/{program-Cvv_nb9T.mjs.map → program-Bn6ko_I4.mjs.map} +1 -1
- package/dist/renderer/index.d.mts +4 -3
- package/dist/renderer/index.mjs +3 -3
- package/dist/{renderer-CZClDMgF.mjs → renderer--Q0pM9Vh.mjs} +5 -5
- package/dist/{renderer-CZClDMgF.mjs.map → renderer--Q0pM9Vh.mjs.map} +1 -1
- package/dist/renderer-1aSF5BmY.mjs +5 -0
- package/dist/{renderer-tRi3KNoG.mjs → renderer-45ifiDkn.mjs} +5 -5
- package/dist/{renderer-tRi3KNoG.mjs.map → renderer-45ifiDkn.mjs.map} +1 -1
- package/dist/{renderer-BTd6tFcS.mjs → renderer-549d94qG.mjs} +5 -5
- package/dist/{renderer-BTd6tFcS.mjs.map → renderer-549d94qG.mjs.map} +1 -1
- package/dist/{renderer-CMCmljb0.mjs → renderer-B-LUGB9h.mjs} +3 -3
- package/dist/{renderer-CMCmljb0.mjs.map → renderer-B-LUGB9h.mjs.map} +1 -1
- package/dist/renderer-B2e4Gr9u.mjs +5 -0
- package/dist/{renderer-sMFJtt_H.mjs → renderer-B5b-ehRb.mjs} +3 -3
- package/dist/{renderer-sMFJtt_H.mjs.map → renderer-B5b-ehRb.mjs.map} +1 -1
- package/dist/renderer-B6fz4j50.mjs +5 -0
- package/dist/{renderer-BJEexai1.mjs → renderer-BCTUqJG7.mjs} +5 -5
- package/dist/{renderer-BJEexai1.mjs.map → renderer-BCTUqJG7.mjs.map} +1 -1
- package/dist/renderer-BEftIYw-.mjs +5 -0
- package/dist/{renderer-smP1F57W.mjs → renderer-BHPgkoEL.mjs} +4 -4
- package/dist/{renderer-smP1F57W.mjs.map → renderer-BHPgkoEL.mjs.map} +1 -1
- package/dist/renderer-BHTnO-7e.mjs +5 -0
- package/dist/{renderer-LrAldCWN.mjs → renderer-BIieU9pY.mjs} +5 -5
- package/dist/{renderer-LrAldCWN.mjs.map → renderer-BIieU9pY.mjs.map} +1 -1
- package/dist/{renderer-snjhPaP-.mjs → renderer-BKi6jDi_.mjs} +4 -4
- package/dist/{renderer-snjhPaP-.mjs.map → renderer-BKi6jDi_.mjs.map} +1 -1
- package/dist/renderer-BMlnQqTO.mjs +5 -0
- package/dist/{renderer-C2kFIZ4r.mjs → renderer-BMpmmYOq.mjs} +4 -4
- package/dist/{renderer-C2kFIZ4r.mjs.map → renderer-BMpmmYOq.mjs.map} +1 -1
- package/dist/{renderer-_KIBvES8.mjs → renderer-BO_wuUKA.mjs} +5 -5
- package/dist/{renderer-_KIBvES8.mjs.map → renderer-BO_wuUKA.mjs.map} +1 -1
- package/dist/renderer-BOzcFezY.mjs +5 -0
- package/dist/{renderer-DLaUT6JZ.mjs → renderer-BPOh9x5X.mjs} +4 -4
- package/dist/{renderer-DLaUT6JZ.mjs.map → renderer-BPOh9x5X.mjs.map} +1 -1
- package/dist/{renderer-CNpq7rL-.mjs → renderer-BPiWsrC2.mjs} +3 -3
- package/dist/{renderer-CNpq7rL-.mjs.map → renderer-BPiWsrC2.mjs.map} +1 -1
- package/dist/{renderer-t1sXDiqm.mjs → renderer-BUj7jE6t.mjs} +3 -3
- package/dist/{renderer-t1sXDiqm.mjs.map → renderer-BUj7jE6t.mjs.map} +1 -1
- package/dist/renderer-BVbjJIKJ.mjs +5 -0
- package/dist/renderer-BXsHKf4k.mjs +5 -0
- package/dist/{renderer-rKw5_EjG.mjs → renderer-BZgJj8Cl.mjs} +4 -4
- package/dist/{renderer-rKw5_EjG.mjs.map → renderer-BZgJj8Cl.mjs.map} +1 -1
- package/dist/{renderer-5fGj_tqN.mjs → renderer-BgjPbgbn.mjs} +6 -6
- package/dist/{renderer-5fGj_tqN.mjs.map → renderer-BgjPbgbn.mjs.map} +1 -1
- package/dist/{renderer-D3QPNBEj.mjs → renderer-BjgFpwVK.mjs} +5 -5
- package/dist/{renderer-D3QPNBEj.mjs.map → renderer-BjgFpwVK.mjs.map} +1 -1
- package/dist/renderer-Bks49NVl.mjs +5 -0
- package/dist/{renderer-HhJPFidU.mjs → renderer-BlZgyBSo.mjs} +5 -5
- package/dist/{renderer-HhJPFidU.mjs.map → renderer-BlZgyBSo.mjs.map} +1 -1
- package/dist/{renderer-DO_zXwMJ.mjs → renderer-BqUAyzCZ.mjs} +5 -5
- package/dist/{renderer-DO_zXwMJ.mjs.map → renderer-BqUAyzCZ.mjs.map} +1 -1
- package/dist/{renderer-O4y02xkD.mjs → renderer-Br8km655.mjs} +4 -4
- package/dist/{renderer-O4y02xkD.mjs.map → renderer-Br8km655.mjs.map} +1 -1
- package/dist/{renderer-DEoerd-j.mjs → renderer-BsMZ5Iaq.mjs} +4 -4
- package/dist/{renderer-DEoerd-j.mjs.map → renderer-BsMZ5Iaq.mjs.map} +1 -1
- package/dist/{renderer-BBjkX0Vt.mjs → renderer-BtgqTg2K.mjs} +3 -3
- package/dist/{renderer-BOg8i8eF.mjs → renderer-BuvKGwk3.mjs} +1 -1
- package/dist/{renderer-BOg8i8eF.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
- package/dist/{renderer-DsPLMzy1.mjs → renderer-C-3qhk5x.mjs} +2 -2
- package/dist/{renderer-DsPLMzy1.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
- package/dist/{renderer-BwV-o_1b.mjs → renderer-C-GTxnfv.mjs} +4 -4
- package/dist/{renderer-BwV-o_1b.mjs.map → renderer-C-GTxnfv.mjs.map} +1 -1
- package/dist/renderer-C-t7qFKr.mjs +5 -0
- package/dist/{renderer-Bxiiar50.mjs → renderer-C1ctHdXl.mjs} +4 -4
- package/dist/{renderer-Bxiiar50.mjs.map → renderer-C1ctHdXl.mjs.map} +1 -1
- package/dist/renderer-C24n-6CX.mjs +6 -0
- package/dist/{renderer-xNOKSN3V.mjs → renderer-C7m7Yxgc.mjs} +5 -5
- package/dist/{renderer-xNOKSN3V.mjs.map → renderer-C7m7Yxgc.mjs.map} +1 -1
- package/dist/{renderer-4uZGSmUD.mjs → renderer-C9dqx3U7.mjs} +5 -5
- package/dist/{renderer-4uZGSmUD.mjs.map → renderer-C9dqx3U7.mjs.map} +1 -1
- package/dist/renderer-CCReX-7M.mjs +5 -0
- package/dist/{renderer-CtpEzVBn.mjs → renderer-CE4535aW.mjs} +3 -3
- package/dist/{renderer-CtpEzVBn.mjs.map → renderer-CE4535aW.mjs.map} +1 -1
- package/dist/renderer-CIxFQrAm.mjs +5 -0
- package/dist/{renderer-6g1ri445.mjs → renderer-CL-vyXgX.mjs} +5 -5
- package/dist/{renderer-6g1ri445.mjs.map → renderer-CL-vyXgX.mjs.map} +1 -1
- package/dist/renderer-CLHBMIqJ.mjs +5 -0
- package/dist/renderer-CMJKi-Ye.mjs +5 -0
- package/dist/{renderer-Bf7Z7WT5.mjs → renderer-CMnlgAGs.mjs} +4 -4
- package/dist/{renderer-Bf7Z7WT5.mjs.map → renderer-CMnlgAGs.mjs.map} +1 -1
- package/dist/{renderer-uA0UCxjA.mjs → renderer-CQFMyC_c.mjs} +4 -4
- package/dist/{renderer-uA0UCxjA.mjs.map → renderer-CQFMyC_c.mjs.map} +1 -1
- package/dist/{renderer-DKFaVaRJ.mjs → renderer-CYwVNbUh.mjs} +4 -4
- package/dist/{renderer-DKFaVaRJ.mjs.map → renderer-CYwVNbUh.mjs.map} +1 -1
- package/dist/{renderer-DZIxduEt.mjs → renderer-CZ5mwBW1.mjs} +3 -3
- package/dist/{renderer-DZIxduEt.mjs.map → renderer-CZ5mwBW1.mjs.map} +1 -1
- package/dist/{renderer-BSsKlcHk.mjs → renderer-C_1eqfI0.mjs} +5 -5
- package/dist/{renderer-BSsKlcHk.mjs.map → renderer-C_1eqfI0.mjs.map} +1 -1
- package/dist/renderer-C_H3mHZa.mjs +5 -0
- package/dist/{renderer-CGpi8CDT.mjs → renderer-CciiDHuU.mjs} +4 -4
- package/dist/{renderer-CGpi8CDT.mjs.map → renderer-CciiDHuU.mjs.map} +1 -1
- package/dist/renderer-CfkTdR5B.mjs +5 -0
- package/dist/{renderer-DGXqspB9.mjs → renderer-CgK7Q1G8.mjs} +3 -3
- package/dist/{renderer-B09I95bo.mjs → renderer-CnL8Cmmr.mjs} +3 -3
- package/dist/renderer-CnhkXJ0R.mjs +5 -0
- package/dist/{renderer-BwJ0nXXu.mjs → renderer-Cp_HOmp7.mjs} +5 -5
- package/dist/{renderer-BwJ0nXXu.mjs.map → renderer-Cp_HOmp7.mjs.map} +1 -1
- package/dist/renderer-CqpyVsq_.mjs +5 -0
- package/dist/renderer-CtWgIpTE.mjs +5 -0
- package/dist/{renderer-C3CGYjrC.mjs → renderer-Cu3iKMSJ.mjs} +5 -5
- package/dist/{renderer-C3CGYjrC.mjs.map → renderer-Cu3iKMSJ.mjs.map} +1 -1
- package/dist/{renderer-BzTj_CeK.mjs → renderer-CuPAQjDK.mjs} +4 -4
- package/dist/{renderer-BzTj_CeK.mjs.map → renderer-CuPAQjDK.mjs.map} +1 -1
- package/dist/{renderer-FvvywNvv.mjs → renderer-CwlY8Tb-.mjs} +3 -3
- package/dist/{renderer-FvvywNvv.mjs.map → renderer-CwlY8Tb-.mjs.map} +1 -1
- package/dist/{renderer-ByFPmHBC.mjs → renderer-CxSFvKd1.mjs} +4 -4
- package/dist/{renderer-ByFPmHBC.mjs.map → renderer-CxSFvKd1.mjs.map} +1 -1
- package/dist/{renderer-DL3o_lG1.mjs → renderer-CyUiXLRa.mjs} +5 -5
- package/dist/{renderer-DL3o_lG1.mjs.map → renderer-CyUiXLRa.mjs.map} +1 -1
- package/dist/renderer-CyuKr5ca.mjs +5 -0
- package/dist/renderer-CzgcZXKH.mjs +3 -0
- package/dist/{renderer-DCMoBppL.mjs → renderer-D-GWBoVT.mjs} +3 -3
- package/dist/{renderer-DCMoBppL.mjs.map → renderer-D-GWBoVT.mjs.map} +1 -1
- package/dist/{renderer-IAffbHXx.mjs → renderer-D-fzEZfX.mjs} +4 -4
- package/dist/{renderer-IAffbHXx.mjs.map → renderer-D-fzEZfX.mjs.map} +1 -1
- package/dist/renderer-D5yp74NL.mjs +3 -0
- package/dist/{renderer-BC_Nse6h.mjs → renderer-D8gN7aqk.mjs} +4 -4
- package/dist/{renderer-BC_Nse6h.mjs.map → renderer-D8gN7aqk.mjs.map} +1 -1
- package/dist/renderer-D9ON_1Hf.mjs +5 -0
- package/dist/renderer-DAnTgh4o.mjs +5 -0
- package/dist/{renderer-Dak_wVh9.mjs → renderer-DGOMfyh8.mjs} +2 -2
- package/dist/{renderer-Dak_wVh9.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
- package/dist/{renderer-CInMMs5x.mjs → renderer-DGb_wgTW.mjs} +6 -6
- package/dist/{renderer-CInMMs5x.mjs.map → renderer-DGb_wgTW.mjs.map} +1 -1
- package/dist/{renderer-DO1SZ5xY.mjs → renderer-DJPZs_zV.mjs} +5 -5
- package/dist/{renderer-DO1SZ5xY.mjs.map → renderer-DJPZs_zV.mjs.map} +1 -1
- package/dist/renderer-DKJOon6y.d.mts +1 -0
- package/dist/{renderer-DQJHjU0L.mjs → renderer-DOZPZTxe.mjs} +5 -5
- package/dist/{renderer-DQJHjU0L.mjs.map → renderer-DOZPZTxe.mjs.map} +1 -1
- package/dist/{renderer-DaY04IyU.mjs → renderer-DRal7Goa.mjs} +5 -5
- package/dist/{renderer-DaY04IyU.mjs.map → renderer-DRal7Goa.mjs.map} +1 -1
- package/dist/renderer-DWgpivA3.mjs +5 -0
- package/dist/{renderer-qVJdxbXB.mjs → renderer-DXFJv_e6.mjs} +4 -4
- package/dist/{renderer-qVJdxbXB.mjs.map → renderer-DXFJv_e6.mjs.map} +1 -1
- package/dist/renderer-Dh_qNNwR.mjs +5 -0
- package/dist/renderer-DkCpXPMP.mjs +5 -0
- package/dist/{renderer-PnnkUWm-.mjs → renderer-Dp5ChuOs.mjs} +4 -4
- package/dist/{renderer-PnnkUWm-.mjs.map → renderer-Dp5ChuOs.mjs.map} +1 -1
- package/dist/{renderer-C_gR2H3R.mjs → renderer-DpZballM.mjs} +3 -3
- package/dist/{renderer-C_gR2H3R.mjs.map → renderer-DpZballM.mjs.map} +1 -1
- package/dist/renderer-Dre-6cDR.mjs +5 -0
- package/dist/renderer-Ds5z4_HX.mjs +5 -0
- package/dist/{renderer-b0H3oDae.mjs → renderer-DwGlDNOV.mjs} +3 -3
- package/dist/{renderer-b0H3oDae.mjs.map → renderer-DwGlDNOV.mjs.map} +1 -1
- package/dist/{renderer-oBgCEqaM.mjs → renderer-DxB_OfLs.mjs} +4 -4
- package/dist/{renderer-oBgCEqaM.mjs.map → renderer-DxB_OfLs.mjs.map} +1 -1
- package/dist/{renderer-BvRM3OZ6.mjs → renderer-Dz6P-rPI.mjs} +3 -3
- package/dist/{renderer-BvRM3OZ6.mjs.map → renderer-Dz6P-rPI.mjs.map} +1 -1
- package/dist/{renderer-DrL3J9ci.mjs → renderer-FPiLBwj5.mjs} +4 -4
- package/dist/{renderer-DrL3J9ci.mjs.map → renderer-FPiLBwj5.mjs.map} +1 -1
- package/dist/renderer-HGSCOMyP.mjs +5 -0
- package/dist/renderer-KMY8W-cJ.mjs +5 -0
- package/dist/{renderer-BXGuCnCJ.mjs → renderer-KgsVk9c6.mjs} +4 -4
- package/dist/{renderer-BXGuCnCJ.mjs.map → renderer-KgsVk9c6.mjs.map} +1 -1
- package/dist/{renderer-CLTRTtQ8.mjs → renderer-LXhEPCmy.mjs} +5 -5
- package/dist/{renderer-CLTRTtQ8.mjs.map → renderer-LXhEPCmy.mjs.map} +1 -1
- package/dist/{renderer-CN-mCIoI.mjs → renderer-NBMmvqWl.mjs} +5 -5
- package/dist/{renderer-CN-mCIoI.mjs.map → renderer-NBMmvqWl.mjs.map} +1 -1
- package/dist/{renderer-HXw4cJZx.mjs → renderer-Nnu32rqg.mjs} +3 -3
- package/dist/{renderer-HXw4cJZx.mjs.map → renderer-Nnu32rqg.mjs.map} +1 -1
- package/dist/renderer-R21YvXz3.mjs +5 -0
- package/dist/{renderer-Dj54y3h3.mjs → renderer-RAq3LnNy.mjs} +3 -3
- package/dist/{renderer-Dj54y3h3.mjs.map → renderer-RAq3LnNy.mjs.map} +1 -1
- package/dist/renderer-RtzCz37W.mjs +5 -0
- package/dist/{renderer-CiHVnhUk.mjs → renderer-RzkU_O1i.mjs} +5 -5
- package/dist/{renderer-CiHVnhUk.mjs.map → renderer-RzkU_O1i.mjs.map} +1 -1
- package/dist/{renderer-D3YbHjRG.mjs → renderer-S9tVGneU.mjs} +95 -80
- package/dist/renderer-S9tVGneU.mjs.map +1 -0
- package/dist/{renderer-DP9ScNM6.mjs → renderer-SJyp9-62.mjs} +3 -3
- package/dist/{renderer-DP9ScNM6.mjs.map → renderer-SJyp9-62.mjs.map} +1 -1
- package/dist/{renderer-TiaHrU5z.mjs → renderer-_54hiCq0.mjs} +5 -5
- package/dist/{renderer-TiaHrU5z.mjs.map → renderer-_54hiCq0.mjs.map} +1 -1
- package/dist/{renderer-CcmxR6Fy.d.mts → renderer-aRk849b3.d.mts} +2 -2
- package/dist/{renderer-CcmxR6Fy.d.mts.map → renderer-aRk849b3.d.mts.map} +1 -1
- package/dist/{renderer-Dy1xQOTu.mjs → renderer-dGEMVaZ3.mjs} +4 -4
- package/dist/{renderer-Dy1xQOTu.mjs.map → renderer-dGEMVaZ3.mjs.map} +1 -1
- package/dist/{renderer-Dp9FQKVP.mjs → renderer-dRXP2dJU.mjs} +5 -5
- package/dist/{renderer-Dp9FQKVP.mjs.map → renderer-dRXP2dJU.mjs.map} +1 -1
- package/dist/{renderer-DwH5e3hx.mjs → renderer-g9SstkTz.mjs} +3 -3
- package/dist/renderer-iMrqAjix.mjs +5 -0
- package/dist/{renderer-DX60Kr20.mjs → renderer-opVuiAQR.mjs} +3 -3
- package/dist/{renderer-DX60Kr20.mjs.map → renderer-opVuiAQR.mjs.map} +1 -1
- package/dist/{renderer-DrK6pyfz.mjs → renderer-puQhVfDS.mjs} +5 -5
- package/dist/{renderer-DrK6pyfz.mjs.map → renderer-puQhVfDS.mjs.map} +1 -1
- package/dist/renderer-sMed1u1O.mjs +5 -0
- package/dist/renderer-tsAuo46l.mjs +5 -0
- package/dist/{renderer-DaLy1dFA.mjs → renderer-vll8LX0I.mjs} +9 -9
- package/dist/{renderer-DaLy1dFA.mjs.map → renderer-vll8LX0I.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-DWRjjeUg.mjs → renderers-CP8CFWDs-BRQyvcut.mjs} +4 -4
- package/dist/{renderers-CP8CFWDs-DWRjjeUg.mjs.map → renderers-CP8CFWDs-BRQyvcut.mjs.map} +1 -1
- package/dist/sam/index.d.mts +3 -3
- package/dist/sam/index.mjs +1 -1
- package/dist/signals/index.d.mts +7 -7
- package/dist/signals/index.mjs +8 -8
- package/dist/{signals-BfJ1aqpT.mjs → signals-tiho_9fp.mjs} +4 -4
- package/dist/{signals-BfJ1aqpT.mjs.map → signals-tiho_9fp.mjs.map} +1 -1
- package/dist/{src-BU6vm9sP-DFJ3phW0.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +3 -3
- package/dist/{src-BU6vm9sP-DFJ3phW0.mjs.map → src-BU6vm9sP-DdTHmCr4.mjs.map} +1 -1
- package/dist/{src-D7M8VTzv.mjs → src-BzFGotRc.mjs} +11 -11
- package/dist/{src-D7M8VTzv.mjs.map → src-BzFGotRc.mjs.map} +1 -1
- package/dist/storage/index.d.mts +206 -0
- package/dist/storage/index.d.mts.map +1 -0
- package/dist/storage/index.mjs +3 -0
- package/package.json +67 -59
- package/dist/audio-afTBdB3U.d.mts.map +0 -1
- package/dist/cloud-COid1Ipa.mjs.map +0 -1
- package/dist/dist-B-OPY7Cs.mjs.map +0 -1
- package/dist/dist-BSqeChht.mjs.map +0 -1
- package/dist/index-BNClElng.d.mts.map +0 -1
- package/dist/index-CTv9ZieD.d.mts.map +0 -1
- package/dist/index-CdCrae-I.d.mts.map +0 -1
- package/dist/index-Fliv2Z-w.d.mts.map +0 -1
- package/dist/index-gOVtTm-P.d.mts.map +0 -1
- package/dist/preview-BUtt481A.mjs.map +0 -1
- package/dist/preview-engine/chunk-5SLBE2FX.mjs +0 -1
- package/dist/preview-engine/chunk-74J4DJQA.mjs +0 -1
- package/dist/preview-engine/chunk-KIPXBOYG.mjs +0 -1974
- package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
- package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
- package/dist/preview-engine/renderers-TEKHQHCL.mjs +0 -1
- package/dist/preview-engine/renderers-U3RLYFCN.mjs +0 -1
- package/dist/preview-engine/renderers-V5HM6PZ2.mjs +0 -1
- package/dist/preview-engine/renderers-ZGX3A3QZ.mjs +0 -1
- package/dist/renderer--RJepuOy.mjs +0 -5
- package/dist/renderer-B1U6YRRV.d.mts +0 -117
- package/dist/renderer-B1U6YRRV.d.mts.map +0 -1
- package/dist/renderer-B4NFnaty.mjs +0 -5
- package/dist/renderer-B6g4ts0e.mjs +0 -5
- package/dist/renderer-BGoAr-tl.mjs +0 -5
- package/dist/renderer-BSOdBgdE.mjs +0 -5
- package/dist/renderer-BU6O0fpM.mjs +0 -5
- package/dist/renderer-BZ97iidG.mjs +0 -5
- package/dist/renderer-B_Klh1VT.mjs +0 -5
- package/dist/renderer-BaWQM1y-.mjs +0 -5
- package/dist/renderer-Bc0jvAj0.mjs +0 -5
- package/dist/renderer-Bd-NuU3M.mjs +0 -3
- package/dist/renderer-Bm077kZ6.mjs +0 -5
- package/dist/renderer-BtzE_e_Y.mjs +0 -5
- package/dist/renderer-C225eCAo.mjs +0 -5
- package/dist/renderer-CC4fhNup.mjs +0 -3
- package/dist/renderer-CLXdR4vz.mjs +0 -5
- package/dist/renderer-CszM8B3C.mjs +0 -5
- package/dist/renderer-Ctp8ZYfk.mjs +0 -5
- package/dist/renderer-CxQdSp8I.mjs +0 -5
- package/dist/renderer-D3YbHjRG.mjs.map +0 -1
- package/dist/renderer-D4GMRtDd.mjs +0 -6
- package/dist/renderer-DEsGIvTZ.mjs +0 -5
- package/dist/renderer-DIaUQ0EP.mjs +0 -5
- package/dist/renderer-DLjqcNzQ.mjs +0 -5
- package/dist/renderer-DMuQZa51.mjs +0 -5
- package/dist/renderer-DOgi2aF2.mjs +0 -5
- package/dist/renderer-DSh7cvi4.mjs +0 -5
- package/dist/renderer-DV1LVBBP.mjs +0 -5
- package/dist/renderer-Dhrj2bJz.mjs +0 -5
- package/dist/renderer-DoFUu1R4.mjs +0 -5
- package/dist/renderer-DsydX3cx.mjs +0 -5
- package/dist/renderer-DxVSoeYi.mjs +0 -5
- package/dist/renderer-Nc9bHb0n.mjs +0 -5
- package/dist/renderer-TFaSD2Db.mjs +0 -5
- package/dist/renderer-Z61ctppe.mjs +0 -5
- package/dist/renderer-awXf3sNS.mjs +0 -5
- package/dist/renderer-cHT28oYI.mjs +0 -5
- package/dist/renderer-g7Y3bFot.mjs +0 -5
- package/dist/renderer-qVv0OzVc.mjs +0 -5
- /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
- /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
//#region ../storage/dist/index.d.mts
|
|
2
|
+
//#region src/manifest.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The `storage` and `assets` sections of a project's `framefields.json`.
|
|
5
|
+
*
|
|
6
|
+
* ```json
|
|
7
|
+
* {
|
|
8
|
+
* "storage": {
|
|
9
|
+
* "remotes": {
|
|
10
|
+
* "media": {
|
|
11
|
+
* "endpoint": "https://<account>.r2.cloudflarestorage.com",
|
|
12
|
+
* "bucket": "films",
|
|
13
|
+
* "publicUrl": "https://media.example.com"
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* },
|
|
17
|
+
* "assets": {
|
|
18
|
+
* "assets/footage/intro.mp4": { "sha256": "…", "size": 48213 }
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Assets are stored by content (`sha256/ab/<hash>`), so the manifest pins
|
|
24
|
+
* exact bytes the way a lockfile pins packages, and the files themselves
|
|
25
|
+
* stay out of git.
|
|
26
|
+
*/
|
|
27
|
+
/** An S3-compatible bucket: Cloudflare R2, AWS S3, Backblaze B2, MinIO, … */
|
|
28
|
+
interface StorageRemote {
|
|
29
|
+
/** The S3 API endpoint, e.g. `https://<account>.r2.cloudflarestorage.com`. */
|
|
30
|
+
endpoint: string;
|
|
31
|
+
bucket: string;
|
|
32
|
+
/** SigV4 region. Default `auto` (R2); AWS needs the bucket's region. */
|
|
33
|
+
region?: string;
|
|
34
|
+
/** Key prefix inside the bucket, e.g. `films/launch/`. */
|
|
35
|
+
prefix?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Where the bucket is publicly readable: a custom domain (an R2 custom
|
|
38
|
+
* domain or any CDN in front of the bucket) or the `r2.dev` URL. Reads use
|
|
39
|
+
* it instead of signed URLs, so anyone can pull and render without keys.
|
|
40
|
+
*/
|
|
41
|
+
publicUrl?: string;
|
|
42
|
+
}
|
|
43
|
+
interface StorageConfig {
|
|
44
|
+
/** The remote new assets go to. Default: the only remote. */
|
|
45
|
+
default?: string;
|
|
46
|
+
remotes: Record<string, StorageRemote>;
|
|
47
|
+
}
|
|
48
|
+
/** One file the project needs, pinned by content. */
|
|
49
|
+
interface AssetEntry {
|
|
50
|
+
sha256: string;
|
|
51
|
+
size: number;
|
|
52
|
+
/** The remote holding it. Default: `storage.default`. */
|
|
53
|
+
remote?: string;
|
|
54
|
+
/** A fixed https URL to fetch it from instead of a remote (public media). */
|
|
55
|
+
url?: string;
|
|
56
|
+
}
|
|
57
|
+
type AssetManifest = Record<string, AssetEntry>;
|
|
58
|
+
declare const REMOTE_NAME: RegExp;
|
|
59
|
+
declare const SHA256: RegExp;
|
|
60
|
+
declare class ManifestError extends Error {
|
|
61
|
+
name: string;
|
|
62
|
+
}
|
|
63
|
+
/** Validates `storage`; errors name the remote and field at fault. */
|
|
64
|
+
declare function parseStorage(value: unknown): StorageConfig;
|
|
65
|
+
/** Validates `assets`; errors name the path and field at fault. */
|
|
66
|
+
declare function parseAssets(value: unknown, storage?: StorageConfig): AssetManifest;
|
|
67
|
+
/** The remote an asset (or a new one, without `name`) belongs to. */
|
|
68
|
+
declare function pickRemote(storage: StorageConfig | undefined, name?: string): {
|
|
69
|
+
name: string;
|
|
70
|
+
remote: StorageRemote;
|
|
71
|
+
};
|
|
72
|
+
/** The object key holding `sha256`: `<prefix>sha256/ab/<hash>`. */
|
|
73
|
+
declare function objectKey(sha256: string, prefix?: string): string;
|
|
74
|
+
/** The asset's URL on the remote's public domain, if it has one. */
|
|
75
|
+
declare function publicUrl(remote: StorageRemote, sha256: string): string | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Where to download an asset without credentials: a signed URL handed in
|
|
78
|
+
* (`signed`, by sha256), its own `url`, or its remote's public domain.
|
|
79
|
+
* Undefined means the asset is on a private remote and needs a signature.
|
|
80
|
+
*/
|
|
81
|
+
declare function readUrl(entry: AssetEntry, storage: StorageConfig | undefined, signed?: Readonly<Record<string, string>>): string | undefined;
|
|
82
|
+
declare function isAssetPath(path: string): boolean;
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/bucket.d.ts
|
|
85
|
+
interface Credentials {
|
|
86
|
+
accessKeyId: string;
|
|
87
|
+
secretAccessKey: string;
|
|
88
|
+
sessionToken?: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Keys for `remote` from the environment:
|
|
92
|
+
* `FRAMEFIELDS_STORAGE_<REMOTE>_ACCESS_KEY_ID` / `…_SECRET_ACCESS_KEY`
|
|
93
|
+
* (the remote's name upper-cased, `-` as `_`), else the standard
|
|
94
|
+
* `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`.
|
|
95
|
+
*/
|
|
96
|
+
declare function credentialsFromEnv(remote: string, env?: Readonly<Record<string, string | undefined>>): Credentials | undefined;
|
|
97
|
+
/** The env vars `credentialsFromEnv` reads for `remote`, for messages. */
|
|
98
|
+
declare function credentialEnvNames(remote: string): [string, string];
|
|
99
|
+
declare class StorageError extends Error {
|
|
100
|
+
readonly status?: number | undefined;
|
|
101
|
+
name: string;
|
|
102
|
+
constructor(message: string, status?: number | undefined);
|
|
103
|
+
}
|
|
104
|
+
interface UploadProgress {
|
|
105
|
+
sent: number;
|
|
106
|
+
total: number;
|
|
107
|
+
}
|
|
108
|
+
interface BucketOptions {
|
|
109
|
+
fetch?: typeof fetch;
|
|
110
|
+
/** Files above this go up in parts. Default 64 MiB. */
|
|
111
|
+
multipartThreshold?: number;
|
|
112
|
+
/** Default 16 MiB; grows so a file never needs more than 10,000 parts. */
|
|
113
|
+
partSize?: number;
|
|
114
|
+
/** Parts in flight at once. Default 4. */
|
|
115
|
+
concurrency?: number;
|
|
116
|
+
}
|
|
117
|
+
/** One remote's bucket, signed with `credentials`. */
|
|
118
|
+
declare class Bucket {
|
|
119
|
+
readonly remote: StorageRemote;
|
|
120
|
+
private readonly options;
|
|
121
|
+
private readonly aws;
|
|
122
|
+
private readonly fetch;
|
|
123
|
+
constructor(remote: StorageRemote, credentials: Credentials, options?: BucketOptions);
|
|
124
|
+
keyFor(sha256: string): string;
|
|
125
|
+
/** Whether the bucket holds `sha256` at the expected size. */
|
|
126
|
+
has(sha256: string, size: number): Promise<boolean>;
|
|
127
|
+
/**
|
|
128
|
+
* Uploads `file` (already hashed) under its content key. The bucket
|
|
129
|
+
* checks every byte against the sha256 sent with it.
|
|
130
|
+
*/
|
|
131
|
+
upload(file: string, digest: {
|
|
132
|
+
sha256: string;
|
|
133
|
+
size: number;
|
|
134
|
+
}, onProgress?: (p: UploadProgress) => void): Promise<void>;
|
|
135
|
+
/** A GET URL anyone can use until it expires (at most 7 days). */
|
|
136
|
+
presign(sha256: string, expiresSec?: number): Promise<string>;
|
|
137
|
+
private put;
|
|
138
|
+
private uploadParts;
|
|
139
|
+
private url;
|
|
140
|
+
private send;
|
|
141
|
+
private failure;
|
|
142
|
+
}
|
|
143
|
+
//#endregion
|
|
144
|
+
//#region src/files.d.ts
|
|
145
|
+
type AssetErrorCode = "ASSET_NOT_FOUND" | "ASSET_FORBIDDEN" | "ASSET_DOWNLOAD_FAILED" | "ASSET_HASH_MISMATCH";
|
|
146
|
+
declare class AssetError extends Error {
|
|
147
|
+
readonly code: AssetErrorCode;
|
|
148
|
+
name: string;
|
|
149
|
+
constructor(code: AssetErrorCode, message: string, options?: {
|
|
150
|
+
cause?: unknown;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
interface FileDigest {
|
|
154
|
+
sha256: string;
|
|
155
|
+
size: number;
|
|
156
|
+
}
|
|
157
|
+
declare function hashFile(path: string): Promise<FileDigest>;
|
|
158
|
+
interface DownloadOptions {
|
|
159
|
+
fetch?: typeof fetch;
|
|
160
|
+
signal?: AbortSignal;
|
|
161
|
+
/** Attempts for network errors and 5xx/429 responses. Default 3. */
|
|
162
|
+
attempts?: number;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Downloads `url` to `dest` through a temporary file, and only renames it
|
|
166
|
+
* into place once its size and sha256 match `expected`.
|
|
167
|
+
*/
|
|
168
|
+
declare function downloadVerified(url: string, dest: string, expected: FileDigest, options?: DownloadOptions): Promise<void>;
|
|
169
|
+
/** Signed URLs carry credentials in the query: never print them. */
|
|
170
|
+
declare function redactQuery(url: string): string;
|
|
171
|
+
/** The Content-Type a CDN serves the file with. */
|
|
172
|
+
declare function contentType(path: string): string;
|
|
173
|
+
//#endregion
|
|
174
|
+
//#region src/locate.d.ts
|
|
175
|
+
interface ProjectManifest {
|
|
176
|
+
storage?: StorageConfig;
|
|
177
|
+
assets: AssetManifest;
|
|
178
|
+
}
|
|
179
|
+
/** The nearest folder at or above `dir` holding a framefields.json. */
|
|
180
|
+
declare function findProjectDir(dir: string): string | undefined;
|
|
181
|
+
/** The `storage` and `assets` of the project at `dir`; undefined without assets. */
|
|
182
|
+
declare function readProjectManifest(dir: string): Promise<ProjectManifest | undefined>;
|
|
183
|
+
interface AssetLocator {
|
|
184
|
+
/** The project folder (where framefields.json is). */
|
|
185
|
+
readonly root: string;
|
|
186
|
+
/** The pinned entry for an absolute path, if the project pins it. */
|
|
187
|
+
entry(file: string): AssetEntry | undefined;
|
|
188
|
+
/**
|
|
189
|
+
* A URL to read a pinned file from: its public domain or own URL, else
|
|
190
|
+
* a GET signed with the remote's keys from the environment. Undefined
|
|
191
|
+
* when the file isn't pinned, or is private and there are no keys.
|
|
192
|
+
*/
|
|
193
|
+
url(file: string): Promise<string | undefined>;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Pinned-asset lookup for the project at or above `dir`, or undefined when
|
|
197
|
+
* it pins none.
|
|
198
|
+
*/
|
|
199
|
+
declare function openAssetLocator(dir: string, options?: {
|
|
200
|
+
env?: Readonly<Record<string, string | undefined>>;
|
|
201
|
+
fetch?: typeof fetch;
|
|
202
|
+
}): Promise<AssetLocator | undefined>;
|
|
203
|
+
//#endregion
|
|
204
|
+
//#endregion
|
|
205
|
+
export { type AssetEntry, AssetError, type AssetErrorCode, type AssetLocator, type AssetManifest, Bucket, type BucketOptions, type Credentials, type DownloadOptions, type FileDigest, ManifestError, type ProjectManifest, REMOTE_NAME, SHA256, type StorageConfig, StorageError, type StorageRemote, type UploadProgress, contentType, credentialEnvNames, credentialsFromEnv, downloadVerified, findProjectDir, hashFile, isAssetPath, objectKey, openAssetLocator, parseAssets, parseStorage, pickRemote, publicUrl, readProjectManifest, readUrl, redactQuery };
|
|
206
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":["StorageRemote","StorageConfig","Record","AssetEntry","AssetManifest","REMOTE_NAME","RegExp","SHA256","ManifestError","Error","parseStorage","parseAssets","pickRemote","objectKey","publicUrl","readUrl","Readonly","isAssetPath","Credentials","credentialsFromEnv","credentialEnvNames","StorageError","UploadProgress","BucketOptions","fetch","Bucket","Promise","AssetErrorCode","AssetError","FileDigest","hashFile","DownloadOptions","AbortSignal","downloadVerified","redactQuery","contentType","ProjectManifest","findProjectDir","readProjectManifest","AssetLocator","openAssetLocator"],"sources":["../../../storage/dist/index.d.mts"],"sourcesContent":["//#region src/manifest.d.ts\n/**\n * The `storage` and `assets` sections of a project's `framefields.json`.\n *\n * ```json\n * {\n * \"storage\": {\n * \"remotes\": {\n * \"media\": {\n * \"endpoint\": \"https://<account>.r2.cloudflarestorage.com\",\n * \"bucket\": \"films\",\n * \"publicUrl\": \"https://media.example.com\"\n * }\n * }\n * },\n * \"assets\": {\n * \"assets/footage/intro.mp4\": { \"sha256\": \"…\", \"size\": 48213 }\n * }\n * }\n * ```\n *\n * Assets are stored by content (`sha256/ab/<hash>`), so the manifest pins\n * exact bytes the way a lockfile pins packages, and the files themselves\n * stay out of git.\n */\n/** An S3-compatible bucket: Cloudflare R2, AWS S3, Backblaze B2, MinIO, … */\ninterface StorageRemote {\n /** The S3 API endpoint, e.g. `https://<account>.r2.cloudflarestorage.com`. */\n endpoint: string;\n bucket: string;\n /** SigV4 region. Default `auto` (R2); AWS needs the bucket's region. */\n region?: string;\n /** Key prefix inside the bucket, e.g. `films/launch/`. */\n prefix?: string;\n /**\n * Where the bucket is publicly readable: a custom domain (an R2 custom\n * domain or any CDN in front of the bucket) or the `r2.dev` URL. Reads use\n * it instead of signed URLs, so anyone can pull and render without keys.\n */\n publicUrl?: string;\n}\ninterface StorageConfig {\n /** The remote new assets go to. Default: the only remote. */\n default?: string;\n remotes: Record<string, StorageRemote>;\n}\n/** One file the project needs, pinned by content. */\ninterface AssetEntry {\n sha256: string;\n size: number;\n /** The remote holding it. Default: `storage.default`. */\n remote?: string;\n /** A fixed https URL to fetch it from instead of a remote (public media). */\n url?: string;\n}\ntype AssetManifest = Record<string, AssetEntry>;\ndeclare const REMOTE_NAME: RegExp;\ndeclare const SHA256: RegExp;\ndeclare class ManifestError extends Error {\n name: string;\n}\n/** Validates `storage`; errors name the remote and field at fault. */\ndeclare function parseStorage(value: unknown): StorageConfig;\n/** Validates `assets`; errors name the path and field at fault. */\ndeclare function parseAssets(value: unknown, storage?: StorageConfig): AssetManifest;\n/** The remote an asset (or a new one, without `name`) belongs to. */\ndeclare function pickRemote(storage: StorageConfig | undefined, name?: string): {\n name: string;\n remote: StorageRemote;\n};\n/** The object key holding `sha256`: `<prefix>sha256/ab/<hash>`. */\ndeclare function objectKey(sha256: string, prefix?: string): string;\n/** The asset's URL on the remote's public domain, if it has one. */\ndeclare function publicUrl(remote: StorageRemote, sha256: string): string | undefined;\n/**\n * Where to download an asset without credentials: a signed URL handed in\n * (`signed`, by sha256), its own `url`, or its remote's public domain.\n * Undefined means the asset is on a private remote and needs a signature.\n */\ndeclare function readUrl(entry: AssetEntry, storage: StorageConfig | undefined, signed?: Readonly<Record<string, string>>): string | undefined;\ndeclare function isAssetPath(path: string): boolean;\n//#endregion\n//#region src/bucket.d.ts\ninterface Credentials {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n}\n/**\n * Keys for `remote` from the environment:\n * `FRAMEFIELDS_STORAGE_<REMOTE>_ACCESS_KEY_ID` / `…_SECRET_ACCESS_KEY`\n * (the remote's name upper-cased, `-` as `_`), else the standard\n * `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`.\n */\ndeclare function credentialsFromEnv(remote: string, env?: Readonly<Record<string, string | undefined>>): Credentials | undefined;\n/** The env vars `credentialsFromEnv` reads for `remote`, for messages. */\ndeclare function credentialEnvNames(remote: string): [string, string];\ndeclare class StorageError extends Error {\n readonly status?: number | undefined;\n name: string;\n constructor(message: string, status?: number | undefined);\n}\ninterface UploadProgress {\n sent: number;\n total: number;\n}\ninterface BucketOptions {\n fetch?: typeof fetch;\n /** Files above this go up in parts. Default 64 MiB. */\n multipartThreshold?: number;\n /** Default 16 MiB; grows so a file never needs more than 10,000 parts. */\n partSize?: number;\n /** Parts in flight at once. Default 4. */\n concurrency?: number;\n}\n/** One remote's bucket, signed with `credentials`. */\ndeclare class Bucket {\n readonly remote: StorageRemote;\n private readonly options;\n private readonly aws;\n private readonly fetch;\n constructor(remote: StorageRemote, credentials: Credentials, options?: BucketOptions);\n keyFor(sha256: string): string;\n /** Whether the bucket holds `sha256` at the expected size. */\n has(sha256: string, size: number): Promise<boolean>;\n /**\n * Uploads `file` (already hashed) under its content key. The bucket\n * checks every byte against the sha256 sent with it.\n */\n upload(file: string, digest: {\n sha256: string;\n size: number;\n }, onProgress?: (p: UploadProgress) => void): Promise<void>;\n /** A GET URL anyone can use until it expires (at most 7 days). */\n presign(sha256: string, expiresSec?: number): Promise<string>;\n private put;\n private uploadParts;\n private url;\n private send;\n private failure;\n}\n//#endregion\n//#region src/files.d.ts\ntype AssetErrorCode = \"ASSET_NOT_FOUND\" | \"ASSET_FORBIDDEN\" | \"ASSET_DOWNLOAD_FAILED\" | \"ASSET_HASH_MISMATCH\";\ndeclare class AssetError extends Error {\n readonly code: AssetErrorCode;\n name: string;\n constructor(code: AssetErrorCode, message: string, options?: {\n cause?: unknown;\n });\n}\ninterface FileDigest {\n sha256: string;\n size: number;\n}\ndeclare function hashFile(path: string): Promise<FileDigest>;\ninterface DownloadOptions {\n fetch?: typeof fetch;\n signal?: AbortSignal;\n /** Attempts for network errors and 5xx/429 responses. Default 3. */\n attempts?: number;\n}\n/**\n * Downloads `url` to `dest` through a temporary file, and only renames it\n * into place once its size and sha256 match `expected`.\n */\ndeclare function downloadVerified(url: string, dest: string, expected: FileDigest, options?: DownloadOptions): Promise<void>;\n/** Signed URLs carry credentials in the query: never print them. */\ndeclare function redactQuery(url: string): string;\n/** The Content-Type a CDN serves the file with. */\ndeclare function contentType(path: string): string;\n//#endregion\n//#region src/locate.d.ts\ninterface ProjectManifest {\n storage?: StorageConfig;\n assets: AssetManifest;\n}\n/** The nearest folder at or above `dir` holding a framefields.json. */\ndeclare function findProjectDir(dir: string): string | undefined;\n/** The `storage` and `assets` of the project at `dir`; undefined without assets. */\ndeclare function readProjectManifest(dir: string): Promise<ProjectManifest | undefined>;\ninterface AssetLocator {\n /** The project folder (where framefields.json is). */\n readonly root: string;\n /** The pinned entry for an absolute path, if the project pins it. */\n entry(file: string): AssetEntry | undefined;\n /**\n * A URL to read a pinned file from: its public domain or own URL, else\n * a GET signed with the remote's keys from the environment. Undefined\n * when the file isn't pinned, or is private and there are no keys.\n */\n url(file: string): Promise<string | undefined>;\n}\n/**\n * Pinned-asset lookup for the project at or above `dir`, or undefined when\n * it pins none.\n */\ndeclare function openAssetLocator(dir: string, options?: {\n env?: Readonly<Record<string, string | undefined>>;\n fetch?: typeof fetch;\n}): Promise<AssetLocator | undefined>;\n//#endregion\nexport { type AssetEntry, AssetError, type AssetErrorCode, type AssetLocator, type AssetManifest, Bucket, type BucketOptions, type Credentials, type DownloadOptions, type FileDigest, ManifestError, type ProjectManifest, REMOTE_NAME, SHA256, type StorageConfig, StorageError, type StorageRemote, type UploadProgress, contentType, credentialEnvNames, credentialsFromEnv, downloadVerified, findProjectDir, hashFile, isAssetPath, objectKey, openAssetLocator, parseAssets, parseStorage, pickRemote, publicUrl, readProjectManifest, readUrl, redactQuery };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;AA0BuB;AAkBN;AAGG;AAQO;AACM;AACL;AACa;AAImB;AAEwB;AAI7D;AAGG;AAEsB;;;;;;AAMiD;AACrE;AAGP;;;;;AAW+F,UApE1GA,aAAAA,CAsEOoB;EAAkB;EACK,QAK9BE,EAAAA,MAAAA;EAAc,MAIdC,EAAAA,MAAAA;EACY;EAUHvB,MAAAA,CAAAA,EAAAA,MAAAA;EAIGA;EAA4BkB,MAAAA,CAAAA,EAAAA,MAAAA;EAAuBK;;;;;EAalB,SAAA,CAAA,EAAA,MAAA;AAAA;AASpC,UAtGTtB,aAAAA,CAuGc;EACP0B;EAEGA,OAAAA,CAAAA,EAAAA,MAAAA;EAHalB,OAAAA,EApGtBP,MAoGsBO,CAAAA,MAAAA,EApGPT,aAoGOS,CAAAA;;AAAK;AAOlB,UAxGVN,UAAAA,CA4Ge;EAAuB,MACtC4B,EAAAA,MAAAA;EAEY,IAQLE,EAAAA,MAAAA;EAAsDJ;EAAsBE,MAAAA,CAAAA,EAAAA,MAAAA;EAAkBL;EAAO,GAAA,CAAA,EAAA,MAAA;AAAA;AAE1F,KAjHvBtB,aAAAA,GAAgBF,MAmHO,CAAA,MAAA,EAnHQC,UAmHR,CAAA;AAAA,cAlHdE,WAqHW,EArHEC,MAqHF;AAEF,cAtHTC,MAyHG8B,EAzHK/B,MAyHS;AAAA,cAxHjBE,aAAAA,SAAsBC,KAAAA,CA0HuB2B;EAAD,IAChDG,EAAAA,MAAAA;AAUkB;;iBAjIX7B,YAAAA,CAwITM,KAAAA,EAAAA,OAAAA,CAAAA,EAxIuCf,aAwIvCe;;iBAtISL,WAAAA,CAwIL4B,KAAAA,EAAAA,OAAAA,EAAAA,OAAAA,CAAAA,EAxI2CtC,aAwI3CsC,CAAAA,EAxI2DnC,aAwI3DmC;;iBAtIK3B,UAAAA,CAsIN,OAAA,EAtI0BX,aAsI1B,GAAA,SAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA;;UApIDD;;;iBAGOa,SAAAA;;iBAEAC,SAAAA,SAAkBd;;;;;;iBAMlBe,OAAAA,QAAeZ,qBAAqBF,oCAAoCe,SAASd;iBACjFe,WAAAA;;;UAGPC,WAAAA;;;;;;;;;;;iBAWOC,kBAAAA,uBAAyCH,SAASd,sCAAsCgB;;iBAExFE,kBAAAA;cACHC,YAAAA,SAAqBZ,KAAAA;;;;;UAKzBa,cAAAA;;;;UAIAC,aAAAA;iBACOC;;;;;;;;;cASHC,MAAAA;mBACKzB;;;;sBAIGA,4BAA4BkB,uBAAuBK;;;qCAGpCG;;;;;;;;sBAQfJ,0BAA0BI;;gDAEAA;;;;;;;;;KAS3CC,cAAAA;cACSC,UAAAA,SAAmBnB,KAAAA;iBAChBkB;;oBAEGA;;;;UAIVE,UAAAA;;;;iBAIOC,QAAAA,gBAAwBJ,QAAQG;UACvCE,eAAAA;iBACOP;WACNQ;;;;;;;;iBAQMC,gBAAAA,sCAAsDJ,sBAAsBE,kBAAkBL;;iBAE9FQ,WAAAA;;iBAEAC,WAAAA;;;UAGPC,eAAAA;YACEnC;UACFG;;;iBAGOiC,cAAAA;;iBAEAC,mBAAAA,eAAkCZ,QAAQU;UACjDG,YAAAA;;;;uBAIapC;;;;;;qBAMFuB;;;;;;iBAMJc,gBAAAA;QACTxB,SAASd;iBACAsB;IACbE,QAAQa"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { S as redactQuery, _ as parseStorage, a as SHA256, b as readProjectManifest, c as credentialEnvNames, d as findProjectDir, f as hashFile, g as parseAssets, h as openAssetLocator, i as REMOTE_NAME, l as credentialsFromEnv, m as objectKey, n as Bucket, o as StorageError, p as isAssetPath, r as ManifestError, s as contentType, t as AssetError, u as downloadVerified, v as pickRemote, x as readUrl, y as publicUrl } from "../dist-CiTgmfUw.mjs";
|
|
2
|
+
|
|
3
|
+
export { AssetError, Bucket, ManifestError, REMOTE_NAME, SHA256, StorageError, contentType, credentialEnvNames, credentialsFromEnv, downloadVerified, findProjectDir, hashFile, isAssetPath, objectKey, openAssetLocator, parseAssets, parseStorage, pickRemote, publicUrl, readProjectManifest, readUrl, redactQuery };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "framefields",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.13.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "High-performance WebGPU rendering SDK for video composition, Photoshop-grade 2D VFX, audio DSP, and reactive signals. Built for AI Agents.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -87,6 +87,12 @@
|
|
|
87
87
|
"import": "./dist/cloud/index.mjs",
|
|
88
88
|
"default": "./dist/cloud/index.mjs"
|
|
89
89
|
},
|
|
90
|
+
"./storage": {
|
|
91
|
+
"types": "./dist/storage/index.d.mts",
|
|
92
|
+
"development": "./src/storage/index.ts",
|
|
93
|
+
"import": "./dist/storage/index.mjs",
|
|
94
|
+
"default": "./dist/storage/index.mjs"
|
|
95
|
+
},
|
|
90
96
|
"./sam": {
|
|
91
97
|
"types": "./dist/sam/index.d.mts",
|
|
92
98
|
"development": "./src/sam/index.ts",
|
|
@@ -105,6 +111,7 @@
|
|
|
105
111
|
"@mediabunny/server": "^1.61.6",
|
|
106
112
|
"@napi-rs/webcodecs": "^1.3.1",
|
|
107
113
|
"@resvg/resvg-js": "^2.6.2",
|
|
114
|
+
"aws4fetch": "^1.0.20",
|
|
108
115
|
"d3-format": "^3.1.2",
|
|
109
116
|
"d3-scale": "^4.0.2",
|
|
110
117
|
"d3-shape": "^3.2.0",
|
|
@@ -138,64 +145,65 @@
|
|
|
138
145
|
"tsdown": "^0.19.0",
|
|
139
146
|
"typescript": "^5.8.3",
|
|
140
147
|
"vitest": "4.1.5",
|
|
141
|
-
"@framefields/
|
|
142
|
-
"@framefields/
|
|
143
|
-
"@framefields/
|
|
144
|
-
"@framefields/
|
|
145
|
-
"@framefields/
|
|
146
|
-
"@framefields/node-audio-
|
|
147
|
-
"@framefields/
|
|
148
|
-
"@framefields/node-audio-
|
|
149
|
-
"@framefields/node-
|
|
150
|
-
"@framefields/node-audio-
|
|
151
|
-
"@framefields/node-audio-
|
|
152
|
-
"@framefields/node-
|
|
153
|
-
"@framefields/node-
|
|
154
|
-
"@framefields/node-
|
|
155
|
-
"@framefields/
|
|
156
|
-
"@framefields/node-
|
|
157
|
-
"@framefields/node-
|
|
158
|
-
"@framefields/node-displacement-map": "2.
|
|
159
|
-
"@framefields/node-film-grain": "2.
|
|
160
|
-
"@framefields/node-
|
|
161
|
-
"@framefields/node-gradient-map": "2.
|
|
162
|
-
"@framefields/node-
|
|
163
|
-
"@framefields/node-kenburns": "2.
|
|
164
|
-
"@framefields/node-liquify": "2.
|
|
165
|
-
"@framefields/node-
|
|
166
|
-
"@framefields/node-levels": "2.
|
|
167
|
-
"@framefields/node-
|
|
168
|
-
"@framefields/node-
|
|
169
|
-
"@framefields/node-mask-math": "2.
|
|
170
|
-
"@framefields/node-
|
|
171
|
-
"@framefields/node-
|
|
172
|
-
"@framefields/node-
|
|
173
|
-
"@framefields/node-patch-heal": "2.
|
|
174
|
-
"@framefields/node-
|
|
175
|
-
"@framefields/node-
|
|
176
|
-
"@framefields/node-
|
|
177
|
-
"@framefields/node-
|
|
178
|
-
"@framefields/node-
|
|
179
|
-
"@framefields/node-
|
|
180
|
-
"@framefields/node-
|
|
181
|
-
"@framefields/node-
|
|
182
|
-
"@framefields/node-signal-
|
|
183
|
-
"@framefields/node-signal-
|
|
184
|
-
"@framefields/node-
|
|
185
|
-
"@framefields/node-
|
|
186
|
-
"@framefields/node-
|
|
187
|
-
"@framefields/node-
|
|
188
|
-
"@framefields/node-
|
|
189
|
-
"@framefields/node-
|
|
190
|
-
"@framefields/
|
|
191
|
-
"@framefields/
|
|
192
|
-
"@framefields/
|
|
193
|
-
"@framefields/tensor-webgpu": "2.
|
|
194
|
-
"@framefields/tsconfig": "2.
|
|
195
|
-
"@framefields/vision-sam": "2.
|
|
196
|
-
"@framefields/vision": "2.
|
|
197
|
-
"@framefields/webgpu-renderers": "2.
|
|
198
|
-
"@framefields/
|
|
148
|
+
"@framefields/ai": "2.13.0",
|
|
149
|
+
"@framefields/node-audio-compressor": "2.13.0",
|
|
150
|
+
"@framefields/client-utils": "2.13.0",
|
|
151
|
+
"@framefields/compositions": "2.13.0",
|
|
152
|
+
"@framefields/components": "2.13.0",
|
|
153
|
+
"@framefields/node-audio-noise-gate": "2.13.0",
|
|
154
|
+
"@framefields/core": "2.13.0",
|
|
155
|
+
"@framefields/node-audio-fade": "2.13.0",
|
|
156
|
+
"@framefields/node-audio-reverb": "2.13.0",
|
|
157
|
+
"@framefields/node-audio-parametric-eq": "2.13.0",
|
|
158
|
+
"@framefields/node-audio-delay": "2.13.0",
|
|
159
|
+
"@framefields/node-color-balance": "2.13.0",
|
|
160
|
+
"@framefields/node-crop": "2.13.0",
|
|
161
|
+
"@framefields/node-curves": "2.13.0",
|
|
162
|
+
"@framefields/node-colorkey": "2.13.0",
|
|
163
|
+
"@framefields/node-audio-signal-extractor": "2.13.0",
|
|
164
|
+
"@framefields/node-deflicker": "2.13.0",
|
|
165
|
+
"@framefields/node-displacement-map": "2.13.0",
|
|
166
|
+
"@framefields/node-film-grain": "2.13.0",
|
|
167
|
+
"@framefields/node-blur": "2.13.0",
|
|
168
|
+
"@framefields/node-gradient-map": "2.13.0",
|
|
169
|
+
"@framefields/node-high-pass": "2.13.0",
|
|
170
|
+
"@framefields/node-kenburns": "2.13.0",
|
|
171
|
+
"@framefields/node-liquify": "2.13.0",
|
|
172
|
+
"@framefields/node-corner-pin": "2.13.0",
|
|
173
|
+
"@framefields/node-levels": "2.13.0",
|
|
174
|
+
"@framefields/node-halftone-screen": "2.13.0",
|
|
175
|
+
"@framefields/node-lut": "2.13.0",
|
|
176
|
+
"@framefields/node-mask-math": "2.13.0",
|
|
177
|
+
"@framefields/node-modulate": "2.13.0",
|
|
178
|
+
"@framefields/node-mesh-warp": "2.13.0",
|
|
179
|
+
"@framefields/node-paint": "2.13.0",
|
|
180
|
+
"@framefields/node-patch-heal": "2.13.0",
|
|
181
|
+
"@framefields/node-particles": "2.13.0",
|
|
182
|
+
"@framefields/node-refraction-caustics": "2.13.0",
|
|
183
|
+
"@framefields/node-layer-style": "2.13.0",
|
|
184
|
+
"@framefields/node-refine-edge": "2.13.0",
|
|
185
|
+
"@framefields/node-rotate": "2.13.0",
|
|
186
|
+
"@framefields/node-sdk": "2.13.0",
|
|
187
|
+
"@framefields/node-selective-color": "2.13.0",
|
|
188
|
+
"@framefields/node-shadows-highlights": "2.13.0",
|
|
189
|
+
"@framefields/node-signal-gate": "2.13.0",
|
|
190
|
+
"@framefields/node-signal-math": "2.13.0",
|
|
191
|
+
"@framefields/node-signal": "2.13.0",
|
|
192
|
+
"@framefields/node-stereo-panning": "2.13.0",
|
|
193
|
+
"@framefields/node-unsharp-mask": "2.13.0",
|
|
194
|
+
"@framefields/node-tile-offset": "2.13.0",
|
|
195
|
+
"@framefields/node-vignette": "2.13.0",
|
|
196
|
+
"@framefields/node-vision": "2.13.0",
|
|
197
|
+
"@framefields/renderer": "2.13.0",
|
|
198
|
+
"@framefields/storage": "2.13.0",
|
|
199
|
+
"@framefields/renderers": "2.13.0",
|
|
200
|
+
"@framefields/tensor-webgpu": "2.13.0",
|
|
201
|
+
"@framefields/tsconfig": "2.13.0",
|
|
202
|
+
"@framefields/vision-sam": "2.13.0",
|
|
203
|
+
"@framefields/vision": "2.13.0",
|
|
204
|
+
"@framefields/webgpu-renderers": "2.13.0",
|
|
205
|
+
"@framefields/node-flip": "2.13.0",
|
|
206
|
+
"@framefields/node-relight-3d": "2.13.0"
|
|
199
207
|
},
|
|
200
208
|
"scripts": {
|
|
201
209
|
"build": "tsdown && node ../../scripts/sync-readme.mjs && node scripts/check-bundled-imports.mjs && node scripts/check-components-treeshake.mjs && node scripts/check-registry-types.mjs",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audio-afTBdB3U.d.mts","names":["_framefields_node_sdk_renderer0","_default","NodeRendererPlugin","Readonly","default"],"sources":["../../../nodes/node-modulate/dist/renderer.d.mts","../src/signals/audio.ts"],"sourcesContent":["import * as _framefields_node_sdk_renderer0 from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/index.d.ts\ndeclare const _default: Readonly<_framefields_node_sdk_renderer0.NodeRendererPlugin>;\n//#endregion\nexport { _default as default };\n//# sourceMappingURL=renderer.d.mts.map"],"mappings":";;;;;;cAGcC,UAAUE,SAASH;;;;UCWhB,kBAAA,SAA2B;;;EDX9BC,WAAsE,CAAA,EAAA,UAAnDD,GAAAA,UAAAA,GAAAA,cAAD,GAAA,UAAA;;UCiBf,2BAAA;WACP;EAPO,IAAA,EAQV,WARU,CAAA,MAAmB,CAAA;EAMnB,IAAA,EAGV,WAHU,CAAA,MAAA,CAAA;EACP,MAAA,EAGD,WAHC,CAAA,MAAA,CAAA;EACH,WAAA,EAAA,MAAA;EACA,SAAA,EAAA,MAAA;EACE,UAAA,EAAA,MAAA;EAAW,WAAA,EAAA,OAAA;EAaH,OAAA,EAAA,OAAA;EAKA,aAAA,EAAA,OAAiB;EAE7B,UAAA,EAAA,OAAA;EAEQ,UAAA,EAAA,OAAA;EAEJ,YAAA,EAAA,OAAA;EACO,SAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;AAAgD,UAZ/C,iBAAA,SAA0B,qBAYqB,CAAA;EAAY,GAAA,CAAA,EAAA,MAAA;AAc5E;;AAIW,UAzBM,iBAAA,CAyBN;EACC;EAAR,EAAA,EAxBC,WAwBD,CAAA,MAAA,CAAA;EAoFO;EACC,UAAA,EA3GC,WA2GD,CAAA,MAAA,CAAA;EAAR;EAWQ,MAAA,EApHH,WAoHG,CAAA,MAAA,CAAA;EAED,OAAA,EAAA;IACC,EAAA,EAtHI,YAsHJ;IAAR,UAAA,EAtHsC,YAsHtC;IA4BO,MAAA,EAlJqD,YAkJrD;EACC,CAAA;EAAR,GAAA,EAAA,MAAA;EAAO,SAAA,EAAA,MAAA;;;cArIE;gCAED,8CAED,qBACP,QAAQ;oCAoFD,qBACP,QAAQ;;8BAWA,8CAED,oBACP,QAAQ;;kCA4BD,oBACP,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-COid1Ipa.mjs","names":["fs","resolve"],"sources":["../src/cli/config.ts","../src/cloud/git-source.ts","../src/cloud/index.ts"],"sourcesContent":["/**\n * `framefields.json` at the project root: where installed components live,\n * which fonts `framefields add` / `framefields fonts add` installed, and the\n * project's named renders.\n *\n * ```json\n * {\n * \"components\": \"src/components\",\n * \"renders\": {\n * \"film\": {\n * \"title\": \"Launch film\",\n * \"entry\": \"src/film.ts\",\n * \"export\": \"buildFilm\",\n * \"workers\": \"auto\"\n * }\n * }\n * }\n * ```\n *\n * A named render is what `framefields render film --cloud`, `framefields\n * check film`, `renderCloud({ render: \"film\" })` and the dashboard's New\n * render dialog pick, so nobody chooses files and exports by hand.\n */\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport const CONFIG_FILE = \"framefields.json\";\n\n/** One renderable piece of the project: an export of a module, with its defaults. */\nexport interface RenderSpec {\n\t/** The module that builds the composition, relative to the project root. */\n\tentry: string;\n\t/** A Composition, or a function returning one. Default `buildFilm`. */\n\texport?: string;\n\t/** Shown in the dashboard and `framefields renders`. Default: the name. */\n\ttitle?: string;\n\tdescription?: string;\n\t/** Passed to the export when it is a function. */\n\targs?: unknown;\n\t/** When the export returns several compositions, the one to render. */\n\tselect?: string;\n\t/** Cloud workers: 1, a number, or \"auto\" to split long films. Default 1. */\n\tworkers?: number | \"auto\";\n\tmaxWorkers?: number;\n\tcodec?: \"h264\" | \"vp9\";\n\tquality?: \"very_low\" | \"low\" | \"high\" | \"very_high\";\n\t/** Where `framefields render <name> --cloud` writes the video. */\n\toutput?: string;\n}\n\nexport interface ProjectConfig {\n\t/** Components directory, relative to the project root. */\n\tcomponents: string;\n\t/**\n\t * Font files by role (`emoji`), relative to the project root. A role\n\t * set here counts as installed: point it at your own font to use that.\n\t */\n\tfonts?: Partial<Record<string, string>>;\n\t/** Named renders, by name (letters, digits, `-`, `_`, `.`). */\n\trenders?: Record<string, RenderSpec>;\n}\n\nexport const RENDER_NAME = /^[A-Za-z0-9][\\w.-]{0,63}$/;\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nconst QUALITIES = [\"very_low\", \"low\", \"high\", \"very_high\"];\n\n/**\n * The project's config, or the default it would get: `src/components` when\n * there is a `src`. `saved` is whether the file records a components folder.\n */\nexport function readConfig(cwd: string): {\n\tconfig: ProjectConfig;\n\tsaved: boolean;\n} {\n\tconst file = join(cwd, CONFIG_FILE);\n\tconst fallback = existsSync(join(cwd, \"src\"))\n\t\t? \"src/components\"\n\t\t: \"components\";\n\tif (!existsSync(file))\n\t\treturn { config: { components: fallback }, saved: false };\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(file, \"utf8\"));\n\t} catch (err) {\n\t\tthrow new Error(\n\t\t\t`${CONFIG_FILE} is not valid JSON: ${(err as Error).message}`,\n\t\t);\n\t}\n\tif (!isRecord(raw)) throw new Error(`${CONFIG_FILE} must be a JSON object`);\n\tconst { components, fonts, renders } = raw;\n\tif (components !== undefined && typeof components !== \"string\")\n\t\tthrow new Error(`${CONFIG_FILE}: \"components\" must be a directory path`);\n\tif (\n\t\tfonts !== undefined &&\n\t\t(!isRecord(fonts) ||\n\t\t\tObject.values(fonts).some((v) => typeof v !== \"string\"))\n\t)\n\t\tthrow new Error(\n\t\t\t`${CONFIG_FILE}: \"fonts\" must map roles to font file paths, e.g. { \"emoji\": \"assets/fonts/NotoColorEmoji.ttf\" }`,\n\t\t);\n\t// Other keys (a `$schema`, say) survive a rewrite.\n\tconst config = {\n\t\t...raw,\n\t\tcomponents: components ?? fallback,\n\t\t...(renders !== undefined && { renders: parseRenders(renders) }),\n\t} as ProjectConfig;\n\treturn { config, saved: components !== undefined };\n}\n\nexport function writeConfig(cwd: string, config: ProjectConfig): void {\n\twriteFileSync(\n\t\tjoin(cwd, CONFIG_FILE),\n\t\t`${JSON.stringify(config, null, \"\\t\")}\\n`,\n\t);\n}\n\n/** Validates the `renders` map; errors name the render and field at fault. */\nexport function parseRenders(value: unknown): Record<string, RenderSpec> {\n\tif (!isRecord(value))\n\t\tthrow new Error(\n\t\t\t`${CONFIG_FILE}: \"renders\" must map names to renders, e.g. { \"film\": { \"entry\": \"src/film.ts\" } }`,\n\t\t);\n\tconst out: Record<string, RenderSpec> = {};\n\tfor (const [name, spec] of Object.entries(value)) {\n\t\tconst fail = (message: string) => {\n\t\t\tthrow new Error(`${CONFIG_FILE}: renders.${name} ${message}`);\n\t\t};\n\t\tif (!RENDER_NAME.test(name))\n\t\t\tfail(\"has an invalid name: use letters, digits, -, _ and . (at most 64)\");\n\t\tif (!isRecord(spec)) fail(\"must be an object with an entry\");\n\t\tconst s = spec as Record<string, unknown>;\n\t\tif (!isRelativePath(s.entry))\n\t\t\tfail(\n\t\t\t\t'needs \"entry\": the module path inside the project, e.g. \"src/film.ts\"',\n\t\t\t);\n\t\tif (\n\t\t\ts.export !== undefined &&\n\t\t\t!(typeof s.export === \"string\" && IDENTIFIER.test(s.export))\n\t\t)\n\t\t\tfail('\"export\" must be a JavaScript identifier');\n\t\tfor (const key of [\"title\", \"description\", \"select\"] as const)\n\t\t\tif (s[key] !== undefined && typeof s[key] !== \"string\")\n\t\t\t\tfail(`\"${key}\" must be a string`);\n\t\tif (s.workers !== undefined && s.workers !== \"auto\" && !isCount(s.workers))\n\t\t\tfail('\"workers\" must be \"auto\" or a positive whole number');\n\t\tif (s.maxWorkers !== undefined && !isCount(s.maxWorkers))\n\t\t\tfail('\"maxWorkers\" must be a positive whole number');\n\t\tif (s.codec !== undefined && s.codec !== \"h264\" && s.codec !== \"vp9\")\n\t\t\tfail('\"codec\" must be \"h264\" or \"vp9\"');\n\t\tif (s.quality !== undefined && !QUALITIES.includes(s.quality as string))\n\t\t\tfail(`\"quality\" must be one of ${QUALITIES.join(\", \")}`);\n\t\tif (s.output !== undefined && typeof s.output !== \"string\")\n\t\t\tfail('\"output\" must be a file path');\n\t\tout[name] = s as unknown as RenderSpec;\n\t}\n\treturn out;\n}\n\n/**\n * The named render `name` of the project at `cwd`, or undefined when there\n * is no render by that name (an entry path, say).\n */\nexport function findRender(\n\tcwd: string,\n\tname: string,\n): (RenderSpec & { name: string }) | undefined {\n\tconst spec = readConfig(cwd).config.renders?.[name];\n\treturn spec && { ...spec, name };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCount(value: unknown): boolean {\n\treturn typeof value === \"number\" && Number.isInteger(value) && value >= 1;\n}\n\nfunction isRelativePath(value: unknown): boolean {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\t!value.startsWith(\"/\") &&\n\t\t!value.split(/[/\\\\]/).includes(\"..\")\n\t);\n}\n","/**\n * Where a cloud render gets the project from: the git repo the working\n * directory is in, at the commit checked out now. Cloud workers fetch from\n * the remote, so that commit has to be pushed; uncommitted changes are not\n * rendered.\n */\nimport { execFileSync } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface CloudSource {\n\trepo: string;\n\tref?: string;\n\tcommit?: string;\n\t/** The project's folder inside the repo (monorepos), `.` at the root. */\n\tworkdir?: string;\n}\n\nexport interface ResolvedSource {\n\tsource: CloudSource;\n\t/** The entry relative to `source.workdir`, as the worker loads it. */\n\tentry: string;\n\t/** Things that render differently than the user may expect (uncommitted changes). */\n\twarnings: string[];\n}\n\n/** Reads repo, branch, commit and folder from git, and checks the commit is pushed. */\nexport function resolveGitSource(cwd: string, entry: string): ResolvedSource {\n\tconst git = (...args: string[]) =>\n\t\texecFileSync(\"git\", args, {\n\t\t\tcwd,\n\t\t\tencoding: \"utf8\",\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t}).trim();\n\tlet root: string;\n\ttry {\n\t\troot = git(\"rev-parse\", \"--show-toplevel\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t`${cwd} is not in a git repository. Cloud renders fetch the project from git: commit it and push it to a remote first.`,\n\t\t);\n\t}\n\t// git reports the root with symlinks resolved (macOS /var → /private/var).\n\tconst workdir =\n\t\tpath\n\t\t\t.relative(realpathSync(root), realpathSync(cwd))\n\t\t\t.split(path.sep)\n\t\t\t.join(\"/\") || \".\";\n\tconst relEntry = path\n\t\t.relative(cwd, path.resolve(cwd, entry))\n\t\t.split(path.sep)\n\t\t.join(\"/\");\n\tif (relEntry.startsWith(\"../\") || path.isAbsolute(relEntry))\n\t\tthrow new Error(\n\t\t\t`${entry} is outside ${cwd}; run from the project folder that contains it.`,\n\t\t);\n\n\tconst branch = git(\"rev-parse\", \"--abbrev-ref\", \"HEAD\");\n\tconst commit = git(\"rev-parse\", \"HEAD\");\n\tconst remoteName = upstreamRemote(git, branch) ?? \"origin\";\n\tlet remoteUrl: string;\n\ttry {\n\t\tremoteUrl = git(\"remote\", \"get-url\", remoteName);\n\t} catch {\n\t\tthrow new Error(\n\t\t\t`The repository has no \"${remoteName}\" remote. Push the project to a git host first.`,\n\t\t);\n\t}\n\tconst pushed = git(\"branch\", \"-r\", \"--contains\", commit);\n\tif (!pushed)\n\t\tthrow new Error(\n\t\t\t`Commit ${commit.slice(0, 7)} is not on ${remoteName}. Push it first (\\`git push\\`): cloud workers fetch the project from the remote.`,\n\t\t);\n\tconst dirty = git(\"status\", \"--porcelain\", \"--untracked-files=no\", \"--\", \".\");\n\treturn {\n\t\tsource: {\n\t\t\trepo: toHttps(remoteUrl),\n\t\t\t...(branch !== \"HEAD\" && { ref: branch }),\n\t\t\tcommit,\n\t\t\tworkdir,\n\t\t},\n\t\tentry: relEntry,\n\t\twarnings: dirty\n\t\t\t? [\n\t\t\t\t\t`Uncommitted changes are not rendered: the cloud renders commit ${commit.slice(0, 7)}.`,\n\t\t\t\t]\n\t\t\t: [],\n\t};\n}\n\nfunction upstreamRemote(\n\tgit: (...args: string[]) => string,\n\tbranch: string,\n): string | undefined {\n\tif (branch === \"HEAD\") return undefined;\n\ttry {\n\t\treturn git(\"config\", `branch.${branch}.remote`) || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** `git@github.com:acme/films.git` → `https://github.com/acme/films.git`; credentials dropped. */\nexport function toHttps(url: string): string {\n\tconst scp = /^[\\w.-]+@([^:/]+):(.+)$/.exec(url);\n\tif (scp) return `https://${scp[1]}/${scp[2]}`;\n\tconst parsed = URL.canParse(url) ? new URL(url) : undefined;\n\tif (parsed && (parsed.protocol === \"ssh:\" || parsed.protocol === \"git:\"))\n\t\treturn `https://${parsed.hostname}${parsed.pathname}`;\n\tif (parsed?.protocol === \"https:\" || parsed?.protocol === \"http:\") {\n\t\tparsed.username = \"\";\n\t\tparsed.password = \"\";\n\t\treturn parsed.toString();\n\t}\n\treturn url;\n}\n","/**\n * Cloud renders on api.framefields.dev: the project renders from git on\n * framefields' GPU workers, billed to the account that owns the API key.\n *\n * ```ts\n * import { renderCloud } from \"framefields/cloud\";\n *\n * const result = await renderCloud({\n * render: \"film\", // a render named in framefields.json\n * outputPath: \"output/film.mp4\",\n * onProgress: (s) => console.log(s.status, s.progress.frames),\n * });\n * ```\n *\n * Without a framefields.json, name the module instead: `entry: \"src/film.ts\"`\n * (and `export`, `workers`, …). Options passed here override the named\n * render's.\n *\n * `workers: \"auto\"` probes the film on one worker first, then splits it into\n * as many chunks as stay efficient: short films stay on one worker, long ones\n * spread out up to `maxWorkers`. `dryRun: true` returns that plan with the\n * estimated cost and renders nothing. Aborting `signal` cancels the render;\n * GPU time already used is charged.\n */\nimport { createWriteStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as WebReadableStream } from \"node:stream/web\";\nimport { CONFIG_FILE, findRender, readConfig } from \"../cli/config.js\";\nimport { type CloudSource, resolveGitSource } from \"./git-source.js\";\n\nexport { type CloudSource, resolveGitSource, toHttps } from \"./git-source.js\";\n\nexport const FRAMEFIELDS_API_URL = \"https://api.framefields.dev\";\n\nexport interface CloudRenderOptions {\n\t/** A render named in `cwd`'s framefields.json; its fields are the defaults here. */\n\trender?: string;\n\t/** The module that builds the composition, relative to `cwd`. Required without `render`. */\n\tentry?: string;\n\t/** Its export: a Composition, or a function returning one. Default `buildFilm`. */\n\texport?: string;\n\t/** Passed to the export when it is a function. */\n\targs?: unknown;\n\t/** When the export returns several compositions, the one to render. */\n\tselect?: string;\n\t/** 1 (default) renders on one worker; a number or \"auto\" splits the film. */\n\tworkers?: number | \"auto\";\n\t/** Upper bound for \"auto\" (the API caps it too). */\n\tmaxWorkers?: number;\n\tcodec?: \"h264\" | \"vp9\";\n\tquality?: string;\n\t/** Probe and plan only: returns the plan and estimated cost, renders nothing. */\n\tdryRun?: boolean;\n\t/** Download the finished video here. */\n\toutputPath?: string;\n\t/** Project folder. Default `process.cwd()`. */\n\tcwd?: string;\n\t/** Instead of reading repo, branch and commit from git. */\n\tsource?: CloudSource;\n\t/** Default `process.env.FRAMEFIELDS_API_KEY`. */\n\tapiKey?: string;\n\t/** Default `process.env.FRAMEFIELDS_API_URL`, else https://api.framefields.dev. */\n\tapiUrl?: string;\n\t/** Called with every status poll. */\n\tonProgress?: (status: CloudRenderStatus) => void;\n\t/** Called for each warning (uncommitted changes). Default: stderr. */\n\tonWarning?: (message: string) => void;\n\t/** Aborting cancels the cloud render. */\n\tsignal?: AbortSignal;\n\t/** Status poll interval, ms. Default 3000. */\n\tpollMs?: number;\n}\n\nexport type CloudRenderPhase =\n\t| \"probing\"\n\t| \"holding\"\n\t| \"rendering\"\n\t| \"stitching\"\n\t| \"planned\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"cancelled\";\n\nexport interface CloudRenderPlan {\n\tworkers: number;\n\t/** Render time of the whole film on one GPU, seconds. */\n\tworkSec: number;\n\t/** Expected wall time with this plan, seconds. */\n\tetaSec: number;\n\tchunks: { start: number; end: number; workSec: number }[];\n}\n\nexport interface CloudRenderStatus {\n\tid: string;\n\tstatus: CloudRenderPhase;\n\tworkers: number;\n\tplan?: CloudRenderPlan;\n\tprogress: {\n\t\tframes: number;\n\t\ttotalFrames: number | null;\n\t\tetaSec: number | null;\n\t};\n\t/** Charged so far (final once the render ended), USD. */\n\tcostUsd: number;\n\tgpuSeconds: number;\n\t/** The planned render's estimated charge, USD. */\n\testimateUsd?: number;\n\t/** The commit rendered. */\n\tsha?: string;\n\toutput?: { url: string; bytes?: number };\n\terror?: { code: string; message: string };\n}\n\nexport interface CloudRenderResult extends CloudRenderStatus {\n\t/** Where the video was downloaded (`outputPath`). */\n\tfilePath?: string;\n}\n\n/** A cloud render that failed, was cancelled, or was refused by the API. */\nexport class CloudRenderError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly code: string,\n\t\treadonly status?: CloudRenderStatus,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CloudRenderError\";\n\t}\n}\n\nconst DONE = new Set<CloudRenderPhase>([\n\t\"planned\",\n\t\"completed\",\n\t\"failed\",\n\t\"cancelled\",\n]);\n\n/** Starts a cloud render and waits for it; resolves when it completed (or was planned). */\nexport async function renderCloud(\n\toptions: CloudRenderOptions,\n): Promise<CloudRenderResult> {\n\tconst api = cloudClient(options);\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst o = withNamedRender(cwd, options);\n\tconst resolved = options.source\n\t\t? { source: options.source, entry: o.entry, warnings: [] }\n\t\t: resolveGitSource(cwd, o.entry);\n\tconst warn =\n\t\toptions.onWarning ??\n\t\t((m: string) => process.stderr.write(`framefields: ${m}\\n`));\n\tfor (const w of resolved.warnings) warn(w);\n\n\tlet status = await api.start({\n\t\tsource: resolved.source,\n\t\ttarget: {\n\t\t\tentry: resolved.entry,\n\t\t\texport: o.export ?? \"buildFilm\",\n\t\t\t...(o.args !== undefined && { args: o.args }),\n\t\t\t...(o.select && { select: [o.select] }),\n\t\t},\n\t\trender: {\n\t\t\tcodec: o.codec ?? \"h264\",\n\t\t\t...(o.quality && { quality: o.quality }),\n\t\t},\n\t\tworkers: o.workers ?? 1,\n\t\t...(o.maxWorkers && { max_workers: o.maxWorkers }),\n\t\tdry_run: options.dryRun ?? false,\n\t\t...(o.name && { name: o.name }),\n\t\t...(o.title && { title: o.title }),\n\t});\n\toptions.onProgress?.(status);\n\n\ttry {\n\t\twhile (!DONE.has(status.status)) {\n\t\t\tawait sleep(options.pollMs ?? 3000, options.signal);\n\t\t\tstatus = await api.status(status.id);\n\t\t\toptions.onProgress?.(status);\n\t\t}\n\t} catch (err) {\n\t\tif (options.signal?.aborted) {\n\t\t\tconst final = await api.cancel(status.id).catch(() => status);\n\t\t\tthrow new CloudRenderError(\n\t\t\t\t\"The cloud render was cancelled.\",\n\t\t\t\t\"cancelled\",\n\t\t\t\tfinal,\n\t\t\t);\n\t\t}\n\t\tthrow err;\n\t}\n\n\tif (status.status === \"failed\" || status.status === \"cancelled\")\n\t\tthrow new CloudRenderError(\n\t\t\tstatus.error\n\t\t\t\t? `Cloud render ${status.status}: ${status.error.message} (${status.error.code})`\n\t\t\t\t: `Cloud render ${status.status}.`,\n\t\t\tstatus.error?.code ?? status.status,\n\t\t\tstatus,\n\t\t);\n\tif (status.status === \"completed\" && options.outputPath && status.output) {\n\t\tawait download(status.output.url, options.outputPath, options.signal);\n\t\treturn { ...status, filePath: options.outputPath };\n\t}\n\treturn status;\n}\n\n/**\n * The options with a named render's fields filled in where the caller left\n * them out, plus the name and title the dashboard shows.\n */\nexport function withNamedRender(\n\tcwd: string,\n\toptions: CloudRenderOptions,\n): CloudRenderOptions & { entry: string; name?: string; title?: string } {\n\tif (!options.render) {\n\t\tif (!options.entry)\n\t\t\tthrow new CloudRenderError(\n\t\t\t\t\"Name a render from framefields.json (render) or a module (entry).\",\n\t\t\t\t\"invalid_request\",\n\t\t\t);\n\t\treturn { ...options, entry: options.entry };\n\t}\n\tconst spec = findRender(cwd, options.render);\n\tif (!spec) {\n\t\tconst names = Object.keys(readConfig(cwd).config.renders ?? {});\n\t\tthrow new CloudRenderError(\n\t\t\tnames.length\n\t\t\t\t? `No render named \"${options.render}\" in ${CONFIG_FILE}. Renders: ${names.join(\", \")}.`\n\t\t\t\t: `No render named \"${options.render}\": ${CONFIG_FILE} has no \"renders\".`,\n\t\t\t\"render_not_found\",\n\t\t);\n\t}\n\tconst defined = Object.fromEntries(\n\t\tObject.entries(options).filter(([, v]) => v !== undefined),\n\t) as CloudRenderOptions;\n\treturn {\n\t\tentry: spec.entry,\n\t\texport: spec.export,\n\t\targs: spec.args,\n\t\tselect: spec.select,\n\t\tworkers: spec.workers,\n\t\tmaxWorkers: spec.maxWorkers,\n\t\tcodec: spec.codec,\n\t\tquality: spec.quality,\n\t\t...defined,\n\t\tname: spec.name,\n\t\ttitle: spec.title ?? spec.name,\n\t} as CloudRenderOptions & { entry: string; name: string; title: string };\n}\n\n/** The API calls behind `renderCloud`, for callers who track renders themselves. */\nexport function cloudClient(\n\toptions: Pick<CloudRenderOptions, \"apiKey\" | \"apiUrl\">,\n) {\n\tconst key = options.apiKey ?? process.env.FRAMEFIELDS_API_KEY;\n\tif (!key)\n\t\tthrow new CloudRenderError(\n\t\t\t\"No API key. Set FRAMEFIELDS_API_KEY (keys at https://framefields.dev/dashboard/keys) or pass apiKey.\",\n\t\t\t\"invalid_api_key\",\n\t\t);\n\tconst base = (\n\t\toptions.apiUrl ??\n\t\tprocess.env.FRAMEFIELDS_API_URL ??\n\t\tFRAMEFIELDS_API_URL\n\t).replace(/\\/+$/, \"\");\n\tconst call = async (method: string, route: string, body?: unknown) => {\n\t\tconst res = await fetch(`${base}/v1/render${route}`, {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${key}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\t...(body !== undefined && { body: JSON.stringify(body) }),\n\t\t});\n\t\tconst json = (await res.json().catch(() => ({}))) as ApiStatus & {\n\t\t\terror?: { type?: string; message?: string };\n\t\t};\n\t\tif (!res.ok)\n\t\t\tthrow new CloudRenderError(\n\t\t\t\tjson.error?.message ??\n\t\t\t\t\t`api.framefields.dev answered HTTP ${res.status}`,\n\t\t\t\tjson.error?.type ?? `http_${res.status}`,\n\t\t\t);\n\t\treturn fromApi(json);\n\t};\n\treturn {\n\t\tstart: (body: unknown) => call(\"POST\", \"\", body),\n\t\tstatus: (id: string) => call(\"GET\", `/${encodeURIComponent(id)}`),\n\t\tcancel: (id: string) => call(\"DELETE\", `/${encodeURIComponent(id)}`),\n\t};\n}\n\n/** The API's snake_case status. */\ninterface ApiStatus {\n\tid: string;\n\tstatus: CloudRenderPhase;\n\tworkers?: number;\n\tplan?: {\n\t\tworkers: number;\n\t\twork_sec: number;\n\t\teta_sec: number;\n\t\tchunks: CloudRenderPlan[\"chunks\"];\n\t};\n\tprogress?: {\n\t\tframes?: number;\n\t\ttotal_frames?: number | null;\n\t\teta_sec?: number | null;\n\t};\n\tcost_usd?: number;\n\tgpu_seconds?: number;\n\testimate_usd?: number;\n\tsha?: string;\n\toutput?: { url: string; bytes?: number };\n\terror?: { code: string; message: string };\n}\n\nfunction fromApi(s: ApiStatus): CloudRenderStatus {\n\treturn {\n\t\tid: s.id,\n\t\tstatus: s.status,\n\t\tworkers: s.workers ?? 1,\n\t\t...(s.plan && {\n\t\t\tplan: {\n\t\t\t\tworkers: s.plan.workers,\n\t\t\t\tworkSec: s.plan.work_sec,\n\t\t\t\tetaSec: s.plan.eta_sec,\n\t\t\t\tchunks: s.plan.chunks,\n\t\t\t},\n\t\t}),\n\t\tprogress: {\n\t\t\tframes: s.progress?.frames ?? 0,\n\t\t\ttotalFrames: s.progress?.total_frames ?? null,\n\t\t\tetaSec: s.progress?.eta_sec ?? null,\n\t\t},\n\t\tcostUsd: s.cost_usd ?? 0,\n\t\tgpuSeconds: s.gpu_seconds ?? 0,\n\t\t...(s.estimate_usd !== undefined && { estimateUsd: s.estimate_usd }),\n\t\t...(s.sha && { sha: s.sha }),\n\t\t...(s.output && { output: s.output }),\n\t\t...(s.error && { error: s.error }),\n\t};\n}\n\nasync function download(url: string, file: string, signal?: AbortSignal) {\n\tconst res = await fetch(url, { signal });\n\tif (!res.ok || !res.body)\n\t\tthrow new CloudRenderError(\n\t\t\t`Downloading the render failed: HTTP ${res.status}`,\n\t\t\t\"download_failed\",\n\t\t);\n\tawait fs.mkdir(path.dirname(path.resolve(file)), { recursive: true });\n\tawait pipeline(\n\t\tReadable.fromWeb(res.body as WebReadableStream),\n\t\tcreateWriteStream(file),\n\t);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) return reject(signal.reason);\n\t\tconst timer = setTimeout(resolve, ms);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\treject(signal.reason);\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n"],"mappings":"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"}
|