hyperframes 0.8.191 → 0.8.192

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.
Files changed (211) hide show
  1. package/dist/{add-S2ZQYG52.js → add-TZU2UW7A.js} +17 -17
  2. package/dist/{animatedGifPrep-3JA2CQ3U.js → animatedGifPrep-NLAXC3VV.js} +11 -10
  3. package/dist/api.js +24 -23
  4. package/dist/{appHistory-TH3TL6N6.js → appHistory-QVCSAOI4.js} +1 -1
  5. package/dist/{asset-2CNTAPOC.js → asset-JAJXA6LB.js} +2 -2
  6. package/dist/{assetCataloger-5HXLXL7C.js → assetCataloger-4WTX3J4I.js} +13 -12
  7. package/dist/{audio-DZTSYHXS.js → audio-XLWC7JKS.js} +22 -21
  8. package/dist/{auth-GX3M6TJ4.js → auth-5K6X3NPJ.js} +4 -4
  9. package/dist/{autoUpdate-EDIWE4Z5.js → autoUpdate-RNV7SKGB.js} +4 -4
  10. package/dist/{backgroundChecks-VPUPJ7UI.js → backgroundChecks-QXLVZVGX.js} +5 -5
  11. package/dist/backgroundChecksWorker.js +5 -5
  12. package/dist/{batchRender-JHIIDBJR.js → batchRender-THKSPDZR.js} +14 -7
  13. package/dist/{beats-PZRVTRYW.js → beats-K7CGCFVL.js} +53 -15
  14. package/dist/{benchmark-22UFDW2N.js → benchmark-PHRDIXNL.js} +18 -14
  15. package/dist/{browser-VRDWYIUM.js → browser-GN6R5ZSK.js} +7 -7
  16. package/dist/{bundleWithLocalizedFonts-23QDKFSN.js → bundleWithLocalizedFonts-C325UNR4.js} +3 -3
  17. package/dist/{capture-TOCLXYMJ.js → capture-6UBQFHZQ.js} +76 -68
  18. package/dist/{capture-NFCBXHDE.js → capture-BZ7APOGQ.js} +3 -3
  19. package/dist/{captureCompositionFrame-BEM6MF7F.js → captureCompositionFrame-VORSCTWC.js} +17 -16
  20. package/dist/{catalog-NXS35KM7.js → catalog-PHU2RUZ3.js} +18 -18
  21. package/dist/{catch-up-6WJBUI2C.js → catch-up-HCNRM46J.js} +7 -7
  22. package/dist/{check-WVEBMWN5.js → check-TJ5ZLB4I.js} +43 -42
  23. package/dist/{checkBrowser-RT45HJ36.js → checkBrowser-DWP7ZXJ7.js} +38 -37
  24. package/dist/{chunk-KAC2WR7P.js → chunk-2HP5GIQ3.js} +3 -3
  25. package/dist/{chunk-2WNVHZHA.js → chunk-2J3NA3OB.js} +13 -13
  26. package/dist/{chunk-B2A56S5C.js → chunk-2MCXIY4B.js} +13 -10
  27. package/dist/{chunk-DCAI5DBR.js → chunk-2ST4WAFY.js} +9 -1
  28. package/dist/{chunk-3NRB7YXW.js → chunk-2VXY3PEF.js} +96 -67
  29. package/dist/{chunk-LBNEH6IQ.js → chunk-32NB4VMH.js} +1 -1
  30. package/dist/{chunk-IXLUTE6N.js → chunk-3422KMTD.js} +5 -1
  31. package/dist/{chunk-JTPHFYZI.js → chunk-3CXIX6XS.js} +68 -7
  32. package/dist/{chunk-MSM6VRQ4.js → chunk-3FV5BVWS.js} +2 -2
  33. package/dist/{chunk-7ZJEQY7Q.js → chunk-4E75LHAL.js} +23 -3
  34. package/dist/{chunk-TMBUBLZB.js → chunk-4HCJOFMB.js} +166 -46
  35. package/dist/{chunk-JJJCFKMF.js → chunk-5IPKQHOL.js} +17 -6
  36. package/dist/{chunk-WQ3X5OH4.js → chunk-5TRFLZ5Z.js} +2 -2
  37. package/dist/{chunk-HRPWRZGF.js → chunk-6N65ZMC5.js} +1 -1
  38. package/dist/{chunk-XUXGIA7H.js → chunk-6NLPPKBO.js} +1 -2
  39. package/dist/{chunk-RE3EEBWC.js → chunk-6WNLQI63.js} +4 -4
  40. package/dist/{chunk-7FF36MAD.js → chunk-6XVKMBUA.js} +9 -6
  41. package/dist/{chunk-7NKJS5KM.js → chunk-7JJMT6LN.js} +1 -1
  42. package/dist/{chunk-JOLZ3BSL.js → chunk-7LLRMYP6.js} +2 -2
  43. package/dist/{chunk-COETAXRN.js → chunk-7RSY7SZN.js} +2 -2
  44. package/dist/{chunk-JGTRVG32.js → chunk-7UZC4N62.js} +1 -1
  45. package/dist/{chunk-XWOCXIKR.js → chunk-A4OI5ZNX.js} +1 -1
  46. package/dist/{chunk-VYQYVYQ5.js → chunk-AEXVVABM.js} +83 -45
  47. package/dist/{chunk-DOOSC34Z.js → chunk-AMZJFCOX.js} +8 -8
  48. package/dist/{chunk-OV6KHXLX.js → chunk-AR46ND2Q.js} +1 -1
  49. package/dist/chunk-B2XLXD7V.js +3897 -0
  50. package/dist/{chunk-XMSQRDAK.js → chunk-BEOK6F26.js} +2 -2
  51. package/dist/{chunk-U5GTDAQL.js → chunk-BPKLUHFT.js} +7 -7
  52. package/dist/{chunk-TFGO5YMI.js → chunk-BV6YE455.js} +2 -2
  53. package/dist/{chunk-XGHHVYC7.js → chunk-BY6OQ6XP.js} +2 -2
  54. package/dist/{chunk-JQYJXUJW.js → chunk-C6KE4AFW.js} +1 -1
  55. package/dist/{chunk-TMK4Q7JA.js → chunk-CFUCHO4T.js} +20 -5
  56. package/dist/{chunk-KV72BP7O.js → chunk-CXRZBWSH.js} +11 -11
  57. package/dist/chunk-CZGHFATT.js +31 -0
  58. package/dist/{chunk-CYBXXSC4.js → chunk-DIKAPMMF.js} +2 -2
  59. package/dist/{chunk-7L37AB57.js → chunk-E3P3LJG6.js} +9 -9
  60. package/dist/{chunk-JYSSPQDT.js → chunk-E5V6WEMK.js} +11 -11
  61. package/dist/{chunk-T5YF32WV.js → chunk-EKGGSAWR.js} +6 -5
  62. package/dist/{chunk-7KVVNF7B.js → chunk-ELP5QZWL.js} +1 -1
  63. package/dist/{chunk-QH3T4WI2.js → chunk-EXAX37XR.js} +8 -2
  64. package/dist/{chunk-EI7FP7F3.js → chunk-FBVUAH7N.js} +12 -2
  65. package/dist/{chunk-W3CS2KFV.js → chunk-GANST5K3.js} +2 -2
  66. package/dist/{chunk-3WJT2JCX.js → chunk-IMSI7IFW.js} +52 -23
  67. package/dist/{chunk-W64L7IFS.js → chunk-IW5G323T.js} +1 -1
  68. package/dist/{chunk-RWYUK7LM.js → chunk-J2ASTCU6.js} +2 -2
  69. package/dist/{chunk-3XI7MIZB.js → chunk-J2BSUF6X.js} +1 -1
  70. package/dist/{chunk-WY3TQ2PT.js → chunk-JCDYDF54.js} +2 -2
  71. package/dist/{chunk-ALEF2F5N.js → chunk-K2AKVYNR.js} +2 -2
  72. package/dist/{chunk-TADJOIFW.js → chunk-KZOZN4PI.js} +4 -4
  73. package/dist/{chunk-CINKQY6M.js → chunk-L2YGSAOL.js} +3 -3
  74. package/dist/{chunk-AQB5M53R.js → chunk-LOKCBZYF.js} +3 -3
  75. package/dist/{chunk-7A65UCMI.js → chunk-MEE4NTPZ.js} +2 -2
  76. package/dist/{chunk-GM3WIOO6.js → chunk-MGBUWPXX.js} +2 -2
  77. package/dist/{chunk-ZHKUIC7X.js → chunk-MVIJTXN5.js} +21 -14
  78. package/dist/{chunk-SMEF3TRJ.js → chunk-ODBYZIOH.js} +15 -15
  79. package/dist/{chunk-NJGTNWQY.js → chunk-OQL4AJ4X.js} +6 -6
  80. package/dist/{chunk-5C7R55BJ.js → chunk-P2I4RLJE.js} +1 -1
  81. package/dist/{chunk-7LUJE3II.js → chunk-PFRG5P32.js} +1 -1
  82. package/dist/{chunk-RUOG4VB7.js → chunk-PKZ7RK5N.js} +5 -4
  83. package/dist/{chunk-LLFQA7XF.js → chunk-QFPBRZJD.js} +1 -1
  84. package/dist/{chunk-TJKE4EYX.js → chunk-QWLES6YV.js} +3 -3
  85. package/dist/{chunk-NMDUSCCE.js → chunk-QX4TB4NH.js} +160 -56
  86. package/dist/{chunk-CXMXJEVY.js → chunk-R2U2G4OS.js} +1 -1
  87. package/dist/{chunk-46HEFGXJ.js → chunk-REUL2KH2.js} +1 -1
  88. package/dist/{chunk-KGMHMYWI.js → chunk-RHYOWDI6.js} +2 -2
  89. package/dist/{chunk-DYAPHNV6.js → chunk-RWGASWT7.js} +1 -1
  90. package/dist/chunk-RXATE6FZ.js +385 -0
  91. package/dist/{chunk-EFCKV7MY.js → chunk-SBBQFPCJ.js} +1 -1
  92. package/dist/{chunk-KHCTBZGJ.js → chunk-SK7TR7BL.js} +4 -4
  93. package/dist/{chunk-KNU5COPB.js → chunk-T2EUWCJE.js} +1 -1
  94. package/dist/{chunk-TRZVS6TL.js → chunk-T6O5OLN2.js} +3 -3
  95. package/dist/{chunk-TFMZ4RKM.js → chunk-ULTKB5FC.js} +23 -12
  96. package/dist/{chunk-UNR3P7IF.js → chunk-VNPADTDD.js} +3 -3
  97. package/dist/{chunk-BFFLKQVB.js → chunk-VOM2HLUI.js} +4 -4
  98. package/dist/{chunk-GLG5JWLI.js → chunk-VRAXIQ6I.js} +2 -2
  99. package/dist/{chunk-NAUKCKCJ.js → chunk-W24SZ5FL.js} +4 -4
  100. package/dist/{chunk-COWQITWP.js → chunk-WOKVXK4J.js} +1 -1
  101. package/dist/{chunk-WJEVUPVD.js → chunk-XF77MK3J.js} +1 -1
  102. package/dist/{chunk-HYW6HTAK.js → chunk-XX2PA4L3.js} +2 -2
  103. package/dist/{chunk-RQBB7PYT.js → chunk-YMQQXPD5.js} +2 -2
  104. package/dist/{chunk-WHAEJX26.js → chunk-YWRQHRDY.js} +17 -12
  105. package/dist/{chunk-FBDOHH3Q.js → chunk-ZEMDV6W2.js} +29 -59
  106. package/dist/{clean-3VIU2BSK.js → clean-2RNCTDBT.js} +40 -27
  107. package/dist/cli.js +69 -67
  108. package/dist/{cloud-NA3J4XW2.js → cloud-NFIKESNZ.js} +4 -4
  109. package/dist/{cloudrun-4MHOF7UT.js → cloudrun-7224BCX3.js} +9 -9
  110. package/dist/commands/contrast-audit.browser.js +1 -1
  111. package/dist/{compare-ZR7XRPPT.js → compare-HL44MXVX.js} +76 -47
  112. package/dist/{compiler-MA2ELZPG.js → compiler-WF5QTXV7.js} +8 -7
  113. package/dist/{component-ZJSOPUAM.js → component-ZBZXSJBR.js} +3 -3
  114. package/dist/{compositions-WA5V2SHF.js → compositions-76P7LDDX.js} +19 -17
  115. package/dist/{contactSheet-CAGMKI3E.js → contactSheet-43ISAESM.js} +2 -2
  116. package/dist/{delete-UC427UEA.js → delete-4YZBYOHJ.js} +7 -7
  117. package/dist/{deploy-B5UO4UIK.js → deploy-UGUUGYLF.js} +1 -1
  118. package/dist/{deterministicFonts-EGAAE7QL.js → deterministicFonts-RO2TCMLZ.js} +3 -3
  119. package/dist/{dist-BPK37SAB.js → dist-5KKCRFPT.js} +5 -5
  120. package/dist/{dist-XGPSPKKP.js → dist-QQ26RUDV.js} +5 -4
  121. package/dist/{doctor-ZERCTKEK.js → doctor-GGVUK4NB.js} +20 -19
  122. package/dist/{events-DCOZQERS.js → events-OXPTHVDB.js} +4 -4
  123. package/dist/{events-CNIXB2QK.js → events-V2VU4J3B.js} +5 -5
  124. package/dist/{feedback-YBD5ITTY.js → feedback-HFZ5SCUK.js} +16 -16
  125. package/dist/{ffmpeg-V4BBFDTG.js → ffmpeg-3VHY7GO3.js} +13 -12
  126. package/dist/{figma-Z45ZYVGE.js → figma-7SEZTLBJ.js} +3 -3
  127. package/dist/fontLocalizeCli.js +14 -13
  128. package/dist/{get-23NXQWCD.js → get-Y2S2PXCM.js} +7 -7
  129. package/dist/{gpuPolicy-H6ABHVEB.js → gpuPolicy-UHPOWRV5.js} +11 -10
  130. package/dist/{grade-compare-ZPX2G3UV.js → grade-compare-4VTXSQM5.js} +38 -37
  131. package/dist/{gsapParserAcorn-SKODXC2N.js → gsapParserAcorn-OOTY2MVN.js} +2 -2
  132. package/dist/{help-EP4CDPLO.js → help-HXNOACHI.js} +1 -1
  133. package/dist/{history-E5OSXO74.js → history-XDJUI4LC.js} +39 -16
  134. package/dist/hyperframe.manifest.json +1 -1
  135. package/dist/hyperframe.runtime.iife.js +59 -59
  136. package/dist/hyperframes-player.global.js +3 -3
  137. package/dist/hyperframes-slideshow.global.js +1 -1
  138. package/dist/{info-2HHGSW5H.js → info-KYRI3EZV.js} +56 -22
  139. package/dist/{init-ENEG6RZT.js → init-IL7EWMT5.js} +38 -45
  140. package/dist/{inspect-PVQK4E2A.js → inspect-TBNH23UC.js} +36 -35
  141. package/dist/{installer-YGGLEOSF.js → installer-O2YMFSI4.js} +8 -8
  142. package/dist/{keyframes-UWSYS2SL.js → keyframes-4GF62KAJ.js} +13 -14
  143. package/dist/{lambda-L3LPXC2M.js → lambda-JFL6M4XZ.js} +11 -11
  144. package/dist/{layout-JVL4QREC.js → layout-7MAEFR65.js} +36 -35
  145. package/dist/{lint-JXQ72DDB.js → lint-4AYHKYAM.js} +23 -16
  146. package/dist/{lintProject-F7IC7WY4.js → lintProject-52SLJPRC.js} +5 -4
  147. package/dist/{list-UFMLM3VV.js → list-3DP3D3MW.js} +7 -7
  148. package/dist/{login-CKGMWQJN.js → login-T54WQYRQ.js} +7 -7
  149. package/dist/{logout-DDC4QLVK.js → logout-JYFWWUGK.js} +3 -3
  150. package/dist/{manager-UHWEKPXC.js → manager-MZIJY73J.js} +3 -3
  151. package/dist/{manager-U6OP3EXB.js → manager-QROK2IH3.js} +14 -13
  152. package/dist/{media-treatment-MFMEWCDY.js → media-treatment-4CXF7MSG.js} +20 -19
  153. package/dist/{models-QA3TJ75Y.js → models-IS3I6JKU.js} +18 -17
  154. package/dist/{motionShot-NV2OPJHD.js → motionShot-DVYJZOTQ.js} +21 -20
  155. package/dist/{normalize-3AYFSN2F.js → normalize-FASIPBUM.js} +1 -1
  156. package/dist/{normalize-audio-JWJRUKK2.js → normalize-audio-4527JIK4.js} +12 -8
  157. package/dist/{open-PTJNDRER.js → open-5JE46SAX.js} +18 -18
  158. package/dist/{parakeetRunner-B5FCWWOO.js → parakeetRunner-7JIJGJJ7.js} +20 -19
  159. package/dist/{pipeline-N26NA6ZG.js → pipeline-YEN3WFD2.js} +15 -14
  160. package/dist/{play-45D6X6TV.js → play-WFX67I7M.js} +27 -26
  161. package/dist/{policies-MBWGLMWB.js → policies-GHVXA5PE.js} +1 -1
  162. package/dist/{preflight-MFOHPUOI.js → preflight-D377HVUZ.js} +15 -14
  163. package/dist/{present-IFBUDI4D.js → present-XTSEKAC7.js} +24 -23
  164. package/dist/{preview-MQRLXQOV.js → preview-5XH7EK6O.js} +27 -26
  165. package/dist/{producer-2QG7HLAW.js → producer-TFFYF4ZM.js} +1 -1
  166. package/dist/{projectConfig-I4FTZXHB.js → projectConfig-6YUJHMCL.js} +10 -10
  167. package/dist/{publication-3GOFXCGU.js → publication-JK33Y55E.js} +5 -5
  168. package/dist/{publish-3B2TZCFH.js → publish-JHDGXWXU.js} +18 -17
  169. package/dist/{refresh-RXTOPRBB.js → refresh-USSFPJAU.js} +3 -3
  170. package/dist/{remove-background-RK4BJDBF.js → remove-background-P44MYAPJ.js} +16 -15
  171. package/dist/{render-BV6FWFX3.js → render-HJ34EGMN.js} +8 -8
  172. package/dist/{render-PW3XGS7B.js → render-RBINWWP5.js} +42 -41
  173. package/dist/{render-SJ4HFPFU.js → render-RJ3I4E3A.js} +26 -25
  174. package/dist/{render-batch-GKX54O6N.js → render-batch-3D6XQYUC.js} +9 -9
  175. package/dist/renderSetupWorker.js +9 -8
  176. package/dist/{resolver-RQJ7CNXD.js → resolver-HCLTFZUW.js} +7 -7
  177. package/dist/{screenshotCapture-UBY6TT75.js → screenshotCapture-I5EDCITF.js} +6 -3
  178. package/dist/{sherpa-XZPG7QFF.js → sherpa-IPOUJM6Q.js} +19 -18
  179. package/dist/skills/hyperframes/references/skill-lifecycle.md +8 -4
  180. package/dist/skills/hyperframes-cli/references/init-and-scaffold.md +1 -1
  181. package/dist/{skills-EYLB2V6F.js → skills-P67QEERC.js} +13 -75
  182. package/dist/{skillsUpdateCheck-TE6K5ROM.js → skillsUpdateCheck-IFMLRVIF.js} +5 -5
  183. package/dist/{slideshow-YTWATJRT.js → slideshow-SJGK4RQS.js} +1 -1
  184. package/dist/{snapshot-FE4T3SCN.js → snapshot-4YM4NNWJ.js} +48 -45
  185. package/dist/{src-SEJ7LNNB.js → src-DCD3YMXX.js} +13 -12
  186. package/dist/{src-ZOXSEJCD.js → src-SSV66L3F.js} +14 -9
  187. package/dist/{staticProjectServer-LSVIRDRO.js → staticProjectServer-C7PPGLEQ.js} +22 -21
  188. package/dist/{status-CM7IQTU2.js → status-H5WLKQDS.js} +3 -3
  189. package/dist/studio/assets/{hyperframes-player-Bv9hQ3v7.js → hyperframes-player-ChN3cOr0.js} +3 -3
  190. package/dist/studio/assets/{index-Df14bh-L.js → index-BYbFcRR0.js} +1 -1
  191. package/dist/studio/assets/{index-D_QqfWhx.js → index-CHu83hHM.js} +122 -122
  192. package/dist/studio/assets/{index-CBO8uz7-.css → index-CYbvOVp-.css} +1 -1
  193. package/dist/studio/index.html +2 -2
  194. package/dist/{studio-api-SL2Z76NU.js → studio-api-6YZ7PIQR.js} +17 -14
  195. package/dist/{studioServer-BADWVIHU.js → studioServer-EWHSE4GC.js} +60 -59
  196. package/dist/{telemetry-QG5AANZ4.js → telemetry-4K6CPMNT.js} +2 -2
  197. package/dist/{telemetry-RN6VYEID.js → telemetry-GGLBHZRZ.js} +5 -5
  198. package/dist/{timeline-JBTCIPLU.js → timeline-NKHQJXJ2.js} +65 -43
  199. package/dist/{tokens-A7V7UHNK.js → tokens-FWNNDJ6R.js} +2 -2
  200. package/dist/{transcribe-NTUCJGFI.js → transcribe-TRPKXZ7L.js} +26 -25
  201. package/dist/{transcribe-E4BOSNM4.js → transcribe-VD2TMMC2.js} +17 -16
  202. package/dist/{tts-A2WILYGN.js → tts-5I2AJNLM.js} +1 -1
  203. package/dist/{updateCheck-M7UAYLUR.js → updateCheck-CUPS6LU3.js} +4 -4
  204. package/dist/{upgrade-A2COSIMB.js → upgrade-23XO6MEX.js} +4 -4
  205. package/dist/{urlDownloader-MBSQYART.js → urlDownloader-YOAOONCK.js} +10 -9
  206. package/dist/{validate-NODZYBHY.js → validate-BWIW24G5.js} +30 -29
  207. package/dist/{video-LBCUUYK7.js → video-XRXJS4GC.js} +12 -11
  208. package/dist/warmCheck.js +43 -42
  209. package/package.json +2 -1
  210. package/dist/chunk-I5JRXMCV.js +0 -6077
  211. package/dist/chunk-LM265QNK.js +0 -3896
@@ -19,6 +19,10 @@ import {
19
19
  resolveLocalAssetCandidates,
20
20
  resolveProjectRelativeSrc
21
21
  } from "./chunk-6BNTGNGD.js";
22
+ import {
23
+ TIMING_TOLERANCE_SECONDS,
24
+ resolveCompositionDuration
25
+ } from "./chunk-CZGHFATT.js";
22
26
  import {
23
27
  COMPOSITION_VARIABLE_TYPES,
24
28
  FONT_ALIAS_KEYS,
@@ -26,9 +30,10 @@ import {
26
30
  HTML_BODY_CSS_WIDTH_FIRST_RE,
27
31
  VIEWPORT_META_SIZE_RE,
28
32
  extractMediaSrcMutations,
33
+ isCompositionVariable,
29
34
  isSafeMediaUrl,
30
35
  resolveAliasDisplayName
31
- } from "./chunk-RUOG4VB7.js";
36
+ } from "./chunk-PKZ7RK5N.js";
32
37
  import {
33
38
  COLOR_GRADING_SOURCE_TAGS,
34
39
  COMPOSITION_ATTRIBUTES,
@@ -56,14 +61,12 @@ import {
56
61
  isSceneLikeCompositionId,
57
62
  parseSlideshowManifest,
58
63
  resolveSlideshow
59
- } from "./chunk-IXLUTE6N.js";
64
+ } from "./chunk-3422KMTD.js";
60
65
  import {
61
66
  base,
62
- parse,
63
- parseExpressionAt,
64
67
  recursive,
65
68
  simple
66
- } from "./chunk-I5JRXMCV.js";
69
+ } from "./chunk-RXATE6FZ.js";
67
70
  import {
68
71
  __commonJS,
69
72
  __require,
@@ -3708,30 +3711,10 @@ var require_dist = __commonJS({
3708
3711
  });
3709
3712
 
3710
3713
  // ../lint/dist/index.js
3714
+ import { parse } from "acorn";
3711
3715
  var import_postcss_selector_parser = __toESM(require_dist(), 1);
3712
3716
  import postcss from "postcss";
3713
-
3714
- // ../parsers/dist/compositionDuration.js
3715
- var TIMING_TOLERANCE_SECONDS = 0.05;
3716
- var isPositiveFinite = (value) => value !== null && Number.isFinite(value) && value > 0;
3717
- function resolveCompositionDuration(input) {
3718
- const pendingClips = input.clipEndsSeconds.filter((end) => end === null).length;
3719
- if (isPositiveFinite(input.authoredDurationSeconds)) {
3720
- return { seconds: input.authoredDurationSeconds, source: "authored", pendingClips };
3721
- }
3722
- const known = input.clipEndsSeconds.filter(isPositiveFinite);
3723
- if (known.length > 0) {
3724
- return { seconds: Math.max(...known), source: "derived", pendingClips };
3725
- }
3726
- return {
3727
- seconds: null,
3728
- source: "unresolved",
3729
- pendingClips,
3730
- reason: pendingClips > 0 ? "every clip's length is still pending" : "no authored duration and no clip with a length"
3731
- };
3732
- }
3733
-
3734
- // ../lint/dist/index.js
3717
+ import { parse as parse2 } from "acorn";
3735
3718
  import postcss2 from "postcss";
3736
3719
  import postcss3 from "postcss";
3737
3720
 
@@ -3770,6 +3753,7 @@ function trackKindOf(node) {
3770
3753
  }
3771
3754
 
3772
3755
  // ../lint/dist/index.js
3756
+ import { parse as parse3, parseExpressionAt } from "acorn";
3773
3757
  import { createHash } from "crypto";
3774
3758
  import { existsSync as existsSync2, readFileSync, readdirSync } from "fs";
3775
3759
  import { dirname as dirname2, extname, join as join3, relative as relative2, resolve } from "path";
@@ -3895,6 +3879,7 @@ function resolveReferencedDuration(doc, el, startCache, visiting) {
3895
3879
  }
3896
3880
 
3897
3881
  // ../lint/dist/index.js
3882
+ import postcss4 from "postcss";
3898
3883
  import { execFile } from "child_process";
3899
3884
  import { existsSync } from "fs";
3900
3885
  import { join } from "path";
@@ -6457,7 +6442,7 @@ function callsFor(script) {
6457
6442
  if (cached) return cached;
6458
6443
  const calls = [];
6459
6444
  try {
6460
- const ast = parse(script.content, {
6445
+ const ast = parse2(script.content, {
6461
6446
  ecmaVersion: "latest",
6462
6447
  sourceType: "script",
6463
6448
  allowReturnOutsideFunction: true
@@ -6783,6 +6768,16 @@ function variablesDeclarationFindings(tag, tags) {
6783
6768
  });
6784
6769
  continue;
6785
6770
  }
6771
+ if (!isCompositionVariable(e)) {
6772
+ findings.push({
6773
+ code: "invalid_composition_variables_declaration",
6774
+ severity: "error",
6775
+ message: `data-composition-variables entry [${i}] has a default that does not match its type, or an enum without an options array.`,
6776
+ fixHint: "Use number defaults for number variables, boolean defaults for boolean variables, and string defaults for other types. Enum variables also require an options array.",
6777
+ snippet: truncateSnippet(tag.raw)
6778
+ });
6779
+ continue;
6780
+ }
6786
6781
  const id = String(e.id);
6787
6782
  if ((e.type === "image" || varSrcIds.has(id)) && typeof e.default === "string" && e.default.length > 0 && !isSafeMediaUrl(e.default)) {
6788
6783
  findings.push({
@@ -7681,11 +7676,11 @@ function deriveDurationFromClips(tags, rootTag) {
7681
7676
  return resolveCompositionDuration({ authoredDurationSeconds: null, clipEndsSeconds: clipEnds });
7682
7677
  }
7683
7678
  async function loadParseGsapScript() {
7684
- const mod = await import("./gsapParserAcorn-SKODXC2N.js");
7679
+ const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7685
7680
  return mod.parseGsapScriptAcorn;
7686
7681
  }
7687
7682
  async function loadGsapScriptMotionPathFirstUseIndex() {
7688
- const mod = await import("./gsapParserAcorn-SKODXC2N.js");
7683
+ const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7689
7684
  return mod.gsapScriptMotionPathFirstUseIndex;
7690
7685
  }
7691
7686
  var SCENE_BOUNDARY_EPSILON_SECONDS = 0.05;
@@ -8819,7 +8814,7 @@ ${right.raw}`)
8819
8814
  return findings;
8820
8815
  },
8821
8816
  // gsap_timeline_registered_before_async_build — registering window.__timelines[id]
8822
- // BEFORE the timeline is built inside document.fonts.ready (or any async callback)
8817
+ // BEFORE the timeline is built inside a font-ready callback
8823
8818
  // leaves an EMPTY timeline registered. The runtime's sub-composition readiness gate
8824
8819
  // treats "key present" as "ready" and nests the child ONCE, while still empty — so the
8825
8820
  // animation never renders when this composition is mounted as a sub-composition.
@@ -8828,9 +8823,11 @@ ${right.raw}`)
8828
8823
  const findings = [];
8829
8824
  for (const script of scripts) {
8830
8825
  const content = stripJsComments(script.content);
8831
- const regIdx = content.search(/window\s*\.\s*__timelines\s*\[/);
8826
+ const regIdx = content.search(
8827
+ /window\s*\.\s*__timelines\s*(?:\[[^\]]+\]|\.\s*[A-Za-z_$][\w$]*)\s*=\s*(?!=)/
8828
+ );
8832
8829
  if (regIdx < 0) continue;
8833
- const fontsReadyIdx = content.search(/document\s*\.\s*fonts\s*\.\s*ready/);
8830
+ const fontsReadyIdx = content.search(/document\s*\.\s*fonts\s*\.\s*(?:ready\b|load\s*\()/);
8834
8831
  if (fontsReadyIdx < 0) continue;
8835
8832
  if (regIdx >= fontsReadyIdx) continue;
8836
8833
  const tail = content.slice(fontsReadyIdx);
@@ -8838,8 +8835,8 @@ ${right.raw}`)
8838
8835
  findings.push({
8839
8836
  code: "gsap_timeline_registered_before_async_build",
8840
8837
  severity: "error",
8841
- message: 'window.__timelines is assigned BEFORE the timeline is built inside document.fonts.ready. An empty timeline registered early gets nested empty when this composition is used as a sub-composition (the readiness gate treats "key present" as "ready" and never re-nests), so the animation renders blank.',
8842
- fixHint: "Move the `window.__timelines[id] = tl;` assignment to the END of the document.fonts.ready callback, after the tweens are added. Optionally call window.__hfForceTimelineRebind() right after, to re-nest the populated timeline."
8838
+ message: 'window.__timelines is assigned BEFORE the timeline is built inside document.fonts.ready or document.fonts.load(). An empty timeline registered early gets nested empty when this composition is used as a sub-composition (the readiness gate treats "key present" as "ready" and never re-nests), so the animation renders blank.',
8839
+ fixHint: "Move the `window.__timelines[id] = tl;` assignment to the END of the font-ready callback, after the tweens are added. Optionally call window.__hfForceTimelineRebind() right after, to re-nest the populated timeline."
8843
8840
  });
8844
8841
  }
8845
8842
  return findings;
@@ -9868,22 +9865,29 @@ var GENERIC_FAMILIES = /* @__PURE__ */ new Set([
9868
9865
  "unset",
9869
9866
  "revert"
9870
9867
  ]);
9871
- function stripCssComments2(css) {
9872
- return css.replace(/\/\*[\s\S]*?\*\//g, " ");
9868
+ function parseFontCss(css) {
9869
+ try {
9870
+ return postcss3.parse(css);
9871
+ } catch {
9872
+ return null;
9873
+ }
9874
+ }
9875
+ function isFontFaceDeclaration(decl) {
9876
+ let parent = decl.parent;
9877
+ while (parent) {
9878
+ if (parent.type === "atrule" && parent.name.toLowerCase() === "font-face") return true;
9879
+ parent = parent.parent;
9880
+ }
9881
+ return false;
9873
9882
  }
9874
9883
  function extractFontFaceFamilies(styles) {
9875
9884
  const families = /* @__PURE__ */ new Set();
9876
- const fontFaceRe = /@font-face\s*\{[^}]*\}/gi;
9877
- const familyRe = /font-family\s*:\s*(['"]?)([^;'"]+)\1/i;
9878
9885
  for (const style of styles) {
9879
- const content = stripCssComments2(style.content);
9880
- let match;
9881
- while ((match = fontFaceRe.exec(content)) !== null) {
9882
- const familyMatch = match[0].match(familyRe);
9883
- if (familyMatch?.[2]) {
9884
- families.add(familyMatch[2].trim().toLowerCase());
9885
- }
9886
- }
9886
+ parseFontCss(style.content)?.walkDecls(/^font-family$/i, (decl) => {
9887
+ if (!isFontFaceDeclaration(decl)) return;
9888
+ const name = normalizeUsedFontName(decl.value);
9889
+ if (name) families.add(name);
9890
+ });
9887
9891
  }
9888
9892
  return families;
9889
9893
  }
@@ -9892,22 +9896,43 @@ function normalizeUsedFontName(part) {
9892
9896
  if (!name || name.includes("(") || name.includes(")")) return null;
9893
9897
  return name;
9894
9898
  }
9899
+ function collectFontCustomProperties(styles) {
9900
+ const properties = /* @__PURE__ */ new Map();
9901
+ for (const style of styles) {
9902
+ parseFontCss(style.content)?.walkDecls(/^--/, (decl) => {
9903
+ if (!isFontFaceDeclaration(decl)) properties.set(decl.prop, decl.value);
9904
+ });
9905
+ }
9906
+ return properties;
9907
+ }
9908
+ function resolveUsedFontNames(value, properties, resolving = /* @__PURE__ */ new Set()) {
9909
+ return postcss3.list.comma(value).flatMap((part) => {
9910
+ const variable = /^var\(\s*(--[^\s,()]+)\s*(?:,[\s\S]*)?\)$/i.exec(part.trim());
9911
+ if (!variable) {
9912
+ const name = normalizeUsedFontName(part);
9913
+ return name ? [name] : [];
9914
+ }
9915
+ const property = variable[1];
9916
+ if (!property || resolving.has(property) || resolving.size >= 8) return [];
9917
+ const referenced = properties.get(property);
9918
+ if (referenced === void 0) return [];
9919
+ return resolveUsedFontNames(referenced, properties, new Set(resolving).add(property));
9920
+ });
9921
+ }
9895
9922
  function extractUsedFontFamilies(styles) {
9896
9923
  const used = [];
9897
9924
  const seen = /* @__PURE__ */ new Set();
9898
- const propRe = /font-family\s*:\s*([^;}{]+)/gi;
9925
+ const properties = collectFontCustomProperties(styles);
9899
9926
  for (const style of styles) {
9900
- const withoutFontFace = stripCssComments2(style.content).replace(/@font-face\s*\{[^}]*\}/gi, "");
9901
- let match;
9902
- while ((match = propRe.exec(withoutFontFace)) !== null) {
9903
- for (const part of match[1].split(",")) {
9904
- const name = normalizeUsedFontName(part);
9905
- if (name && !GENERIC_FAMILIES.has(name) && !seen.has(name)) {
9927
+ parseFontCss(style.content)?.walkDecls(/^font-family$/i, (decl) => {
9928
+ if (isFontFaceDeclaration(decl)) return;
9929
+ for (const name of resolveUsedFontNames(decl.value, properties)) {
9930
+ if (!GENERIC_FAMILIES.has(name) && !seen.has(name)) {
9906
9931
  seen.add(name);
9907
9932
  used.push(name);
9908
9933
  }
9909
9934
  }
9910
- }
9935
+ });
9911
9936
  }
9912
9937
  return used;
9913
9938
  }
@@ -10010,15 +10035,12 @@ var fontRules = [
10010
10035
  ];
10011
10036
  function uniqueFontLocation(styles, families, locate) {
10012
10037
  const locations = [];
10038
+ const properties = collectFontCustomProperties(styles);
10013
10039
  for (const style of styles) {
10014
10040
  try {
10015
10041
  postcss3.parse(style.content).walkDecls(/^font-family$/i, (decl) => {
10016
- let parent = decl.parent;
10017
- while (parent) {
10018
- if (parent.type === "atrule" && parent.name.toLowerCase() === "font-face") return;
10019
- parent = parent.parent;
10020
- }
10021
- if (!decl.value.split(",").some((part) => families.includes(normalizeUsedFontName(part) ?? "")))
10042
+ if (isFontFaceDeclaration(decl)) return;
10043
+ if (!resolveUsedFontNames(decl.value, properties).some((name) => families.includes(name)))
10022
10044
  return;
10023
10045
  locations.push(locate(style, decl.source?.start?.offset));
10024
10046
  });
@@ -10026,7 +10048,7 @@ function uniqueFontLocation(styles, families, locate) {
10026
10048
  return {};
10027
10049
  }
10028
10050
  }
10029
- return locations.length === 1 ? locations[0] : {};
10051
+ return locations.length === 1 ? locations[0] ?? {} : {};
10030
10052
  }
10031
10053
  function parseTiming(raw) {
10032
10054
  const startStr = readAttr(raw, "data-start");
@@ -10295,7 +10317,7 @@ function withoutComments(source) {
10295
10317
  function staticShaders(source) {
10296
10318
  const shaders = [];
10297
10319
  try {
10298
- const ast = parse(source, {
10320
+ const ast = parse3(source, {
10299
10321
  ecmaVersion: "latest",
10300
10322
  sourceType: "module",
10301
10323
  allowReturnOutsideFunction: true
@@ -10826,6 +10848,7 @@ function contentDigest(html) {
10826
10848
  return createHash("sha256").update(html).digest("hex").slice(0, 16);
10827
10849
  }
10828
10850
  var AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([".mp3", ".wav", ".aac", ".ogg", ".m4a", ".flac", ".opus"]);
10851
+ var CSS_URL_RE = /\burl\(\s*(?:"([^"]+)"|'([^']+)'|([^"')\s]+))\s*\)/gi;
10829
10852
  var MASK_IMAGE_URL_RE = /\b(?:-webkit-)?mask-image\s*:\s*[^;{}]*url\(\s*(?:"([^"]+)"|'([^']+)'|([^"')\s]+))\s*\)/gi;
10830
10853
  function isLocalStylesheetHref(href) {
10831
10854
  return !!href && !/^(https?:|data:|blob:|\/\/)/i.test(href);
@@ -11118,9 +11141,16 @@ function lintTextureMaskAssetNotFound(projectDir, htmlSources) {
11118
11141
  for (const { html, compSrcPath } of htmlSources) {
11119
11142
  const file = sourceFile(projectDir, compSrcPath);
11120
11143
  for (const cssSource of collectCssSources(projectDir, html, compSrcPath)) {
11121
- let match;
11122
- const pattern = new RegExp(MASK_IMAGE_URL_RE.source, MASK_IMAGE_URL_RE.flags);
11123
- while ((match = pattern.exec(cssSource.content)) !== null) {
11144
+ let matches = [];
11145
+ try {
11146
+ postcss4.parse(cssSource.content).walkDecls(/^(?:-webkit-)?mask-image$/i, (declaration) => {
11147
+ matches.push(...declaration.value.matchAll(CSS_URL_RE));
11148
+ });
11149
+ } catch (error) {
11150
+ if (!(error instanceof postcss4.CssSyntaxError)) throw error;
11151
+ matches = [...cssSource.content.matchAll(MASK_IMAGE_URL_RE)];
11152
+ }
11153
+ for (const match of matches) {
11124
11154
  const rawUrl = match[1] ?? match[2] ?? match[3] ?? "";
11125
11155
  if (isUnresolvedAssetPlaceholder(rawUrl)) continue;
11126
11156
  const url = cleanAssetUrl(rawUrl);
@@ -11322,7 +11352,6 @@ export {
11322
11352
  resolveReferencedStart,
11323
11353
  resolveReferencedDuration,
11324
11354
  require_dist,
11325
- resolveCompositionDuration,
11326
11355
  LINT_RULE_COUNT,
11327
11356
  LINT_RULE_GROUP_COUNTS,
11328
11357
  lintHyperframeHtml,
@@ -27,7 +27,7 @@ import {
27
27
  } from "./chunk-GMECXFAN.js";
28
28
  import {
29
29
  ITEM_TYPE_DIRS
30
- } from "./chunk-GM3WIOO6.js";
30
+ } from "./chunk-MGBUWPXX.js";
31
31
  import {
32
32
  realProjectRoot
33
33
  } from "./chunk-OFQWTKPW.js";
@@ -10,7 +10,11 @@ var SLIDESHOW_MANIFEST_VERSION = 1;
10
10
  var SLIDESHOW_ISLAND_TYPE = "application/hyperframes-slideshow+json";
11
11
  function slideshowIslandRegex(flags = "i") {
12
12
  const escaped = SLIDESHOW_ISLAND_TYPE.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
13
- return new RegExp(`<script[^>]*type=["']${escaped}["'][^>]*>([\\s\\S]*?)<\\/script>`, flags);
13
+ const htmlWhitespace = "[\\t\\n\\f\\r ]*";
14
+ return new RegExp(
15
+ `<script[^>]*type${htmlWhitespace}=${htmlWhitespace}["']${escaped}["'][^>]*>([\\s\\S]*?)<\\/script>`,
16
+ flags
17
+ );
14
18
  }
15
19
  function parseSlideshowManifest(html) {
16
20
  const re = slideshowIslandRegex("i");
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  loadOptionalPackage,
9
9
  loadSharp
10
- } from "./chunk-QH3T4WI2.js";
10
+ } from "./chunk-EXAX37XR.js";
11
11
  import {
12
12
  downloadFile
13
13
  } from "./chunk-WQ6ZXHFQ.js";
@@ -15,13 +15,16 @@ import {
15
15
  findFFmpeg,
16
16
  findFFprobe,
17
17
  getFFmpegInstallHint
18
- } from "./chunk-GLG5JWLI.js";
18
+ } from "./chunk-VRAXIQ6I.js";
19
19
  import {
20
20
  DEFAULT_VP9_CPU_USED,
21
21
  SDR_RGB_TO_BT709_FILTER,
22
22
  SDR_RGB_TO_TAGGED_BT709_FILTER,
23
23
  renderProvenanceArgs
24
- } from "./chunk-NMDUSCCE.js";
24
+ } from "./chunk-QX4TB4NH.js";
25
+ import {
26
+ runCancellableProcess
27
+ } from "./chunk-RWGASWT7.js";
25
28
 
26
29
  // src/background-removal/pipeline.ts
27
30
  import { spawn } from "child_process";
@@ -135,11 +138,29 @@ async function createSession(options = {}) {
135
138
  const maskBuf = Buffer.allocUnsafe(INPUT_PLANE);
136
139
  let rgbaBuf = null;
137
140
  let rgbaBgBuf = null;
141
+ let retried = false;
142
+ const run = async (tensor) => {
143
+ try {
144
+ return await session.run({ [inputName]: tensor });
145
+ } catch (err) {
146
+ if (providerUsed === "CPU" || retried) throw err;
147
+ retried = true;
148
+ options.onProgress?.(
149
+ `${providerUsed} failed while running a frame (${err.message}); continuing on CPU.`
150
+ );
151
+ await session.release().catch(() => void 0);
152
+ session = await tryCreate(["cpu"]);
153
+ providerUsed = "CPU";
154
+ return await session.run({ [inputName]: tensor });
155
+ }
156
+ };
138
157
  return {
139
- provider: providerUsed,
158
+ get provider() {
159
+ return providerUsed;
160
+ },
140
161
  async process(rgb, width, height, withBackground = false) {
141
162
  const tensor = await preprocess(sharp, ort, rgb, width, height, inputData);
142
- const outputs = await session.run({ [inputName]: tensor });
163
+ const outputs = await run(tensor);
143
164
  const output = outputs[outputName];
144
165
  if (!output) throw new Error(`Model did not return output '${outputName}'`);
145
166
  const expectedBytes = width * height * 4;
@@ -260,16 +281,56 @@ function inferInputKind(inputPath) {
260
281
  `Unsupported input: ${ext}. Use a video (mp4/mov/webm/mkv/avi) or image (jpg/png/webp).`
261
282
  );
262
283
  }
284
+ async function decoderTransposesDimensions(inputPath) {
285
+ const ffprobePath = findFFprobe();
286
+ if (!ffprobePath) throw new Error(`ffprobe is required. Install: ${getFFmpegInstallHint()}`);
287
+ const { stdout } = await runCancellableProcess(
288
+ ffprobePath,
289
+ [
290
+ "-v",
291
+ "error",
292
+ "-select_streams",
293
+ "v:0",
294
+ "-show_streams",
295
+ "-print_format",
296
+ "json",
297
+ "--",
298
+ inputPath
299
+ ],
300
+ { timeoutMs: 3e4, maxBufferBytes: 256 * 1024 }
301
+ );
302
+ const probe = JSON.parse(stdout);
303
+ if (typeof probe !== "object" || probe === null || !("streams" in probe) || !Array.isArray(probe.streams))
304
+ return false;
305
+ const stream = probe.streams[0];
306
+ if (typeof stream !== "object" || stream === null) return false;
307
+ const sideData = "side_data_list" in stream && Array.isArray(stream.side_data_list) ? stream.side_data_list : [];
308
+ const matrix = sideData.find(
309
+ (entry) => typeof entry === "object" && entry !== null && "side_data_type" in entry && entry.side_data_type === "Display Matrix"
310
+ );
311
+ let rotation = typeof matrix === "object" && matrix !== null && "rotation" in matrix ? matrix.rotation : void 0;
312
+ if (rotation === void 0 && "tags" in stream && typeof stream.tags === "object" && stream.tags !== null && "rotate" in stream.tags)
313
+ rotation = Number(stream.tags.rotate);
314
+ if (typeof rotation !== "number" || !Number.isFinite(rotation)) return false;
315
+ const angle = (rotation % 360 + 360) % 360;
316
+ return Math.abs(angle - 90) < 1 || Math.abs(angle - 270) < 1;
317
+ }
263
318
  async function probeMedia(inputPath) {
264
319
  const isImage = inferInputKind(inputPath) === "image";
265
- const engine = await import("./src-ZOXSEJCD.js");
320
+ const engine = await import("./src-SSV66L3F.js");
266
321
  const meta = await engine.extractMediaMetadata(inputPath);
267
322
  if (isImage) {
268
323
  return { width: meta.width, height: meta.height, fps: 0, frameCount: 1 };
269
324
  }
270
325
  const fps = meta.fps || 30;
271
326
  const frameCount = meta.durationSeconds ? Math.round(meta.durationSeconds * fps) : 0;
272
- return { width: meta.width, height: meta.height, fps, frameCount };
327
+ const transposed = await decoderTransposesDimensions(inputPath);
328
+ return {
329
+ width: transposed ? meta.height : meta.width,
330
+ height: transposed ? meta.width : meta.height,
331
+ fps,
332
+ frameCount
333
+ };
273
334
  }
274
335
  function buildEncoderArgs(format, width, height, fps, outputPath, quality = DEFAULT_QUALITY) {
275
336
  const base = [
@@ -6,8 +6,8 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/version.ts
9
- var VERSION = true ? "0.8.191" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.191" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.192" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.192" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -9,14 +9,14 @@ import {
9
9
  } from "./chunk-K2FLNJVB.js";
10
10
  import {
11
11
  trackCommandFailure
12
- } from "./chunk-TFGO5YMI.js";
12
+ } from "./chunk-BV6YE455.js";
13
13
  import {
14
14
  failCommand
15
15
  } from "./chunk-JVBRJMOP.js";
16
16
 
17
17
  // src/utils/project.ts
18
18
  import { existsSync, statSync } from "fs";
19
- import { resolve, basename } from "path";
19
+ import { basename, dirname, join, relative, resolve, sep } from "path";
20
20
  var InvalidProjectError = class extends Error {
21
21
  title;
22
22
  hint;
@@ -65,8 +65,28 @@ function resolveProject(dirArg, options = {}) {
65
65
  throw err;
66
66
  }
67
67
  }
68
+ function projectHolding(file) {
69
+ for (let dir = dirname(file); ; dir = dirname(dir)) {
70
+ if (existsSync(join(dir, "index.html"))) return dir;
71
+ if (dirname(dir) === dir) return dirname(file);
72
+ }
73
+ }
74
+ function resolveLintTarget(arg) {
75
+ const file = arg === void 0 ? void 0 : resolve(arg);
76
+ if (file === void 0 || !statSync(file, { throwIfNoEntry: false })?.isFile()) {
77
+ return { project: resolveProject(arg) };
78
+ }
79
+ const dir = projectHolding(file);
80
+ const project = resolveProject(dir, { requireIndex: false });
81
+ return file === project.indexPath ? { project } : { project, entryFile: file };
82
+ }
83
+ function isUnderCompositions(projectDir, file) {
84
+ return relative(projectDir, file).split(sep)[0] === "compositions";
85
+ }
68
86
 
69
87
  export {
70
88
  resolveProjectOrThrow,
71
- resolveProject
89
+ resolveProject,
90
+ resolveLintTarget,
91
+ isUnderCompositions
72
92
  };