framefields 2.11.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/NOTICE.md +4 -0
- package/dist/audio/index.d.mts +6 -5
- package/dist/audio/index.mjs +13 -13
- package/dist/{audio-CYZkDwae.d.mts → audio-CHV33Od9.d.mts} +3 -4
- package/dist/audio-CHV33Od9.d.mts.map +1 -0
- package/dist/{audio-BuCVk1IQ.mjs → audio-DHzLQ_RG.mjs} +4 -4
- package/dist/{audio-BuCVk1IQ.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 +390 -124
- package/dist/cli.mjs.map +1 -1
- package/dist/cloud/index.d.mts +16 -3
- package/dist/cloud/index.d.mts.map +1 -1
- package/dist/cloud/index.mjs +2 -2
- package/dist/cloud-Cj1TIme8.mjs +685 -0
- 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-BSKAbyea.mjs.map +1 -0
- package/dist/{dist-CNGv-JTX.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-EQX3TUUl.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-CWLLnigL.mjs → dist-D3BeAZ7X.mjs} +315 -84
- 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-Dg9LMWoX.mjs → dist-Kbf-JTry.mjs} +2 -2
- package/dist/{dist-Dg9LMWoX.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-DKLbLXF7.mjs → effects-BiDgCK1L.mjs} +3 -3
- package/dist/{effects-DKLbLXF7.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-gPbGbShD.mjs → fonts-DeDPWdvJ.mjs} +2 -2
- package/dist/{fonts-gPbGbShD.mjs.map → fonts-DeDPWdvJ.mjs.map} +1 -1
- package/dist/{gpu-CpkJJLQP.mjs → gpu-CWjgql4C.mjs} +11 -3
- package/dist/gpu-CWjgql4C.mjs.map +1 -0
- 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-D2i9J9Zq.d.mts → index-D68eGFNE.d.mts} +3 -30
- package/dist/index-D68eGFNE.d.mts.map +1 -0
- package/dist/{index-CEU_Zsb9.d.mts → index-DBh3WphX.d.mts} +25 -23
- package/dist/index-DBh3WphX.d.mts.map +1 -0
- 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-jSDEM-uE.d.mts → index-Dibc_xpC.d.mts} +6 -6
- package/dist/{index-jSDEM-uE.d.mts.map → index-Dibc_xpC.d.mts.map} +1 -1
- package/dist/{index-Cro-818i.d.mts → index-E2IXX0Cz.d.mts} +88 -14
- package/dist/index-E2IXX0Cz.d.mts.map +1 -0
- package/dist/{index-BuiZzc6i.d.mts → index-X2u96TEo.d.mts} +162 -5
- package/dist/index-X2u96TEo.d.mts.map +1 -0
- package/dist/{index-Bly-7YM1.d.mts → index-YB9j9KUx.d.mts} +3 -3
- package/dist/{index-Bly-7YM1.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-C8YwZ6k1.d.mts → index-rtCXNxGO.d.mts} +2 -2
- package/dist/{index-C8YwZ6k1.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-BToKUTtZ.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-QF4JWVO3.mjs → chunk-35XSD4QM.mjs} +15 -15
- package/dist/preview-engine/{chunk-ZF2MEFKO.mjs → chunk-3DOIE4DV.mjs} +1 -1
- package/dist/preview-engine/{chunk-JDB7PMRI.mjs → chunk-3IT7LHWR.mjs} +1 -1
- package/dist/preview-engine/{chunk-DNNGWS2C.mjs → chunk-3MLGWUSK.mjs} +1 -1
- package/dist/preview-engine/{chunk-KVOFO273.mjs → chunk-3QJ5GRBH.mjs} +1 -1
- package/dist/preview-engine/{chunk-54Q5CKSV.mjs → chunk-3QTHW2CD.mjs} +1 -1
- package/dist/preview-engine/chunk-44V4V5LD.mjs +1 -0
- package/dist/preview-engine/chunk-4P3MMJWD.mjs +1 -0
- package/dist/preview-engine/chunk-4YT5YJIF.mjs +1 -0
- package/dist/preview-engine/{chunk-BJXNKMSY.mjs → chunk-64L4GUOF.mjs} +20 -6
- package/dist/preview-engine/{chunk-UMJ3VGKN.mjs → chunk-6B3NOY5W.mjs} +1 -1
- package/dist/preview-engine/chunk-77MT33VR.mjs +1 -0
- package/dist/preview-engine/{chunk-BRV7TQDV.mjs → chunk-77WWW75O.mjs} +1 -1
- package/dist/preview-engine/chunk-7M5LE6EM.mjs +483 -0
- package/dist/preview-engine/chunk-A6OAPDIA.mjs +1 -0
- package/dist/preview-engine/chunk-ADLIF544.mjs +39 -0
- package/dist/preview-engine/{chunk-OLB4TQLQ.mjs → chunk-AKVRG7UU.mjs} +1 -1
- package/dist/preview-engine/{chunk-CIVEZJYF.mjs → chunk-CRBOK3JT.mjs} +1 -1
- package/dist/preview-engine/chunk-CSLSWUUT.mjs +1 -0
- package/dist/preview-engine/{chunk-ACBBBOUM.mjs → chunk-CYM75INB.mjs} +1 -1
- package/dist/preview-engine/{chunk-JSYG6OWZ.mjs → chunk-D7OMXGIZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-EPRINA4V.mjs → chunk-E7BKWHOT.mjs} +10 -10
- package/dist/preview-engine/{chunk-NOKPBMIP.mjs → chunk-EWDJMJO5.mjs} +1 -1
- package/dist/preview-engine/{chunk-5KSBS3AL.mjs → chunk-EYE3GNL5.mjs} +1 -1
- package/dist/preview-engine/chunk-FRJPXWAG.mjs +1 -0
- package/dist/preview-engine/{chunk-IKVJ4MW5.mjs → chunk-G4ZTSLZU.mjs} +1 -1
- package/dist/preview-engine/{chunk-VZLIRYAL.mjs → chunk-GAMAKN5L.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZIXPWP2B.mjs → chunk-ICWD36H6.mjs} +1 -1
- package/dist/preview-engine/{chunk-OELPPLML.mjs → chunk-IEEV5RB3.mjs} +1 -1
- package/dist/preview-engine/chunk-JAAFSVAG.mjs +1 -0
- package/dist/preview-engine/{chunk-YVZTRH4Y.mjs → chunk-KDCM7S3S.mjs} +1 -1
- package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
- package/dist/preview-engine/{chunk-O63FLYWC.mjs → chunk-N2VISDTG.mjs} +1 -1
- package/dist/preview-engine/{chunk-GN3NDRLI.mjs → chunk-NCQHOGZK.mjs} +1 -1
- package/dist/preview-engine/{chunk-YKM7JDQY.mjs → chunk-NJO2BIJX.mjs} +1 -1
- package/dist/preview-engine/{chunk-7GMHSTRP.mjs → chunk-NTSALWFF.mjs} +1 -1
- package/dist/preview-engine/{chunk-PKNUTHPI.mjs → chunk-NVXFEDJS.mjs} +1 -1
- package/dist/preview-engine/{chunk-VFQH5KVS.mjs → chunk-ONHY4KNY.mjs} +1 -1
- package/dist/preview-engine/{chunk-Z24UEN4P.mjs → chunk-PD2HKW2S.mjs} +1 -1
- package/dist/preview-engine/chunk-PH3UUX6A.mjs +138 -0
- package/dist/preview-engine/chunk-PIHG6HJO.mjs +1 -0
- package/dist/preview-engine/{chunk-YHMBGJP6.mjs → chunk-QPT2Y2GZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-4AGQN53P.mjs → chunk-QXLFTCLC.mjs} +1 -1
- package/dist/preview-engine/{chunk-65NANVQL.mjs → chunk-R4H52Q7S.mjs} +1 -1
- package/dist/preview-engine/{chunk-FQL4IJZN.mjs → chunk-RN7J5TRU.mjs} +1 -1
- package/dist/preview-engine/{chunk-26XWIHW3.mjs → chunk-RVCLMO5Q.mjs} +1 -1
- package/dist/preview-engine/{chunk-VQA4DYZU.mjs → chunk-RYSV44B4.mjs} +1 -1
- package/dist/preview-engine/{chunk-TEWRQKX3.mjs → chunk-SFHWP65D.mjs} +1 -1
- package/dist/preview-engine/{chunk-RDWLLITE.mjs → chunk-SMHEMYCV.mjs} +1 -1
- package/dist/preview-engine/{chunk-EXEO245X.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-EAWJXW4J.mjs → chunk-UVEDFIPN.mjs} +1 -1
- package/dist/preview-engine/{chunk-6LTINEA4.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-IBPYV6HF.mjs → chunk-W4XR6F5G.mjs} +1 -1
- package/dist/preview-engine/{chunk-UI3VH33L.mjs → chunk-WPYWCWWL.mjs} +1 -1
- package/dist/preview-engine/{chunk-GHTG5XV6.mjs → chunk-XYCR3STG.mjs} +84 -25
- package/dist/preview-engine/{chunk-WFMUDL55.mjs → chunk-YAPGJZPI.mjs} +1 -1
- package/dist/preview-engine/{chunk-LMXMBX4J.mjs → chunk-YJ4DSRDY.mjs} +1 -1
- package/dist/preview-engine/{chunk-CCORQLMR.mjs → chunk-YOJKIMU5.mjs} +1 -1
- package/dist/preview-engine/{chunk-UGB6JKVS.mjs → chunk-ZHNEZZ6A.mjs} +1 -1
- package/dist/preview-engine/{chunk-LFNCWMKS.mjs → chunk-ZZMI3WOT.mjs} +1 -1
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/{renderers-53EI26GL.mjs → renderers-3FZVDYRQ.mjs} +1 -1
- package/dist/preview-engine/renderers-3KEBYOOF.mjs +1 -0
- package/dist/preview-engine/{renderers-6YVZUQOH.mjs → renderers-4RPQSUUZ.mjs} +1 -1
- package/dist/preview-engine/renderers-5EGFXFPF.mjs +1 -0
- package/dist/preview-engine/renderers-5SJHYUTM.mjs +1 -0
- package/dist/preview-engine/renderers-66MWDUN6.mjs +1 -0
- package/dist/preview-engine/{renderers-CCRZNGVK.mjs → renderers-6FENMFSC.mjs} +1 -1
- package/dist/preview-engine/renderers-77OXJ2GY.mjs +1 -0
- package/dist/preview-engine/renderers-7LI4QKHO.mjs +1 -0
- package/dist/preview-engine/renderers-AFTUFMQQ.mjs +1 -0
- package/dist/preview-engine/{renderers-CYJAVWHT.mjs → renderers-AIZRIW2R.mjs} +1 -1
- package/dist/preview-engine/{renderers-OGOW3NA4.mjs → renderers-BDI2BDBA.mjs} +1 -1
- package/dist/preview-engine/renderers-BDXCO6NR.mjs +1 -0
- package/dist/preview-engine/{renderers-EN7LXJLG.mjs → renderers-BUZ67FNZ.mjs} +1 -1
- package/dist/preview-engine/renderers-DMTGKURQ.mjs +1 -0
- package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -0
- package/dist/preview-engine/{renderers-WSABL3QO.mjs → renderers-ECXMT5BD.mjs} +1 -1
- package/dist/preview-engine/{renderers-MOEC2XZZ.mjs → renderers-EILFSWSJ.mjs} +1 -1
- package/dist/preview-engine/renderers-EPSF5CSQ.mjs +1 -0
- package/dist/preview-engine/{renderers-X6CORAES.mjs → renderers-EVEWFJ7U.mjs} +1 -1
- package/dist/preview-engine/renderers-F6PT2LON.mjs +1 -0
- package/dist/preview-engine/renderers-F7WPJXKT.mjs +1 -0
- package/dist/preview-engine/renderers-FIFF267S.mjs +1 -0
- package/dist/preview-engine/{renderers-GQM3KMV3.mjs → renderers-FQISHQEN.mjs} +1 -1
- package/dist/preview-engine/{renderers-HKLCB4U6.mjs → renderers-FXAVFNUN.mjs} +1 -1
- package/dist/preview-engine/{renderers-P2HORBZ6.mjs → renderers-GITAVRYZ.mjs} +1 -1
- package/dist/preview-engine/renderers-GTKRV225.mjs +1 -0
- package/dist/preview-engine/{renderers-KCGK33Y2.mjs → renderers-HG6JZIZO.mjs} +1 -1
- package/dist/preview-engine/{renderers-I6QKZ7CH.mjs → renderers-HHWMIDN3.mjs} +1 -1
- package/dist/preview-engine/renderers-HI3SRJVD.mjs +1 -0
- package/dist/preview-engine/{renderers-7CAHX35U.mjs → renderers-HXEDI4BD.mjs} +1 -1
- package/dist/preview-engine/{renderers-77PDUMYI.mjs → renderers-HXNSDJBY.mjs} +1 -1
- package/dist/preview-engine/{renderers-ACUJMDEK.mjs → renderers-I2ZOUFRU.mjs} +1 -1
- package/dist/preview-engine/renderers-JHFD4LHZ.mjs +1 -0
- package/dist/preview-engine/{renderers-IHGAWLUF.mjs → renderers-JMSAW7VY.mjs} +1 -1
- package/dist/preview-engine/renderers-KGVZUFHD.mjs +1 -0
- package/dist/preview-engine/{renderers-RN2MHIFK.mjs → renderers-KICDB5Y6.mjs} +1 -1
- package/dist/preview-engine/{renderers-C7SI3NIE.mjs → renderers-KKULMOV4.mjs} +1 -1
- package/dist/preview-engine/{renderers-HSFQIILN.mjs → renderers-KMVMPYY7.mjs} +1 -1
- package/dist/preview-engine/renderers-LN7WPG6I.mjs +1 -0
- package/dist/preview-engine/{renderers-BOBVXYAA.mjs → renderers-LWW4RF6D.mjs} +1 -1
- package/dist/preview-engine/renderers-LY57CZZB.mjs +1 -0
- package/dist/preview-engine/renderers-MBMJWZEW.mjs +1 -0
- package/dist/preview-engine/{renderers-VVP5WQOY.mjs → renderers-MPFU74I3.mjs} +1 -1
- package/dist/preview-engine/{renderers-H6PBHEYU.mjs → renderers-MW53LTMB.mjs} +1 -1
- package/dist/preview-engine/{renderers-PPZK6VEW.mjs → renderers-NQC4DPX4.mjs} +1 -1
- package/dist/preview-engine/renderers-OJWWIVNW.mjs +1 -0
- package/dist/preview-engine/{renderers-4IBFDW2S.mjs → renderers-PC2GOZDT.mjs} +1 -1
- package/dist/preview-engine/{renderers-UG2C3C7T.mjs → renderers-Q77UPEYE.mjs} +1 -1
- package/dist/preview-engine/renderers-QHXCFDHI.mjs +1 -0
- package/dist/preview-engine/renderers-RDYJRNAR.mjs +1 -0
- package/dist/preview-engine/renderers-RENLKAA7.mjs +1 -0
- package/dist/preview-engine/renderers-RHMRWX46.mjs +1 -0
- package/dist/preview-engine/{renderers-5XLGCEOA.mjs → renderers-RIPXT4AL.mjs} +1 -1
- package/dist/preview-engine/{renderers-FY2HOQCS.mjs → renderers-SFVFAS3C.mjs} +1 -1
- package/dist/preview-engine/{renderers-VIGZYJYX.mjs → renderers-SWQVCJHB.mjs} +1 -1
- package/dist/preview-engine/renderers-SZVDZDY7.mjs +1 -0
- package/dist/preview-engine/renderers-TTXTV4PC.mjs +228 -0
- package/dist/preview-engine/renderers-TYSLUZ53.mjs +1 -0
- package/dist/preview-engine/{renderers-6LNDAO4B.mjs → renderers-U4IXWMD6.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-33FCFHDR.mjs → renderers-VUQAZ56P.mjs} +1 -1
- package/dist/preview-engine/renderers-W5YFMLSB.mjs +1 -0
- package/dist/preview-engine/renderers-XKDWUK56.mjs +1 -0
- package/dist/preview-engine/renderers-XKSBNCLZ.mjs +1 -0
- package/dist/preview-engine/renderers-XLQXVD37.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-4IUYUKIZ.mjs → src-YXNX4MLK.mjs} +1 -1
- package/dist/{program-Bc860ko5.mjs → program-Bn6ko_I4.mjs} +44 -17
- package/dist/program-Bn6ko_I4.mjs.map +1 -0
- package/dist/renderer/index.d.mts +4 -3
- package/dist/renderer/index.mjs +3 -3
- package/dist/{renderer-B3Dme2es.mjs → renderer--Q0pM9Vh.mjs} +5 -5
- package/dist/{renderer-B3Dme2es.mjs.map → renderer--Q0pM9Vh.mjs.map} +1 -1
- package/dist/renderer-1aSF5BmY.mjs +5 -0
- package/dist/{renderer-CAWnCsQc.mjs → renderer-45ifiDkn.mjs} +5 -5
- package/dist/{renderer-CAWnCsQc.mjs.map → renderer-45ifiDkn.mjs.map} +1 -1
- package/dist/{renderer-Cz-n883J.mjs → renderer-549d94qG.mjs} +5 -5
- package/dist/{renderer-Cz-n883J.mjs.map → renderer-549d94qG.mjs.map} +1 -1
- package/dist/{renderer-BhsrlGKp.mjs → renderer-B-LUGB9h.mjs} +74 -21
- package/dist/renderer-B-LUGB9h.mjs.map +1 -0
- package/dist/renderer-B2e4Gr9u.mjs +5 -0
- package/dist/{renderer-B1LD29TV.mjs → renderer-B5b-ehRb.mjs} +3 -3
- package/dist/{renderer-B1LD29TV.mjs.map → renderer-B5b-ehRb.mjs.map} +1 -1
- package/dist/renderer-B6fz4j50.mjs +5 -0
- package/dist/{renderer-_9gbYS-3.mjs → renderer-BCTUqJG7.mjs} +5 -5
- package/dist/{renderer-_9gbYS-3.mjs.map → renderer-BCTUqJG7.mjs.map} +1 -1
- package/dist/renderer-BEftIYw-.mjs +5 -0
- package/dist/{renderer-C9BSXyrq.mjs → renderer-BHPgkoEL.mjs} +4 -4
- package/dist/{renderer-C9BSXyrq.mjs.map → renderer-BHPgkoEL.mjs.map} +1 -1
- package/dist/renderer-BHTnO-7e.mjs +5 -0
- package/dist/{renderer-fs8f1QeE.mjs → renderer-BIieU9pY.mjs} +5 -5
- package/dist/{renderer-fs8f1QeE.mjs.map → renderer-BIieU9pY.mjs.map} +1 -1
- package/dist/{renderer-DwK9jsER.mjs → renderer-BKi6jDi_.mjs} +4 -4
- package/dist/{renderer-DwK9jsER.mjs.map → renderer-BKi6jDi_.mjs.map} +1 -1
- package/dist/renderer-BMlnQqTO.mjs +5 -0
- package/dist/{renderer-BNJ6Jk7-.mjs → renderer-BMpmmYOq.mjs} +4 -4
- package/dist/{renderer-BNJ6Jk7-.mjs.map → renderer-BMpmmYOq.mjs.map} +1 -1
- package/dist/{renderer-DkqZmfm8.mjs → renderer-BO_wuUKA.mjs} +5 -5
- package/dist/{renderer-DkqZmfm8.mjs.map → renderer-BO_wuUKA.mjs.map} +1 -1
- package/dist/renderer-BOzcFezY.mjs +5 -0
- package/dist/{renderer-Bxjb0HYU.mjs → renderer-BPOh9x5X.mjs} +4 -4
- package/dist/{renderer-Bxjb0HYU.mjs.map → renderer-BPOh9x5X.mjs.map} +1 -1
- package/dist/{renderer-Ros7XQg2.mjs → renderer-BPiWsrC2.mjs} +3 -3
- package/dist/{renderer-Ros7XQg2.mjs.map → renderer-BPiWsrC2.mjs.map} +1 -1
- package/dist/{renderer-lHNTgiOM.mjs → renderer-BUj7jE6t.mjs} +3 -3
- package/dist/{renderer-lHNTgiOM.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-D0aAZHC7.mjs → renderer-BZgJj8Cl.mjs} +4 -4
- package/dist/{renderer-D0aAZHC7.mjs.map → renderer-BZgJj8Cl.mjs.map} +1 -1
- package/dist/{renderer-V4dhrf_h.mjs → renderer-BgjPbgbn.mjs} +6 -6
- package/dist/{renderer-V4dhrf_h.mjs.map → renderer-BgjPbgbn.mjs.map} +1 -1
- package/dist/{renderer-BaIJIfJ6.mjs → renderer-BjgFpwVK.mjs} +5 -5
- package/dist/{renderer-BaIJIfJ6.mjs.map → renderer-BjgFpwVK.mjs.map} +1 -1
- package/dist/renderer-Bks49NVl.mjs +5 -0
- package/dist/{renderer-CU8v-LxD.mjs → renderer-BlZgyBSo.mjs} +5 -5
- package/dist/{renderer-CU8v-LxD.mjs.map → renderer-BlZgyBSo.mjs.map} +1 -1
- package/dist/{renderer-B6Oeahe_.mjs → renderer-BqUAyzCZ.mjs} +5 -5
- package/dist/{renderer-B6Oeahe_.mjs.map → renderer-BqUAyzCZ.mjs.map} +1 -1
- package/dist/{renderer-h62QaJYz.mjs → renderer-Br8km655.mjs} +4 -4
- package/dist/{renderer-h62QaJYz.mjs.map → renderer-Br8km655.mjs.map} +1 -1
- package/dist/{renderer-sfqZK6L5.mjs → renderer-BsMZ5Iaq.mjs} +4 -4
- package/dist/{renderer-sfqZK6L5.mjs.map → renderer-BsMZ5Iaq.mjs.map} +1 -1
- package/dist/{renderer-g_1t2je9.mjs → renderer-BtgqTg2K.mjs} +3 -3
- package/dist/{renderer-DcvjSolU.mjs → renderer-BuvKGwk3.mjs} +11 -2
- package/dist/{renderer-DcvjSolU.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
- package/dist/{renderer-BOrMBwQS.mjs → renderer-C-3qhk5x.mjs} +2 -2
- package/dist/{renderer-BOrMBwQS.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
- package/dist/{renderer-CLAvn9c6.mjs → renderer-C-GTxnfv.mjs} +4 -4
- package/dist/{renderer-CLAvn9c6.mjs.map → renderer-C-GTxnfv.mjs.map} +1 -1
- package/dist/renderer-C-t7qFKr.mjs +5 -0
- package/dist/{renderer-BDZC3o3N.mjs → renderer-C1ctHdXl.mjs} +4 -4
- package/dist/{renderer-BDZC3o3N.mjs.map → renderer-C1ctHdXl.mjs.map} +1 -1
- package/dist/renderer-C24n-6CX.mjs +6 -0
- package/dist/{renderer-pNmI-A9o.mjs → renderer-C7m7Yxgc.mjs} +5 -5
- package/dist/{renderer-pNmI-A9o.mjs.map → renderer-C7m7Yxgc.mjs.map} +1 -1
- package/dist/{renderer-Bf4-N7k7.mjs → renderer-C9dqx3U7.mjs} +5 -5
- package/dist/{renderer-Bf4-N7k7.mjs.map → renderer-C9dqx3U7.mjs.map} +1 -1
- package/dist/renderer-CCReX-7M.mjs +5 -0
- package/dist/{renderer-JHByuUNb.mjs → renderer-CE4535aW.mjs} +3 -3
- package/dist/{renderer-JHByuUNb.mjs.map → renderer-CE4535aW.mjs.map} +1 -1
- package/dist/renderer-CIxFQrAm.mjs +5 -0
- package/dist/{renderer-ByjaseAo.mjs → renderer-CL-vyXgX.mjs} +5 -5
- package/dist/{renderer-ByjaseAo.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-B-CMRUag.mjs → renderer-CMnlgAGs.mjs} +4 -4
- package/dist/{renderer-B-CMRUag.mjs.map → renderer-CMnlgAGs.mjs.map} +1 -1
- package/dist/{renderer-BNHcwxw9.mjs → renderer-CQFMyC_c.mjs} +4 -4
- package/dist/{renderer-BNHcwxw9.mjs.map → renderer-CQFMyC_c.mjs.map} +1 -1
- package/dist/{renderer-DgPn_SOC.mjs → renderer-CYwVNbUh.mjs} +4 -4
- package/dist/{renderer-DgPn_SOC.mjs.map → renderer-CYwVNbUh.mjs.map} +1 -1
- package/dist/{renderer-DLPhfwbR.mjs → renderer-CZ5mwBW1.mjs} +3 -3
- package/dist/{renderer-DLPhfwbR.mjs.map → renderer-CZ5mwBW1.mjs.map} +1 -1
- package/dist/{renderer-4ZUv3X1I.mjs → renderer-C_1eqfI0.mjs} +5 -5
- package/dist/{renderer-4ZUv3X1I.mjs.map → renderer-C_1eqfI0.mjs.map} +1 -1
- package/dist/renderer-C_H3mHZa.mjs +5 -0
- package/dist/{renderer-B1esRxGy.mjs → renderer-CciiDHuU.mjs} +4 -4
- package/dist/{renderer-B1esRxGy.mjs.map → renderer-CciiDHuU.mjs.map} +1 -1
- package/dist/renderer-CfkTdR5B.mjs +5 -0
- package/dist/{renderer-ynFRJh7G.mjs → renderer-CgK7Q1G8.mjs} +3 -3
- package/dist/{renderer-CR0mDPYY.mjs → renderer-CnL8Cmmr.mjs} +3 -3
- package/dist/renderer-CnhkXJ0R.mjs +5 -0
- package/dist/{renderer-fwKnV9zs.mjs → renderer-Cp_HOmp7.mjs} +5 -5
- package/dist/{renderer-fwKnV9zs.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-riIFosX6.mjs → renderer-Cu3iKMSJ.mjs} +5 -5
- package/dist/{renderer-riIFosX6.mjs.map → renderer-Cu3iKMSJ.mjs.map} +1 -1
- package/dist/{renderer-D4f8f66C.mjs → renderer-CuPAQjDK.mjs} +4 -4
- package/dist/{renderer-D4f8f66C.mjs.map → renderer-CuPAQjDK.mjs.map} +1 -1
- package/dist/{renderer-CxGx1Lhi.mjs → renderer-CwlY8Tb-.mjs} +3 -3
- package/dist/{renderer-CxGx1Lhi.mjs.map → renderer-CwlY8Tb-.mjs.map} +1 -1
- package/dist/{renderer-o68mVeyk.mjs → renderer-CxSFvKd1.mjs} +4 -4
- package/dist/{renderer-o68mVeyk.mjs.map → renderer-CxSFvKd1.mjs.map} +1 -1
- package/dist/{renderer-CrR8Mpxq.mjs → renderer-CyUiXLRa.mjs} +5 -5
- package/dist/{renderer-CrR8Mpxq.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-Bx14Wnxl.mjs → renderer-D-GWBoVT.mjs} +58 -4
- package/dist/renderer-D-GWBoVT.mjs.map +1 -0
- package/dist/{renderer-BwrfKKqw.mjs → renderer-D-fzEZfX.mjs} +4 -4
- package/dist/{renderer-BwrfKKqw.mjs.map → renderer-D-fzEZfX.mjs.map} +1 -1
- package/dist/renderer-D5yp74NL.mjs +3 -0
- package/dist/{renderer-DAn9xiQT.mjs → renderer-D8gN7aqk.mjs} +4 -4
- package/dist/{renderer-DAn9xiQT.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-Dpl6poqD.mjs → renderer-DGOMfyh8.mjs} +2 -2
- package/dist/{renderer-Dpl6poqD.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
- package/dist/{renderer-Rw87u1Cr.mjs → renderer-DGb_wgTW.mjs} +6 -6
- package/dist/{renderer-Rw87u1Cr.mjs.map → renderer-DGb_wgTW.mjs.map} +1 -1
- package/dist/{renderer-Co6UFbZB.mjs → renderer-DJPZs_zV.mjs} +5 -5
- package/dist/{renderer-Co6UFbZB.mjs.map → renderer-DJPZs_zV.mjs.map} +1 -1
- package/dist/renderer-DKJOon6y.d.mts +1 -0
- package/dist/{renderer-DOkbn1ot.mjs → renderer-DOZPZTxe.mjs} +5 -5
- package/dist/{renderer-DOkbn1ot.mjs.map → renderer-DOZPZTxe.mjs.map} +1 -1
- package/dist/{renderer-DaXQgGg3.mjs → renderer-DRal7Goa.mjs} +5 -5
- package/dist/{renderer-DaXQgGg3.mjs.map → renderer-DRal7Goa.mjs.map} +1 -1
- package/dist/renderer-DWgpivA3.mjs +5 -0
- package/dist/{renderer-Bo7shNdU.mjs → renderer-DXFJv_e6.mjs} +4 -4
- package/dist/{renderer-Bo7shNdU.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-eMCTAa9e.mjs → renderer-Dp5ChuOs.mjs} +4 -4
- package/dist/{renderer-eMCTAa9e.mjs.map → renderer-Dp5ChuOs.mjs.map} +1 -1
- package/dist/{renderer-1uoKiILq.mjs → renderer-DpZballM.mjs} +3 -3
- package/dist/{renderer-1uoKiILq.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-7ow5Acsg.mjs → renderer-DwGlDNOV.mjs} +3 -3
- package/dist/{renderer-7ow5Acsg.mjs.map → renderer-DwGlDNOV.mjs.map} +1 -1
- package/dist/{renderer-q7q6k_cD.mjs → renderer-DxB_OfLs.mjs} +4 -4
- package/dist/{renderer-q7q6k_cD.mjs.map → renderer-DxB_OfLs.mjs.map} +1 -1
- package/dist/{renderer-DFJWPqOJ.mjs → renderer-Dz6P-rPI.mjs} +3 -3
- package/dist/{renderer-DFJWPqOJ.mjs.map → renderer-Dz6P-rPI.mjs.map} +1 -1
- package/dist/{renderer-BURhYcpA.mjs → renderer-FPiLBwj5.mjs} +4 -4
- package/dist/{renderer-BURhYcpA.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-D-QVGphn.mjs → renderer-KgsVk9c6.mjs} +4 -4
- package/dist/{renderer-D-QVGphn.mjs.map → renderer-KgsVk9c6.mjs.map} +1 -1
- package/dist/{renderer-COcKhouz.mjs → renderer-LXhEPCmy.mjs} +5 -5
- package/dist/{renderer-COcKhouz.mjs.map → renderer-LXhEPCmy.mjs.map} +1 -1
- package/dist/{renderer-HDj9Zb-O.mjs → renderer-NBMmvqWl.mjs} +20 -7
- package/dist/renderer-NBMmvqWl.mjs.map +1 -0
- package/dist/{renderer-DE9Jik9K.mjs → renderer-Nnu32rqg.mjs} +3 -3
- package/dist/{renderer-DE9Jik9K.mjs.map → renderer-Nnu32rqg.mjs.map} +1 -1
- package/dist/renderer-R21YvXz3.mjs +5 -0
- package/dist/{renderer-celhuAL7.mjs → renderer-RAq3LnNy.mjs} +3 -3
- package/dist/{renderer-celhuAL7.mjs.map → renderer-RAq3LnNy.mjs.map} +1 -1
- package/dist/renderer-RtzCz37W.mjs +5 -0
- package/dist/{renderer-50JEMaVo.mjs → renderer-RzkU_O1i.mjs} +5 -5
- package/dist/{renderer-50JEMaVo.mjs.map → renderer-RzkU_O1i.mjs.map} +1 -1
- package/dist/{renderer-Bbxh4N8Y.mjs → renderer-S9tVGneU.mjs} +95 -80
- package/dist/renderer-S9tVGneU.mjs.map +1 -0
- package/dist/{renderer-BSELd5vU.mjs → renderer-SJyp9-62.mjs} +3 -3
- package/dist/{renderer-BSELd5vU.mjs.map → renderer-SJyp9-62.mjs.map} +1 -1
- package/dist/{renderer-jnAIhWn_.mjs → renderer-_54hiCq0.mjs} +5 -5
- package/dist/{renderer-jnAIhWn_.mjs.map → renderer-_54hiCq0.mjs.map} +1 -1
- package/dist/{renderer-88C3QpKL.d.mts → renderer-aRk849b3.d.mts} +2 -2
- package/dist/{renderer-88C3QpKL.d.mts.map → renderer-aRk849b3.d.mts.map} +1 -1
- package/dist/{renderer-BQetXCcZ.mjs → renderer-dGEMVaZ3.mjs} +4 -4
- package/dist/{renderer-BQetXCcZ.mjs.map → renderer-dGEMVaZ3.mjs.map} +1 -1
- package/dist/{renderer-RvI3qRUI.mjs → renderer-dRXP2dJU.mjs} +5 -5
- package/dist/{renderer-RvI3qRUI.mjs.map → renderer-dRXP2dJU.mjs.map} +1 -1
- package/dist/{renderer-D06HxSXO.mjs → renderer-g9SstkTz.mjs} +3 -3
- package/dist/renderer-iMrqAjix.mjs +5 -0
- package/dist/{renderer-BJ-7WRgO.mjs → renderer-opVuiAQR.mjs} +3 -3
- package/dist/{renderer-BJ-7WRgO.mjs.map → renderer-opVuiAQR.mjs.map} +1 -1
- package/dist/{renderer-KKk7myX1.mjs → renderer-puQhVfDS.mjs} +5 -5
- package/dist/{renderer-KKk7myX1.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-TKZCA0B9.mjs → renderer-vll8LX0I.mjs} +211 -72
- package/dist/renderer-vll8LX0I.mjs.map +1 -0
- package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs → renderers-CP8CFWDs-BRQyvcut.mjs} +4 -4
- package/dist/{renderers-CP8CFWDs-DRoslK4F.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-Bnr8DUC--BRDqRF6I.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +76 -11
- package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +1 -0
- package/dist/{src-BYp6r-cS.mjs → src-BzFGotRc.mjs} +250 -30
- package/dist/src-BzFGotRc.mjs.map +1 -0
- 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-CYZkDwae.d.mts.map +0 -1
- package/dist/cloud-xcfV4J03.mjs +0 -233
- package/dist/cloud-xcfV4J03.mjs.map +0 -1
- package/dist/dist-CWLLnigL.mjs.map +0 -1
- package/dist/dist-CySGkG54.mjs.map +0 -1
- package/dist/dist-EQX3TUUl.mjs.map +0 -1
- package/dist/gpu-CpkJJLQP.mjs.map +0 -1
- package/dist/index-BuiZzc6i.d.mts.map +0 -1
- package/dist/index-CEU_Zsb9.d.mts.map +0 -1
- package/dist/index-CdCrae-I.d.mts.map +0 -1
- package/dist/index-Cro-818i.d.mts.map +0 -1
- package/dist/index-D2i9J9Zq.d.mts.map +0 -1
- package/dist/index-gOVtTm-P.d.mts.map +0 -1
- package/dist/preview-BToKUTtZ.mjs.map +0 -1
- package/dist/preview-engine/chunk-4FY4TNST.mjs +0 -1
- package/dist/preview-engine/chunk-7LDSMOO3.mjs +0 -1
- package/dist/preview-engine/chunk-AGAZJZWI.mjs +0 -1
- package/dist/preview-engine/chunk-BXPM5SJ3.mjs +0 -1
- package/dist/preview-engine/chunk-C4M3B2Q2.mjs +0 -1
- package/dist/preview-engine/chunk-CIVJXFWH.mjs +0 -4
- package/dist/preview-engine/chunk-D73ZKPFN.mjs +0 -138
- package/dist/preview-engine/chunk-KOVN277Z.mjs +0 -1
- package/dist/preview-engine/chunk-M4QANUJI.mjs +0 -480
- package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
- package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
- package/dist/preview-engine/chunk-XF6DYP6B.mjs +0 -1974
- package/dist/preview-engine/chunk-XYGDTPO7.mjs +0 -39
- package/dist/preview-engine/chunk-YGKO4NIU.mjs +0 -1
- package/dist/preview-engine/renderers-2NGIILMI.mjs +0 -1
- package/dist/preview-engine/renderers-466Z77BH.mjs +0 -1
- package/dist/preview-engine/renderers-4KRENGZA.mjs +0 -1
- package/dist/preview-engine/renderers-4W52BQEU.mjs +0 -1
- package/dist/preview-engine/renderers-55PRAS7G.mjs +0 -1
- package/dist/preview-engine/renderers-5LLYINHW.mjs +0 -1
- package/dist/preview-engine/renderers-63N3Y2XO.mjs +0 -1
- package/dist/preview-engine/renderers-6ROVFDIN.mjs +0 -1
- package/dist/preview-engine/renderers-A4RVLPMG.mjs +0 -1
- package/dist/preview-engine/renderers-A53P4J6O.mjs +0 -1
- package/dist/preview-engine/renderers-AFJ3373L.mjs +0 -1
- package/dist/preview-engine/renderers-ATFWTA3U.mjs +0 -1
- package/dist/preview-engine/renderers-BPYJXHBU.mjs +0 -1
- package/dist/preview-engine/renderers-D3ZF7FXT.mjs +0 -1
- package/dist/preview-engine/renderers-D7YN6B4B.mjs +0 -1
- package/dist/preview-engine/renderers-DBLASKF5.mjs +0 -1
- package/dist/preview-engine/renderers-DC5ZYYHM.mjs +0 -1
- package/dist/preview-engine/renderers-J6ZEXW5L.mjs +0 -1
- package/dist/preview-engine/renderers-JV4MF46Q.mjs +0 -1
- package/dist/preview-engine/renderers-KQKH4ZIX.mjs +0 -1
- package/dist/preview-engine/renderers-MDHPQY6D.mjs +0 -1
- package/dist/preview-engine/renderers-MEITHN4N.mjs +0 -1
- package/dist/preview-engine/renderers-MN3HSBTJ.mjs +0 -1
- package/dist/preview-engine/renderers-NTG3QGNH.mjs +0 -1
- package/dist/preview-engine/renderers-OU4SFMB2.mjs +0 -1
- package/dist/preview-engine/renderers-P6TIBJIG.mjs +0 -1
- package/dist/preview-engine/renderers-POJWQ7L3.mjs +0 -1
- package/dist/preview-engine/renderers-RJ7S6VHD.mjs +0 -1
- package/dist/preview-engine/renderers-RJJAJZYN.mjs +0 -1
- package/dist/preview-engine/renderers-UEQ733VK.mjs +0 -1
- package/dist/preview-engine/renderers-ULO2AW2U.mjs +0 -1
- package/dist/preview-engine/renderers-UPVHGHCK.mjs +0 -1
- package/dist/preview-engine/renderers-UZHSNNIM.mjs +0 -1
- package/dist/preview-engine/renderers-V5KWZL2C.mjs +0 -1
- package/dist/preview-engine/renderers-WL372W36.mjs +0 -228
- package/dist/preview-engine/renderers-YMXKYOHQ.mjs +0 -1
- package/dist/preview-engine/renderers-YWDAZ2NZ.mjs +0 -1
- package/dist/program-Bc860ko5.mjs.map +0 -1
- package/dist/renderer--Ymc_4XJ.mjs +0 -5
- package/dist/renderer-B-OdV-eq.mjs +0 -5
- package/dist/renderer-B65fwoA2.mjs +0 -5
- package/dist/renderer-B92Ahkcv.mjs +0 -5
- package/dist/renderer-B9z2AK31.mjs +0 -5
- package/dist/renderer-BIF3Dg3Z.mjs +0 -5
- package/dist/renderer-BJUVaIAT.mjs +0 -5
- package/dist/renderer-BKRDMbI-.mjs +0 -5
- package/dist/renderer-BSwhyVWa.mjs +0 -5
- package/dist/renderer-BUqSZn2X.mjs +0 -5
- package/dist/renderer-BVKOQarx.d.mts +0 -99
- package/dist/renderer-BVKOQarx.d.mts.map +0 -1
- package/dist/renderer-BbmvjqK9.mjs +0 -3
- package/dist/renderer-Bbxh4N8Y.mjs.map +0 -1
- package/dist/renderer-BhsrlGKp.mjs.map +0 -1
- package/dist/renderer-Bpe4k_x6.mjs +0 -5
- package/dist/renderer-Bx14Wnxl.mjs.map +0 -1
- package/dist/renderer-C1NjG0CJ.mjs +0 -5
- package/dist/renderer-C7Puyst9.mjs +0 -5
- package/dist/renderer-CGA_7320.mjs +0 -5
- package/dist/renderer-CLnFkXO7.mjs +0 -5
- package/dist/renderer-CMQIT1Kh.mjs +0 -5
- package/dist/renderer-CQ1rwjIh.mjs +0 -5
- package/dist/renderer-CT8h0boY.mjs +0 -5
- package/dist/renderer-Cb0lszt3.mjs +0 -5
- package/dist/renderer-Ci7oLye9.mjs +0 -5
- package/dist/renderer-CjqXB3CZ.mjs +0 -5
- package/dist/renderer-CqTV04zQ.mjs +0 -5
- package/dist/renderer-CtWeRtHK.mjs +0 -5
- package/dist/renderer-CzolnwCo.mjs +0 -5
- package/dist/renderer-D6qhcx_C.mjs +0 -5
- package/dist/renderer-DDfEf0jt.mjs +0 -5
- package/dist/renderer-DDpa8ztp.mjs +0 -5
- package/dist/renderer-DbQBqzmx.mjs +0 -5
- package/dist/renderer-DfUcwMKa.mjs +0 -5
- package/dist/renderer-DgIjNANM.mjs +0 -6
- package/dist/renderer-Dsh6Tgu0.mjs +0 -3
- package/dist/renderer-DuIwR9GT.mjs +0 -5
- package/dist/renderer-Dv4u2c14.mjs +0 -5
- package/dist/renderer-HDj9Zb-O.mjs.map +0 -1
- package/dist/renderer-IE1yu3lZ.mjs +0 -5
- package/dist/renderer-PY_wnEN0.mjs +0 -5
- package/dist/renderer-TKZCA0B9.mjs.map +0 -1
- package/dist/renderer-gv24VyzO.mjs +0 -5
- package/dist/renderer-nN6lPZf9.mjs +0 -5
- package/dist/src-BYp6r-cS.mjs.map +0 -1
- package/dist/src-Bnr8DUC--BRDqRF6I.mjs.map +0 -1
- /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
- /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
package/dist/cli.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { i as renderCloud, t as CloudRenderError } from "./cloud-
|
|
3
|
-
import { t as failedCheck } from "./check-result-
|
|
2
|
+
import { c as AssetsError, d as runAssets, f as CONFIG_FILE, h as writeConfig, i as renderCloud, l as megabytes, m as readConfig, p as findRender, t as CloudRenderError, u as pullAssets } from "./cloud-Cj1TIme8.mjs";
|
|
3
|
+
import { t as failedCheck } from "./check-result-DZWx73V8.mjs";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
6
|
import path, { basename, dirname, join, posix, relative, resolve, sep } from "node:path";
|
|
@@ -9,34 +9,6 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
9
9
|
import { spawn } from "node:child_process";
|
|
10
10
|
import { parseArgs } from "node:util";
|
|
11
11
|
|
|
12
|
-
//#region src/cli/config.ts
|
|
13
|
-
/**
|
|
14
|
-
* `framefields.json` at the project root: where installed components live,
|
|
15
|
-
* and which fonts `framefields add` / `framefields fonts add` installed.
|
|
16
|
-
*/
|
|
17
|
-
const CONFIG_FILE = "framefields.json";
|
|
18
|
-
/** The project's config, or the default it would get: `src/components` when there is a `src`. */
|
|
19
|
-
function readConfig(cwd) {
|
|
20
|
-
const file = join(cwd, CONFIG_FILE);
|
|
21
|
-
if (existsSync(file)) {
|
|
22
|
-
const config = JSON.parse(readFileSync(file, "utf8"));
|
|
23
|
-
if (typeof config.components !== "string") throw new Error(`${CONFIG_FILE}: "components" must be a directory path`);
|
|
24
|
-
if (config.fonts !== void 0 && (typeof config.fonts !== "object" || Object.values(config.fonts).some((v) => typeof v !== "string"))) throw new Error(`${CONFIG_FILE}: "fonts" must map roles to font file paths, e.g. { "emoji": "assets/fonts/NotoColorEmoji.ttf" }`);
|
|
25
|
-
return {
|
|
26
|
-
config,
|
|
27
|
-
saved: true
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
return {
|
|
31
|
-
config: { components: existsSync(join(cwd, "src")) ? "src/components" : "components" },
|
|
32
|
-
saved: false
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function writeConfig(cwd, config) {
|
|
36
|
-
writeFileSync(join(cwd, CONFIG_FILE), `${JSON.stringify(config, null, " ")}\n`);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//#endregion
|
|
40
12
|
//#region src/cli/fonts.ts
|
|
41
13
|
/**
|
|
42
14
|
* Fonts the CLI installs into a project: a catalog of pinned files (URL,
|
|
@@ -308,7 +280,10 @@ async function add(names, options) {
|
|
|
308
280
|
report.written.push(shown);
|
|
309
281
|
}
|
|
310
282
|
if (!saved) {
|
|
311
|
-
writeConfig(cwd, {
|
|
283
|
+
writeConfig(cwd, {
|
|
284
|
+
...config,
|
|
285
|
+
components: relative(cwd, dir) || "."
|
|
286
|
+
});
|
|
312
287
|
report.configWritten = true;
|
|
313
288
|
}
|
|
314
289
|
const needs = /* @__PURE__ */ new Map();
|
|
@@ -344,11 +319,6 @@ async function add(names, options) {
|
|
|
344
319
|
//#endregion
|
|
345
320
|
//#region src/cli/templates.ts
|
|
346
321
|
/**
|
|
347
|
-
* The files `framefields init` writes: the project layout the framefields
|
|
348
|
-
* setup skill describes. `film.ts` only builds; `render.ts` renders frames,
|
|
349
|
-
* a grid, the live preview or the video; `theme.ts` holds the numbers.
|
|
350
|
-
*/
|
|
351
|
-
/**
|
|
352
322
|
* Packages with install scripts. framefields needs exactly one (skia-canvas
|
|
353
323
|
* downloads its native binary); the others work without theirs.
|
|
354
324
|
*/
|
|
@@ -369,14 +339,24 @@ const DEV_DEPENDENCIES = {
|
|
|
369
339
|
};
|
|
370
340
|
const SCRIPTS = {
|
|
371
341
|
typecheck: "tsc --noEmit -p .",
|
|
372
|
-
check: "tsc --noEmit -p . && framefields check
|
|
373
|
-
"check:render": "tsc --noEmit -p . && framefields check
|
|
342
|
+
check: "tsc --noEmit -p . && framefields check film --json",
|
|
343
|
+
"check:render": "tsc --noEmit -p . && framefields check film --render --json",
|
|
374
344
|
frames: "tsx src/render.ts frames",
|
|
375
345
|
grid: "tsx src/render.ts grid",
|
|
376
|
-
preview: "
|
|
377
|
-
render: "
|
|
378
|
-
"render:cloud": "framefields render
|
|
346
|
+
preview: "framefields preview film",
|
|
347
|
+
render: "framefields render film",
|
|
348
|
+
"render:cloud": "framefields render film --cloud"
|
|
379
349
|
};
|
|
350
|
+
/** The named render `init` records in framefields.json. */
|
|
351
|
+
function defaultRenders(name) {
|
|
352
|
+
return { film: {
|
|
353
|
+
title: name,
|
|
354
|
+
entry: "src/film.ts",
|
|
355
|
+
export: "buildFilm",
|
|
356
|
+
workers: "auto",
|
|
357
|
+
output: "output/film.mp4"
|
|
358
|
+
} };
|
|
359
|
+
}
|
|
380
360
|
/**
|
|
381
361
|
* The `package.json` fields a framefields project needs. npm reads
|
|
382
362
|
* `allowScripts`, pnpm its `pnpm` block, bun `trustedDependencies`.
|
|
@@ -505,44 +485,30 @@ export async function buildFilm(): Promise<Composition> {
|
|
|
505
485
|
const RENDER_TS = `import { existsSync } from "node:fs";
|
|
506
486
|
import fs from "node:fs/promises";
|
|
507
487
|
import path from "node:path";
|
|
508
|
-
import { HeadlessMediaRenderer, frameCount
|
|
488
|
+
import { HeadlessMediaRenderer, frameCount } from "framefields";
|
|
509
489
|
import { buildFilm } from "./film.js";
|
|
510
490
|
|
|
491
|
+
// Quick looks at the film: \`npm run frames -- 0 30 60\` and \`npm run grid\`.
|
|
492
|
+
// \`npm run render\` and \`npm run preview\` use the "film" render in
|
|
493
|
+
// framefields.json instead (\`framefields render film\`, \`framefields preview film\`).
|
|
494
|
+
|
|
511
495
|
// Optional settings such as FRAMEFIELDS_API_KEY (see .env.example).
|
|
512
496
|
const ENV = path.resolve(import.meta.dirname, "../.env");
|
|
513
497
|
if (existsSync(ENV)) process.loadEnvFile(ENV);
|
|
514
498
|
|
|
515
499
|
const OUT = path.resolve(import.meta.dirname, "../output");
|
|
516
500
|
// \`npm run frames -- 0 30\` needs the \`--\`; pnpm passes it through: drop it.
|
|
517
|
-
const [mode = "
|
|
501
|
+
const [mode = "frames", ...args] = process.argv
|
|
518
502
|
.slice(2)
|
|
519
503
|
.filter((a) => a !== "--");
|
|
520
504
|
|
|
521
|
-
if (mode === "preview") {
|
|
522
|
-
// The page runs film.ts itself and renders it with WebGPU in the browser.
|
|
523
|
-
const session = await startPreview({
|
|
524
|
-
entry: new URL("./film.ts", import.meta.url),
|
|
525
|
-
export: "buildFilm",
|
|
526
|
-
});
|
|
527
|
-
console.log(\`Preview at \${session.url}\`);
|
|
528
|
-
await session.closed; // until its tab closes or the next preview replaces it
|
|
529
|
-
process.exit(0);
|
|
530
|
-
}
|
|
531
|
-
|
|
532
505
|
const film = await buildFilm();
|
|
533
506
|
await fs.mkdir(OUT, { recursive: true });
|
|
534
507
|
|
|
535
|
-
if (mode === "
|
|
536
|
-
const
|
|
537
|
-
for (const frame of (args.length ? args : ["0"]).map(Number)) {
|
|
538
|
-
const png = await film.renderFrame({ frame, renderer });
|
|
539
|
-
const file = path.join(OUT, \`f\${String(frame).padStart(4, "0")}.png\`);
|
|
540
|
-
await fs.writeFile(file, png);
|
|
541
|
-
console.log(\`Wrote \${path.relative(process.cwd(), file)}\`);
|
|
542
|
-
}
|
|
543
|
-
} else if (mode === "grid") {
|
|
508
|
+
if (mode === "grid") {
|
|
509
|
+
const last = frameCount(film.durationMs ?? (await film.computeDuration()), film.fps) - 1;
|
|
544
510
|
const png = await film.renderFrameGrid({
|
|
545
|
-
frames: args.length ? args.map(Number) : [...new Set([0, Math.floor(
|
|
511
|
+
frames: args.length ? args.map(Number) : [...new Set([0, Math.floor(last / 2), last])],
|
|
546
512
|
columns: 4,
|
|
547
513
|
cellWidth: 480,
|
|
548
514
|
showLabels: true,
|
|
@@ -550,12 +516,13 @@ if (mode === "frames") {
|
|
|
550
516
|
await fs.writeFile(path.join(OUT, "grid.png"), png);
|
|
551
517
|
console.log("Wrote output/grid.png");
|
|
552
518
|
} else {
|
|
553
|
-
const
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
519
|
+
const renderer = new HeadlessMediaRenderer();
|
|
520
|
+
for (const frame of (args.length ? args : ["0"]).map(Number)) {
|
|
521
|
+
const png = await film.renderFrame({ frame, renderer });
|
|
522
|
+
const file = path.join(OUT, \`f\${String(frame).padStart(4, "0")}.png\`);
|
|
523
|
+
await fs.writeFile(file, png);
|
|
524
|
+
console.log(\`Wrote \${path.relative(process.cwd(), file)}\`);
|
|
525
|
+
}
|
|
559
526
|
}
|
|
560
527
|
|
|
561
528
|
// Native GPU and encoder threads keep Node alive; always exit explicitly.
|
|
@@ -571,10 +538,13 @@ ${run("typecheck")}
|
|
|
571
538
|
${run("frames")} -- 0 30 60 # PNGs in output/
|
|
572
539
|
${run("grid")} # a contact sheet of the motion
|
|
573
540
|
${run("preview")} # play it in the browser
|
|
574
|
-
${run("render")} # output/
|
|
541
|
+
${run("render")} # output/film.mp4
|
|
575
542
|
${run("render:cloud")} # on cloud GPUs, from the pushed commit
|
|
576
543
|
\`\`\`
|
|
577
544
|
|
|
545
|
+
- \`framefields.json\` names the renders: \`film\` is \`buildFilm\` in \`src/film.ts\`. Add an
|
|
546
|
+
entry under \`renders\` for each cut (a teaser, a vertical edit) and render or check it by
|
|
547
|
+
name: \`npx framefields render teaser --cloud\`, \`npx framefields check teaser\`.
|
|
578
548
|
- \`src/film.ts\` builds the composition, \`src/theme.ts\` holds sizes, colors and fonts,
|
|
579
549
|
\`src/render.ts\` renders it.
|
|
580
550
|
- \`npx framefields list\` shows ready-made components; \`npx framefields add <name>\` copies
|
|
@@ -687,10 +657,14 @@ async function init(options) {
|
|
|
687
657
|
}
|
|
688
658
|
}
|
|
689
659
|
for (const [path$1, lines] of [[".gitignore", GITIGNORE], [".gitattributes", GITATTRIBUTES]]) record(report, path$1, appendLines(join(root, path$1), lines));
|
|
660
|
+
const configExisted = existsSync(join(root, CONFIG_FILE));
|
|
690
661
|
const { config, saved } = readConfig(root);
|
|
691
|
-
if (!saved) {
|
|
692
|
-
writeConfig(root,
|
|
693
|
-
|
|
662
|
+
if (!saved || !config.renders) {
|
|
663
|
+
writeConfig(root, {
|
|
664
|
+
...config,
|
|
665
|
+
renders: config.renders ?? defaultRenders(basename(root))
|
|
666
|
+
});
|
|
667
|
+
record(report, CONFIG_FILE, configExisted || "written");
|
|
694
668
|
}
|
|
695
669
|
const installFonts = options.fonts !== false;
|
|
696
670
|
const installEmoji = options.emoji ?? installFonts;
|
|
@@ -812,6 +786,27 @@ function shownPath(cwd, root) {
|
|
|
812
786
|
return relative(cwd, root) || ".";
|
|
813
787
|
}
|
|
814
788
|
|
|
789
|
+
//#endregion
|
|
790
|
+
//#region src/cli/project-node.ts
|
|
791
|
+
/**
|
|
792
|
+
* Node arguments to run a CLI worker against the user's project: the
|
|
793
|
+
* project's own tsx loader for a TypeScript entry (TypeScript belongs to the
|
|
794
|
+
* consumer project; init's scaffold has it), and the worker script, from
|
|
795
|
+
* source when the CLI runs from source.
|
|
796
|
+
*/
|
|
797
|
+
function projectNodeArgs(entry, worker) {
|
|
798
|
+
const source = import.meta.url.endsWith(".ts");
|
|
799
|
+
const args = source ? ["--conditions=development"] : [];
|
|
800
|
+
if (source || /\.[cm]?tsx?$/.test(entry)) try {
|
|
801
|
+
const require = createRequire(resolve("package.json"));
|
|
802
|
+
args.push("--import", pathToFileURL(require.resolve("tsx")).href);
|
|
803
|
+
} catch {
|
|
804
|
+
return { error: "Install the project's tsx dev dependency to load a TypeScript entry." };
|
|
805
|
+
}
|
|
806
|
+
args.push(fileURLToPath(new URL(source ? `./${worker}.ts` : `./cli/${worker}.mjs`, import.meta.url)));
|
|
807
|
+
return args;
|
|
808
|
+
}
|
|
809
|
+
|
|
815
810
|
//#endregion
|
|
816
811
|
//#region src/cli/check.ts
|
|
817
812
|
/** The worker's IPC result is separate from arbitrary builder stdout/stderr. */
|
|
@@ -822,15 +817,8 @@ async function runCheck(options) {
|
|
|
822
817
|
const timeout = options.timeoutMs ?? 6e4;
|
|
823
818
|
if (!Number.isSafeInteger(timeout) || timeout <= 0) throw new Error("--timeout must be a positive integer in milliseconds");
|
|
824
819
|
const fail = (code, message) => failedCheck(entry, exportName, sdkVersion, code, message);
|
|
825
|
-
const
|
|
826
|
-
|
|
827
|
-
if (source || /\.[cm]?tsx?$/.test(entry)) try {
|
|
828
|
-
const require = createRequire(resolve("package.json"));
|
|
829
|
-
args.push("--import", pathToFileURL(require.resolve("tsx")).href);
|
|
830
|
-
} catch {
|
|
831
|
-
return fail("missing_ts_loader", "Install the project's tsx dev dependency to check a TypeScript entry.");
|
|
832
|
-
}
|
|
833
|
-
args.push(fileURLToPath(new URL(source ? "./check-worker.ts" : "./cli/check-worker.mjs", import.meta.url)));
|
|
820
|
+
const args = projectNodeArgs(entry, "check-worker");
|
|
821
|
+
if ("error" in args) return fail("missing_ts_loader", args.error);
|
|
834
822
|
return new Promise((done) => {
|
|
835
823
|
const child = spawn(process.execPath, args, { stdio: [
|
|
836
824
|
"ignore",
|
|
@@ -872,14 +860,17 @@ function isCheckReport(value) {
|
|
|
872
860
|
//#endregion
|
|
873
861
|
//#region src/cli/cloud.ts
|
|
874
862
|
/**
|
|
875
|
-
* `framefields render <entry> --cloud`: renders the project on
|
|
876
|
-
* api.framefields.dev and downloads the video.
|
|
877
|
-
*
|
|
863
|
+
* `framefields render <name|entry> --cloud`: renders the project on
|
|
864
|
+
* api.framefields.dev and downloads the video. `name` is a render in
|
|
865
|
+
* framefields.json; a module path renders without one. Prints one plain
|
|
866
|
+
* line per phase, and a progress line at most every 10 seconds while
|
|
867
|
+
* frames render.
|
|
878
868
|
*/
|
|
879
869
|
const PROGRESS_EVERY_MS = 1e4;
|
|
880
870
|
async function runCloudRender(o, log, render = renderCloud) {
|
|
871
|
+
const cwd = o.cwd ?? process.cwd();
|
|
881
872
|
const workers = parseWorkers(o.workers);
|
|
882
|
-
if (workers ===
|
|
873
|
+
if (workers === null) {
|
|
883
874
|
log(`--workers must be "auto" or a positive whole number, not "${o.workers}".`);
|
|
884
875
|
return 2;
|
|
885
876
|
}
|
|
@@ -887,8 +878,14 @@ async function runCloudRender(o, log, render = renderCloud) {
|
|
|
887
878
|
log(`--codec must be h264 or vp9, not "${o.codec}".`);
|
|
888
879
|
return 2;
|
|
889
880
|
}
|
|
890
|
-
const
|
|
891
|
-
|
|
881
|
+
const target = pickRender(o.entry, cwd);
|
|
882
|
+
if ("error" in target) {
|
|
883
|
+
log(target.error);
|
|
884
|
+
return 2;
|
|
885
|
+
}
|
|
886
|
+
const spec = target.name ? findRender(cwd, target.name) : void 0;
|
|
887
|
+
const outputPath = renderOutput(target, spec, o.codec ?? spec?.codec ?? "h264", o.output);
|
|
888
|
+
const planWorkers = o.plan && (workers ?? spec?.workers ?? 1) === 1 ? "auto" : workers;
|
|
892
889
|
const controller = new AbortController();
|
|
893
890
|
const onSigint = () => {
|
|
894
891
|
log("Cancelling the cloud render…");
|
|
@@ -899,25 +896,33 @@ async function runCloudRender(o, log, render = renderCloud) {
|
|
|
899
896
|
const narrate = narrator(o.json ? () => {} : log, Date.now);
|
|
900
897
|
try {
|
|
901
898
|
const result = await render({
|
|
902
|
-
|
|
899
|
+
cwd,
|
|
900
|
+
render: target.name,
|
|
901
|
+
entry: target.entry,
|
|
903
902
|
export: o.export,
|
|
904
903
|
select: o.select,
|
|
905
|
-
workers:
|
|
904
|
+
workers: planWorkers,
|
|
906
905
|
maxWorkers: o.maxWorkers ? Number(o.maxWorkers) : void 0,
|
|
907
|
-
codec,
|
|
906
|
+
codec: o.codec,
|
|
908
907
|
quality: o.quality,
|
|
909
908
|
dryRun: o.plan,
|
|
910
909
|
outputPath: o.plan ? void 0 : outputPath,
|
|
911
910
|
signal: controller.signal,
|
|
912
911
|
onProgress: narrate,
|
|
913
|
-
onWarning: (m) => log(`warning: ${m}`)
|
|
912
|
+
onWarning: (m) => log(`warning: ${m}`),
|
|
913
|
+
onLog: log
|
|
914
914
|
});
|
|
915
915
|
if (o.json) {
|
|
916
916
|
log(JSON.stringify(result));
|
|
917
917
|
return 0;
|
|
918
918
|
}
|
|
919
919
|
if (result.status === "planned") {
|
|
920
|
-
|
|
920
|
+
const planned = planWorkers === "auto" && spec?.workers !== "auto";
|
|
921
|
+
log(`Render it: ${renderCommand({
|
|
922
|
+
...o,
|
|
923
|
+
entry: target.name ?? target.entry,
|
|
924
|
+
workers: o.workers ?? (planned ? "auto" : void 0)
|
|
925
|
+
})}`);
|
|
921
926
|
return 0;
|
|
922
927
|
}
|
|
923
928
|
const bytes = result.output?.bytes;
|
|
@@ -935,11 +940,45 @@ async function runCloudRender(o, log, render = renderCloud) {
|
|
|
935
940
|
process.removeListener("SIGINT", onSigint);
|
|
936
941
|
}
|
|
937
942
|
}
|
|
943
|
+
/** The command that renders what `--plan` just planned: the same options, without `--plan`. */
|
|
944
|
+
function renderCommand(o) {
|
|
945
|
+
const flags = [
|
|
946
|
+
["--export", o.export],
|
|
947
|
+
["--select", o.select],
|
|
948
|
+
["--workers", o.workers],
|
|
949
|
+
["--max-workers", o.maxWorkers],
|
|
950
|
+
["--codec", o.codec],
|
|
951
|
+
["--quality", o.quality],
|
|
952
|
+
["--output", o.output]
|
|
953
|
+
];
|
|
954
|
+
return [`framefields render ${o.entry ?? ""} --cloud`.replace(" ", " "), ...flags.filter(([, v]) => v !== void 0).map(([f, v]) => `${f} ${v}`)].join(" ");
|
|
955
|
+
}
|
|
956
|
+
/** What a render named `name` (or the module `entry`) produces, wherever it runs. */
|
|
957
|
+
function renderOutput(target, spec, codec, output) {
|
|
958
|
+
const base = target.name ?? path.basename(target.entry ?? "").replace(/\.[^.]+$/, "");
|
|
959
|
+
return output ?? spec?.output ?? path.join("output", `${base}.${codec === "vp9" ? "webm" : "mp4"}`);
|
|
960
|
+
}
|
|
961
|
+
/**
|
|
962
|
+
* What `framefields render [arg]` renders: a render named in framefields.json,
|
|
963
|
+
* or a module path; with no argument, the project's only named render.
|
|
964
|
+
*/
|
|
965
|
+
function pickRender(arg, cwd) {
|
|
966
|
+
const renders = readConfig(cwd).config.renders ?? {};
|
|
967
|
+
const names = Object.keys(renders);
|
|
968
|
+
if (arg === void 0) {
|
|
969
|
+
if (names.length === 1) return { name: names[0] };
|
|
970
|
+
return { error: names.length ? `Name the render: ${names.join(", ")}. \`framefields renders\` lists them.` : `Name a module, e.g. \`framefields render src/film.ts\`, or add "renders" to ${CONFIG_FILE}.` };
|
|
971
|
+
}
|
|
972
|
+
if (renders[arg]) return { name: arg };
|
|
973
|
+
if (existsSync(path.resolve(cwd, arg))) return { entry: arg };
|
|
974
|
+
return { error: names.length ? `"${arg}" is neither a render in ${CONFIG_FILE} (${names.join(", ")}) nor a file.` : `"${arg}" is not a file, and ${CONFIG_FILE} names no renders.` };
|
|
975
|
+
}
|
|
976
|
+
/** --workers: undefined when not given, null when invalid. */
|
|
938
977
|
function parseWorkers(value) {
|
|
939
|
-
if (value === void 0) return
|
|
978
|
+
if (value === void 0) return void 0;
|
|
940
979
|
if (value === "auto") return "auto";
|
|
941
980
|
const n = Number(value);
|
|
942
|
-
return Number.isInteger(n) && n >= 1 ? n :
|
|
981
|
+
return Number.isInteger(n) && n >= 1 ? n : null;
|
|
943
982
|
}
|
|
944
983
|
/** Turns status polls into log lines: one per phase, throttled frame progress. */
|
|
945
984
|
function narrator(log, now) {
|
|
@@ -994,6 +1033,121 @@ function usd(value) {
|
|
|
994
1033
|
return value > 0 && value < .01 ? "<$0.01" : `$${value.toFixed(2)}`;
|
|
995
1034
|
}
|
|
996
1035
|
|
|
1036
|
+
//#endregion
|
|
1037
|
+
//#region src/cli/local.ts
|
|
1038
|
+
/**
|
|
1039
|
+
* `framefields render [name|entry]` and `framefields preview [name|entry]`
|
|
1040
|
+
* on this machine. They read the same named renders in framefields.json as
|
|
1041
|
+
* `--cloud`, so a render goes to the same file wherever it runs.
|
|
1042
|
+
*
|
|
1043
|
+
* A local render first downloads pinned assets that are missing here; a
|
|
1044
|
+
* preview doesn't need to: the page streams them from their bucket.
|
|
1045
|
+
*/
|
|
1046
|
+
async function runLocal(mode, o, log) {
|
|
1047
|
+
const cwd = o.cwd ?? process.cwd();
|
|
1048
|
+
const target = pickRender(o.entry, cwd);
|
|
1049
|
+
if ("error" in target) {
|
|
1050
|
+
log(target.error);
|
|
1051
|
+
return 2;
|
|
1052
|
+
}
|
|
1053
|
+
const spec = target.name ? findRender(cwd, target.name) : void 0;
|
|
1054
|
+
const entry = path.resolve(cwd, spec?.entry ?? target.entry);
|
|
1055
|
+
const codec = o.codec ?? spec?.codec ?? "h264";
|
|
1056
|
+
if (codec !== "h264" && codec !== "vp9") {
|
|
1057
|
+
log(`--codec must be h264 or vp9, not "${codec}".`);
|
|
1058
|
+
return 2;
|
|
1059
|
+
}
|
|
1060
|
+
const engine = projectEngine(entry);
|
|
1061
|
+
if (!engine) {
|
|
1062
|
+
log("framefields isn't installed in this project: `npm i framefields`.");
|
|
1063
|
+
return 2;
|
|
1064
|
+
}
|
|
1065
|
+
const job = {
|
|
1066
|
+
mode,
|
|
1067
|
+
entry,
|
|
1068
|
+
engine,
|
|
1069
|
+
export: o.export ?? spec?.export ?? "buildFilm",
|
|
1070
|
+
args: spec?.args,
|
|
1071
|
+
select: o.select ?? spec?.select,
|
|
1072
|
+
codec,
|
|
1073
|
+
quality: o.quality ?? spec?.quality,
|
|
1074
|
+
outputPath: path.resolve(cwd, renderOutput(target, spec, codec, o.output)),
|
|
1075
|
+
title: spec?.title ?? target.name
|
|
1076
|
+
};
|
|
1077
|
+
if (mode === "preview" && (job.args !== void 0 || job.select)) log("The preview calls the export without args or select; it shows what the export returns by default.");
|
|
1078
|
+
if (mode === "render" && !await ensureAssets(cwd, log)) return 1;
|
|
1079
|
+
const result = await runWorker(job, cwd);
|
|
1080
|
+
if (!result.ok) {
|
|
1081
|
+
log(result.message);
|
|
1082
|
+
return 1;
|
|
1083
|
+
}
|
|
1084
|
+
if (result.filePath) log(`Rendered ${path.relative(cwd, result.filePath) || result.filePath}`);
|
|
1085
|
+
return result.qaPassed === false ? 1 : 0;
|
|
1086
|
+
}
|
|
1087
|
+
/** The framefields the film imports, resolved from its module. */
|
|
1088
|
+
function projectEngine(entry) {
|
|
1089
|
+
try {
|
|
1090
|
+
return pathToFileURL(createRequire(entry).resolve("framefields")).href;
|
|
1091
|
+
} catch {
|
|
1092
|
+
return;
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
/** Downloads pinned assets missing here; false (after saying why) when it can't. */
|
|
1096
|
+
async function ensureAssets(cwd, log) {
|
|
1097
|
+
const assets = readConfig(cwd).config.assets ?? {};
|
|
1098
|
+
if (Object.keys(assets).length === 0) return true;
|
|
1099
|
+
try {
|
|
1100
|
+
const { downloaded, changed } = await pullAssets({
|
|
1101
|
+
cwd,
|
|
1102
|
+
log
|
|
1103
|
+
});
|
|
1104
|
+
if (downloaded.length) {
|
|
1105
|
+
const bytes = downloaded.reduce((n, p) => n + (assets[p]?.size ?? 0), 0);
|
|
1106
|
+
log(`Downloaded ${downloaded.length} pinned assets (${megabytes(bytes)}).`);
|
|
1107
|
+
}
|
|
1108
|
+
if (changed.length) log(`Rendering local edits of pinned assets: ${changed.join(", ")}. \`framefields assets add\` pins them for the cloud.`);
|
|
1109
|
+
return true;
|
|
1110
|
+
} catch (err) {
|
|
1111
|
+
if (!(err instanceof AssetsError)) throw err;
|
|
1112
|
+
log(err.message);
|
|
1113
|
+
return false;
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
function runWorker(job, cwd) {
|
|
1117
|
+
const args = projectNodeArgs(job.entry, "local-worker");
|
|
1118
|
+
if ("error" in args) return Promise.resolve({
|
|
1119
|
+
ok: false,
|
|
1120
|
+
message: args.error
|
|
1121
|
+
});
|
|
1122
|
+
return new Promise((done) => {
|
|
1123
|
+
const child = spawn(process.execPath, args, {
|
|
1124
|
+
cwd,
|
|
1125
|
+
stdio: [
|
|
1126
|
+
"inherit",
|
|
1127
|
+
"inherit",
|
|
1128
|
+
"inherit",
|
|
1129
|
+
"ipc"
|
|
1130
|
+
]
|
|
1131
|
+
});
|
|
1132
|
+
let result;
|
|
1133
|
+
child.on("message", (message) => {
|
|
1134
|
+
result = message;
|
|
1135
|
+
});
|
|
1136
|
+
child.on("error", (error) => done({
|
|
1137
|
+
ok: false,
|
|
1138
|
+
message: error.message
|
|
1139
|
+
}));
|
|
1140
|
+
child.on("close", (code, signal) => done(result ?? (signal === "SIGINT" || code === 130 ? {
|
|
1141
|
+
ok: false,
|
|
1142
|
+
message: "Stopped."
|
|
1143
|
+
} : {
|
|
1144
|
+
ok: false,
|
|
1145
|
+
message: `The ${job.mode} exited without a result (code ${code}, signal ${signal}).`
|
|
1146
|
+
})));
|
|
1147
|
+
child.send(job);
|
|
1148
|
+
});
|
|
1149
|
+
}
|
|
1150
|
+
|
|
997
1151
|
//#endregion
|
|
998
1152
|
//#region src/cli/registry.ts
|
|
999
1153
|
/**
|
|
@@ -1044,14 +1198,21 @@ function openRegistry(source, cwd = process.cwd()) {
|
|
|
1044
1198
|
* npx framefields list the components you can add
|
|
1045
1199
|
* npx framefields fonts add <role...> install fonts (emoji)
|
|
1046
1200
|
* npx framefields fonts list the fonts you can install
|
|
1047
|
-
* npx framefields
|
|
1201
|
+
* npx framefields assets add|push|pull|status media on your own bucket
|
|
1202
|
+
* npx framefields renders the renders named in framefields.json
|
|
1203
|
+
* npx framefields render <name> render on this machine's GPU
|
|
1204
|
+
* npx framefields render <name> --cloud render on api.framefields.dev
|
|
1205
|
+
* npx framefields preview <name> play it in the browser
|
|
1048
1206
|
*/
|
|
1049
1207
|
const HELP = `Usage: framefields <command> [options]
|
|
1050
1208
|
|
|
1051
1209
|
Commands:
|
|
1052
1210
|
api JSON reference generated from timing, grid and check types.
|
|
1053
|
-
check
|
|
1054
|
-
|
|
1211
|
+
check [name|entry]
|
|
1212
|
+
Build, validate and lint a composition; --render also writes a
|
|
1213
|
+
representative frame and grid. A render named in
|
|
1214
|
+
framefields.json, or a module (--export defaults to
|
|
1215
|
+
buildFilm); with neither, every named render.
|
|
1055
1216
|
init [dir] Start a framefields project in dir (default: here), or add
|
|
1056
1217
|
framefields to the project there: package.json, tsconfig,
|
|
1057
1218
|
src/theme.ts, film.ts, render.ts, assets/, .gitignore,
|
|
@@ -1064,10 +1225,27 @@ Commands:
|
|
|
1064
1225
|
Install fonts (pinned, hash-checked, with their license)
|
|
1065
1226
|
and register them in the generated <components>/fonts.ts.
|
|
1066
1227
|
fonts list List the fonts you can install.
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1228
|
+
assets add <path...>
|
|
1229
|
+
Keep media out of git: hash files (or every file in a
|
|
1230
|
+
folder), upload them to the project's bucket (R2, S3, any
|
|
1231
|
+
S3-compatible storage) and pin them in framefields.json.
|
|
1232
|
+
assets push Upload recorded assets the bucket lacks.
|
|
1233
|
+
assets pull Download missing assets, checked against their sha256.
|
|
1234
|
+
assets status Which assets are here, missing or changed.
|
|
1235
|
+
renders List the renders named in framefields.json.
|
|
1236
|
+
render [name|entry]
|
|
1237
|
+
Render on this machine: a render named in framefields.json
|
|
1238
|
+
(its fields are the defaults; flags override them), or a
|
|
1239
|
+
module (--export defaults to buildFilm). Without either,
|
|
1240
|
+
the project's only named render. Pinned assets missing
|
|
1241
|
+
here are downloaded first.
|
|
1242
|
+
render [name|entry] --cloud
|
|
1243
|
+
The same render on api.framefields.dev, from the pushed
|
|
1244
|
+
commit of this git repo, downloaded to the same file.
|
|
1245
|
+
Needs FRAMEFIELDS_API_KEY.
|
|
1246
|
+
preview [name|entry]
|
|
1247
|
+
Play it in the browser (localhost, WebGPU). Pinned assets
|
|
1248
|
+
that aren't here stream from their bucket.
|
|
1071
1249
|
|
|
1072
1250
|
Options for check:
|
|
1073
1251
|
--export <name> Composition or builder export (default buildFilm).
|
|
@@ -1077,6 +1255,10 @@ Options for check:
|
|
|
1077
1255
|
--warnings-as-errors Fail on lint warnings.
|
|
1078
1256
|
--json Machine-readable check, component list, or font list result.
|
|
1079
1257
|
|
|
1258
|
+
Options for render and preview:
|
|
1259
|
+
--export, --select, --codec, --quality and --output (render) override the
|
|
1260
|
+
named render's fields, locally and with --cloud.
|
|
1261
|
+
|
|
1080
1262
|
Options for render --cloud:
|
|
1081
1263
|
--workers <n|auto> 1 (default) renders on one GPU. auto measures the film
|
|
1082
1264
|
first and splits it across as many GPUs as stay
|
|
@@ -1084,13 +1266,21 @@ Options for render --cloud:
|
|
|
1084
1266
|
--max-workers <n> Upper bound for auto.
|
|
1085
1267
|
--plan Measure and plan only: prints workers, time and the
|
|
1086
1268
|
estimated cost, renders nothing.
|
|
1087
|
-
--output <file> Where the video goes (default output/<
|
|
1269
|
+
--output <file> Where the video goes (default output/<name>.mp4).
|
|
1088
1270
|
--codec <codec> h264 (default) or vp9.
|
|
1089
1271
|
--quality <q> very_low, low, high or very_high (default).
|
|
1090
1272
|
--select <name> When the export returns several compositions.
|
|
1091
1273
|
--json Print the final status as JSON.
|
|
1092
1274
|
Ctrl-C cancels the render; GPU time already used is charged.
|
|
1093
1275
|
|
|
1276
|
+
Options for assets:
|
|
1277
|
+
--remote <name> The remote in framefields.json "storage" (default: its
|
|
1278
|
+
default, or its only one).
|
|
1279
|
+
--overwrite pull: replace files changed locally.
|
|
1280
|
+
Keys: FRAMEFIELDS_STORAGE_<REMOTE>_ACCESS_KEY_ID and _SECRET_ACCESS_KEY,
|
|
1281
|
+
or AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. Reads need none when the
|
|
1282
|
+
remote has a publicUrl (a custom domain or CDN in front of the bucket).
|
|
1283
|
+
|
|
1094
1284
|
Options for init:
|
|
1095
1285
|
--name <name> Package name (default: the folder's name).
|
|
1096
1286
|
--pm <manager> npm, pnpm, yarn or bun (default: the one running this).
|
|
@@ -1118,7 +1308,10 @@ Examples:
|
|
|
1118
1308
|
npx framefields init my-film --install
|
|
1119
1309
|
npx framefields add mouse-pointer focus-zoom
|
|
1120
1310
|
npx framefields fonts add emoji
|
|
1121
|
-
npx framefields
|
|
1311
|
+
npx framefields assets add assets/footage
|
|
1312
|
+
npx framefields preview film
|
|
1313
|
+
npx framefields render film
|
|
1314
|
+
npx framefields render film --cloud --plan
|
|
1122
1315
|
`;
|
|
1123
1316
|
async function main(argv) {
|
|
1124
1317
|
const { values, positionals } = parseArgs({
|
|
@@ -1150,6 +1343,7 @@ async function main(argv) {
|
|
|
1150
1343
|
codec: { type: "string" },
|
|
1151
1344
|
quality: { type: "string" },
|
|
1152
1345
|
select: { type: "string" },
|
|
1346
|
+
remote: { type: "string" },
|
|
1153
1347
|
help: {
|
|
1154
1348
|
type: "boolean",
|
|
1155
1349
|
short: "h"
|
|
@@ -1162,6 +1356,7 @@ async function main(argv) {
|
|
|
1162
1356
|
return command || values.help ? 0 : 1;
|
|
1163
1357
|
}
|
|
1164
1358
|
const cwd = process.cwd();
|
|
1359
|
+
if (existsSync(join(cwd, ".env"))) process.loadEnvFile(join(cwd, ".env"));
|
|
1165
1360
|
const log = (line) => process.stdout.write(`${line}\n`);
|
|
1166
1361
|
if (command === "api") {
|
|
1167
1362
|
const catalog = JSON.parse(readFileSync(fileURLToPath(new URL(import.meta.url.endsWith(".ts") ? "../dist/api.json" : "./api.json", import.meta.url)), "utf8"));
|
|
@@ -1171,30 +1366,32 @@ async function main(argv) {
|
|
|
1171
1366
|
}));
|
|
1172
1367
|
return 0;
|
|
1173
1368
|
}
|
|
1174
|
-
if (command === "check")
|
|
1175
|
-
|
|
1176
|
-
|
|
1369
|
+
if (command === "check") return check(names, cwd, values, log);
|
|
1370
|
+
if (command === "renders") return listRenders(cwd, values.json, log);
|
|
1371
|
+
if (command === "assets") return runAssets(names, {
|
|
1372
|
+
cwd,
|
|
1373
|
+
log,
|
|
1374
|
+
remote: values.remote,
|
|
1375
|
+
overwrite: values.overwrite,
|
|
1376
|
+
json: values.json
|
|
1377
|
+
});
|
|
1378
|
+
if (command === "preview" || command === "render" && !values.cloud) {
|
|
1379
|
+
if (names.length > 1) {
|
|
1380
|
+
process.stderr.write(`Usage: framefields ${command} [name|entry] [--export <name>]\n`);
|
|
1177
1381
|
return 2;
|
|
1178
1382
|
}
|
|
1179
|
-
|
|
1383
|
+
return runLocal(command === "preview" ? "preview" : "render", {
|
|
1180
1384
|
entry: names[0],
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
});
|
|
1187
|
-
if (values.json) log(JSON.stringify(report$1));
|
|
1188
|
-
else {
|
|
1189
|
-
log(`Check ${report$1.status}: ${report$1.entry} (${report$1.exportName})`);
|
|
1190
|
-
for (const d of report$1.diagnostics) log(`${d.severity} ${d.code}${d.path ? ` at ${d.path}` : ""}: ${d.message}`);
|
|
1191
|
-
for (const file of report$1.artifacts) log(`Wrote ${file}`);
|
|
1192
|
-
}
|
|
1193
|
-
return report$1.status === "passed" ? 0 : 1;
|
|
1385
|
+
export: values.export,
|
|
1386
|
+
select: values.select,
|
|
1387
|
+
codec: values.codec,
|
|
1388
|
+
quality: values.quality,
|
|
1389
|
+
output: values.output
|
|
1390
|
+
}, log);
|
|
1194
1391
|
}
|
|
1195
1392
|
if (command === "render") {
|
|
1196
|
-
if (names.length
|
|
1197
|
-
process.stderr.write("Usage: framefields render
|
|
1393
|
+
if (names.length > 1) {
|
|
1394
|
+
process.stderr.write("Usage: framefields render [name|entry] --cloud [--workers auto] [--plan]\n");
|
|
1198
1395
|
return 2;
|
|
1199
1396
|
}
|
|
1200
1397
|
return runCloudRender({
|
|
@@ -1284,6 +1481,75 @@ async function main(argv) {
|
|
|
1284
1481
|
}
|
|
1285
1482
|
const onDownload = (spec) => process.stdout.write(` fetching ${spec.file} (${(spec.font.bytes / 1e6).toFixed(1)} MB, ${spec.license.id})\n`);
|
|
1286
1483
|
/** What `add` did about fonts, and how to use them. */
|
|
1484
|
+
/** `check [name|entry]`: a named render, a module, or every named render. */
|
|
1485
|
+
async function check(names, cwd, values, log) {
|
|
1486
|
+
const renders = readConfig(cwd).config.renders ?? {};
|
|
1487
|
+
const usage = () => {
|
|
1488
|
+
process.stderr.write("Usage: framefields check [name|entry] [--export buildFilm] [--render] [--json]\n");
|
|
1489
|
+
return 2;
|
|
1490
|
+
};
|
|
1491
|
+
if (names.length > 1) return usage();
|
|
1492
|
+
const targets = names.length === 0 ? Object.entries(renders).map(([name, spec]) => ({
|
|
1493
|
+
name,
|
|
1494
|
+
entry: spec.entry,
|
|
1495
|
+
exportName: spec.export
|
|
1496
|
+
})) : renders[names[0]] ? [{
|
|
1497
|
+
name: names[0],
|
|
1498
|
+
entry: renders[names[0]].entry,
|
|
1499
|
+
exportName: values.export ?? renders[names[0]].export
|
|
1500
|
+
}] : [{
|
|
1501
|
+
entry: names[0],
|
|
1502
|
+
exportName: values.export
|
|
1503
|
+
}];
|
|
1504
|
+
if (targets.length === 0) return usage();
|
|
1505
|
+
const reports = [];
|
|
1506
|
+
for (const t of targets) {
|
|
1507
|
+
const report = await runCheck({
|
|
1508
|
+
entry: t.entry,
|
|
1509
|
+
exportName: t.exportName,
|
|
1510
|
+
render: values.render,
|
|
1511
|
+
outputDir: values.output ?? (targets.length > 1 ? join("output", "check", t.name ?? "") : void 0),
|
|
1512
|
+
timeoutMs: values.timeout === void 0 ? void 0 : Number(values.timeout),
|
|
1513
|
+
warningsAsErrors: values["warnings-as-errors"]
|
|
1514
|
+
});
|
|
1515
|
+
reports.push({
|
|
1516
|
+
...t.name && { name: t.name },
|
|
1517
|
+
...report
|
|
1518
|
+
});
|
|
1519
|
+
if (values.json) continue;
|
|
1520
|
+
log(`Check ${report.status}: ${t.name ? `${t.name} (${t.entry}, ${report.exportName})` : `${report.entry} (${report.exportName})`}`);
|
|
1521
|
+
for (const d of report.diagnostics) log(`${d.severity} ${d.code}${d.path ? ` at ${d.path}` : ""}: ${d.message}`);
|
|
1522
|
+
for (const file of report.artifacts) log(`Wrote ${file}`);
|
|
1523
|
+
}
|
|
1524
|
+
const passed = reports.every((r) => r.status === "passed");
|
|
1525
|
+
if (values.json) log(JSON.stringify(names.length === 0 ? {
|
|
1526
|
+
status: passed ? "passed" : "failed",
|
|
1527
|
+
checks: reports
|
|
1528
|
+
} : reports[0]));
|
|
1529
|
+
return passed ? 0 : 1;
|
|
1530
|
+
}
|
|
1531
|
+
/** `renders`: what framefields.json names, as the dashboard shows it. */
|
|
1532
|
+
function listRenders(cwd, json, log) {
|
|
1533
|
+
const renders = readConfig(cwd).config.renders ?? {};
|
|
1534
|
+
if (json) {
|
|
1535
|
+
log(JSON.stringify({
|
|
1536
|
+
schemaVersion: 1,
|
|
1537
|
+
renders
|
|
1538
|
+
}));
|
|
1539
|
+
return 0;
|
|
1540
|
+
}
|
|
1541
|
+
const entries = Object.entries(renders);
|
|
1542
|
+
if (entries.length === 0) {
|
|
1543
|
+
log("framefields.json names no renders. Add one: \"renders\": { \"film\": { \"entry\": \"src/film.ts\", \"export\": \"buildFilm\" } }");
|
|
1544
|
+
return 0;
|
|
1545
|
+
}
|
|
1546
|
+
for (const [name, spec] of entries) {
|
|
1547
|
+
const title = spec.title && spec.title !== name ? ` ${spec.title}` : "";
|
|
1548
|
+
const opts = [spec.workers !== void 0 && `workers ${spec.workers}`, spec.codec].filter(Boolean);
|
|
1549
|
+
log(`${name}${title}\n ${spec.entry} · ${spec.export ?? "buildFilm"}${spec.select ? ` · ${spec.select}` : ""}${opts.length ? ` · ${opts.join(", ")}` : ""}${spec.description ? `\n ${spec.description}` : ""}`);
|
|
1550
|
+
}
|
|
1551
|
+
return 0;
|
|
1552
|
+
}
|
|
1287
1553
|
function logFonts(report, cwd, log) {
|
|
1288
1554
|
for (const f of report.fonts) log(` ${f.status === "installed" ? "font " : "font ok "} ${f.path} (${f.role}, for ${f.by}: ${f.why})`);
|
|
1289
1555
|
for (const f of report.fontsSkipped) log(` no font ${f.role} for ${f.by} (--no-fonts): ${f.why} Install later with \`framefields fonts add ${f.role}\`.`);
|