@sovovs/bycli 1.8.0 → 2.1.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.
Files changed (539) hide show
  1. package/cli-manifest.json +0 -61
  2. package/clis/twitter/search.js +3 -3
  3. package/dist/src/adapter-shadow.js +2 -2
  4. package/dist/src/browser/analyze.d.ts +10 -99
  5. package/dist/src/browser/analyze.js +10 -226
  6. package/dist/src/browser/cdp.js +67 -7
  7. package/dist/src/browser/daemon-client.d.ts +2 -0
  8. package/dist/src/browser/daemon-client.js +1 -1
  9. package/dist/src/browser/extension-capabilities.d.ts +13 -0
  10. package/dist/src/browser/extension-capabilities.js +22 -0
  11. package/dist/src/browser/extension-capabilities.test.d.ts +1 -0
  12. package/dist/src/browser/extension-version-metadata.test.d.ts +1 -0
  13. package/dist/src/browser/navigation-guard.d.ts +78 -0
  14. package/dist/src/browser/navigation-guard.js +142 -0
  15. package/dist/src/browser/navigation-guard.test.d.ts +1 -0
  16. package/dist/src/browser/page.d.ts +1 -0
  17. package/dist/src/browser/page.js +20 -1
  18. package/dist/src/browser/url-policy.d.ts +89 -0
  19. package/dist/src/browser/url-policy.js +311 -0
  20. package/dist/src/browser/url-policy.test.d.ts +1 -0
  21. package/dist/src/browser/verify-fixture.js +2 -2
  22. package/dist/src/build-manifest.js +4 -2
  23. package/dist/src/capabilityRouting.d.ts +3 -2
  24. package/dist/src/capabilityRouting.js +10 -2
  25. package/dist/src/cli.js +11 -14
  26. package/dist/src/commanderAdapter.js +5 -5
  27. package/dist/src/config-paths.d.ts +19 -0
  28. package/dist/src/config-paths.js +31 -0
  29. package/dist/src/daemon.js +256 -0
  30. package/dist/src/discovery.d.ts +10 -3
  31. package/dist/src/discovery.js +20 -10
  32. package/dist/src/discovery.test.d.ts +1 -0
  33. package/dist/src/execution.d.ts +5 -0
  34. package/dist/src/execution.js +272 -48
  35. package/dist/src/help.js +8 -8
  36. package/dist/src/main.js +18 -2
  37. package/dist/src/manifest-schema.d.ts +9 -0
  38. package/dist/src/manifest-schema.js +162 -0
  39. package/dist/src/manifest-schema.test.d.ts +1 -0
  40. package/dist/src/manifest-types.d.ts +1 -1
  41. package/dist/src/observation/redaction.js +10 -4
  42. package/dist/src/plugin.js +11 -8
  43. package/dist/src/recorder/highlevel/analyze.d.ts +29 -0
  44. package/dist/src/recorder/highlevel/analyze.js +91 -0
  45. package/dist/src/recorder/highlevel/init.d.ts +125 -0
  46. package/dist/src/recorder/highlevel/init.js +279 -0
  47. package/dist/src/recorder/highlevel/init.test.d.ts +1 -0
  48. package/dist/src/recorder/highlevel/verify.d.ts +73 -0
  49. package/dist/src/recorder/highlevel/verify.js +74 -0
  50. package/dist/src/recorder/http/analyze-runner.d.ts +28 -0
  51. package/dist/src/recorder/http/analyze-runner.js +78 -0
  52. package/dist/src/recorder/http/analyze-runner.test.d.ts +1 -0
  53. package/dist/src/recorder/http/handlers.d.ts +51 -0
  54. package/dist/src/recorder/http/handlers.js +219 -0
  55. package/dist/src/recorder/http/wrapper-config.d.ts +20 -0
  56. package/dist/src/recorder/http/wrapper-config.js +82 -0
  57. package/dist/src/recorder/http/wrapper-envelope.d.ts +31 -0
  58. package/dist/src/recorder/http/wrapper-envelope.js +51 -0
  59. package/dist/src/recorder/http/wrapper-gates.d.ts +16 -0
  60. package/dist/src/recorder/http/wrapper-gates.js +28 -0
  61. package/dist/src/recorder/http/wrapper-metrics.d.ts +1 -0
  62. package/dist/src/recorder/http/wrapper-metrics.js +5 -0
  63. package/dist/src/recorder/http/wrapper-registry.d.ts +50 -0
  64. package/dist/src/recorder/http/wrapper-registry.js +98 -0
  65. package/dist/src/recorder/http/wrapper-server.d.ts +59 -0
  66. package/dist/src/recorder/http/wrapper-server.js +240 -0
  67. package/dist/src/recorder/http/wrapper.test.d.ts +1 -0
  68. package/dist/src/recorder/observability/logger.d.ts +5 -0
  69. package/dist/src/recorder/observability/logger.js +13 -0
  70. package/dist/src/recorder/runner/config.d.ts +34 -0
  71. package/dist/src/recorder/runner/config.js +84 -0
  72. package/dist/src/recorder/runner/config.test.d.ts +1 -0
  73. package/dist/src/recorder/runner/reap.d.ts +79 -0
  74. package/dist/src/recorder/runner/reap.js +230 -0
  75. package/dist/src/recorder/runner/reap.test.d.ts +1 -0
  76. package/dist/src/recorder/runner/runner-port.d.ts +95 -0
  77. package/dist/src/recorder/runner/runner-port.js +518 -0
  78. package/dist/src/recorder/runner/runner-port.test.d.ts +1 -0
  79. package/dist/src/recorder/runner/session-keys.d.ts +28 -0
  80. package/dist/src/recorder/runner/session-keys.js +72 -0
  81. package/dist/src/recorder/runner/session-keys.test.d.ts +1 -0
  82. package/dist/src/recorder/runner/verify-runner-main.d.ts +96 -0
  83. package/dist/src/recorder/runner/verify-runner-main.js +292 -0
  84. package/dist/src/recorder/runner/verify-runner-main.test.d.ts +1 -0
  85. package/dist/src/registry-api.d.ts +1 -1
  86. package/dist/src/registry-api.types.test.d.ts +1 -0
  87. package/dist/src/registry-transaction.d.ts +42 -0
  88. package/dist/src/registry-transaction.js +194 -0
  89. package/dist/src/registry-transaction.test.d.ts +1 -0
  90. package/dist/src/registry.d.ts +58 -16
  91. package/dist/src/registry.js +131 -15
  92. package/dist/src/serialization.d.ts +1 -1
  93. package/dist/src/serialization.js +3 -3
  94. package/dist/src/types.d.ts +2 -0
  95. package/package.json +8 -5
  96. package/scripts/m1-daemon-navigate-drive.mjs +138 -0
  97. package/scripts/m1-extension-spike.mjs +237 -0
  98. package/scripts/m1-live-spike.mjs +156 -0
  99. package/scripts/m6b-connect-back-spike.sh +31 -0
  100. package/clis/12306/utils.test.js +0 -331
  101. package/clis/1688/assets.test.js +0 -39
  102. package/clis/1688/download.test.js +0 -31
  103. package/clis/1688/item.test.js +0 -67
  104. package/clis/1688/search.test.js +0 -75
  105. package/clis/1688/shared.test.js +0 -57
  106. package/clis/1688/store.test.js +0 -62
  107. package/clis/36kr/article.test.js +0 -46
  108. package/clis/36kr/hot.test.js +0 -15
  109. package/clis/36kr/news.test.js +0 -85
  110. package/clis/51job/utils.test.js +0 -69
  111. package/clis/_atlassian/shared.test.js +0 -170
  112. package/clis/aibase/news.test.js +0 -59
  113. package/clis/amazon/bestsellers.test.js +0 -29
  114. package/clis/amazon/discussion.test.js +0 -124
  115. package/clis/amazon/offer.test.js +0 -29
  116. package/clis/amazon/product.test.js +0 -24
  117. package/clis/amazon/rankings.test.js +0 -41
  118. package/clis/amazon/search.test.js +0 -22
  119. package/clis/amazon/shared.test.js +0 -44
  120. package/clis/apple-podcasts/commands.test.js +0 -119
  121. package/clis/apple-podcasts/utils.test.js +0 -57
  122. package/clis/arxiv/arxiv.test.js +0 -112
  123. package/clis/baidu-scholar/search.test.js +0 -23
  124. package/clis/barchart/greeks.test.js +0 -138
  125. package/clis/bilibili/comment.test.js +0 -153
  126. package/clis/bilibili/comments.test.js +0 -142
  127. package/clis/bilibili/dynamic.test.js +0 -68
  128. package/clis/bilibili/hot.test.js +0 -17
  129. package/clis/bilibili/subtitle.test.js +0 -196
  130. package/clis/bilibili/summary.test.js +0 -210
  131. package/clis/bilibili/utils.test.js +0 -61
  132. package/clis/bilibili/video.test.js +0 -132
  133. package/clis/binance/commands.test.js +0 -70
  134. package/clis/bloomberg/utils.test.js +0 -129
  135. package/clis/booking/booking.test.js +0 -356
  136. package/clis/boss/chatlist.test.js +0 -211
  137. package/clis/boss/chatmsg.test.js +0 -230
  138. package/clis/boss/search.test.js +0 -78
  139. package/clis/boss/utils.test.js +0 -34
  140. package/clis/brave/search.test.js +0 -76
  141. package/clis/chaoxing/utils.test.js +0 -45
  142. package/clis/chatgpt/commands.test.js +0 -45
  143. package/clis/chatgpt/envelope.test.js +0 -108
  144. package/clis/chatgpt/image.test.js +0 -188
  145. package/clis/chatgpt/utils.test.js +0 -330
  146. package/clis/chatgpt-app/ax.test.js +0 -35
  147. package/clis/chatwise/composer.test.js +0 -186
  148. package/clis/chess/analyze.test.js +0 -79
  149. package/clis/chess/game.test.js +0 -178
  150. package/clis/chess/games.test.js +0 -164
  151. package/clis/chess/stats.test.js +0 -79
  152. package/clis/chess/utils.test.js +0 -230
  153. package/clis/claude/ask.test.js +0 -338
  154. package/clis/claude/commands.test.js +0 -118
  155. package/clis/claude/utils.test.js +0 -148
  156. package/clis/cnki/search.test.js +0 -18
  157. package/clis/codex/sidebar.test.js +0 -329
  158. package/clis/coingecko/coingecko.test.js +0 -109
  159. package/clis/confluence/commands.test.js +0 -195
  160. package/clis/coupang/coupang.test.js +0 -159
  161. package/clis/coupang/utils.test.js +0 -62
  162. package/clis/ctrip/ctrip.test.js +0 -719
  163. package/clis/dblp/dblp.test.js +0 -397
  164. package/clis/deepseek/ask.test.js +0 -312
  165. package/clis/deepseek/detail.test.js +0 -81
  166. package/clis/deepseek/send.test.js +0 -107
  167. package/clis/deepseek/utils.test.js +0 -370
  168. package/clis/defillama/defillama.test.js +0 -99
  169. package/clis/devto/devto.test.js +0 -236
  170. package/clis/dianping/dianping.test.js +0 -578
  171. package/clis/douban/download.test.js +0 -170
  172. package/clis/douban/movie-hot.test.js +0 -14
  173. package/clis/douban/search.test.js +0 -11
  174. package/clis/douban/subject.test.js +0 -11
  175. package/clis/douban/utils.test.js +0 -438
  176. package/clis/doubao/detail.test.js +0 -42
  177. package/clis/doubao/history.test.js +0 -37
  178. package/clis/doubao/utils.test.js +0 -344
  179. package/clis/douyin/_shared/browser-fetch.test.js +0 -64
  180. package/clis/douyin/_shared/creation-id.test.js +0 -22
  181. package/clis/douyin/_shared/imagex-upload.test.js +0 -87
  182. package/clis/douyin/_shared/sts2.test.js +0 -27
  183. package/clis/douyin/_shared/text-extra.test.js +0 -37
  184. package/clis/douyin/_shared/timing.test.js +0 -28
  185. package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
  186. package/clis/douyin/_shared/tos-upload.test.js +0 -229
  187. package/clis/douyin/_shared/transcode.test.js +0 -91
  188. package/clis/douyin/_shared/vod-upload.test.js +0 -38
  189. package/clis/douyin/activities.test.js +0 -55
  190. package/clis/douyin/collections.test.js +0 -45
  191. package/clis/douyin/delete.test.js +0 -100
  192. package/clis/douyin/draft.test.js +0 -335
  193. package/clis/douyin/drafts.test.js +0 -11
  194. package/clis/douyin/hashtag.test.js +0 -171
  195. package/clis/douyin/location.test.js +0 -23
  196. package/clis/douyin/profile.test.js +0 -46
  197. package/clis/douyin/publish-upload-id.test.js +0 -170
  198. package/clis/douyin/publish.test.js +0 -38
  199. package/clis/douyin/stats.test.js +0 -22
  200. package/clis/douyin/update.test.js +0 -11
  201. package/clis/douyin/user-videos.test.js +0 -151
  202. package/clis/douyin/videos.test.js +0 -54
  203. package/clis/duckduckgo/search.test.js +0 -128
  204. package/clis/duckduckgo/suggest.test.js +0 -66
  205. package/clis/eastmoney/hot-rank.test.js +0 -59
  206. package/clis/endoflife/endoflife.test.js +0 -51
  207. package/clis/facebook/feed.test.js +0 -169
  208. package/clis/facebook/marketplace.test.js +0 -91
  209. package/clis/facebook/notifications.test.js +0 -458
  210. package/clis/facebook/search.test.js +0 -55
  211. package/clis/flathub/flathub.test.js +0 -90
  212. package/clis/flomo/memos.test.js +0 -144
  213. package/clis/gemini/ask.test.js +0 -100
  214. package/clis/gemini/deep-research-result.test.js +0 -155
  215. package/clis/gemini/deep-research.test.js +0 -181
  216. package/clis/gemini/reply-state.test.js +0 -671
  217. package/clis/gemini/utils.test.js +0 -198
  218. package/clis/geogebra/geogebra.test.js +0 -175
  219. package/clis/gitee/search.test.js +0 -65
  220. package/clis/gitee/user.test.js +0 -63
  221. package/clis/google/utils.test.js +0 -75
  222. package/clis/google-scholar/cite.test.js +0 -47
  223. package/clis/google-scholar/profile.test.js +0 -49
  224. package/clis/google-scholar/search.test.js +0 -71
  225. package/clis/goproxy/goproxy.test.js +0 -103
  226. package/clis/gov-law/commands.test.js +0 -39
  227. package/clis/gov-policy/gov-policy.test.js +0 -224
  228. package/clis/grok/ask.test.js +0 -29
  229. package/clis/grok/utils.test.js +0 -103
  230. package/clis/hackernews/hackernews.test.js +0 -132
  231. package/clis/hf/hf.test.js +0 -16
  232. package/clis/hupu/hot.test.js +0 -224
  233. package/clis/imdb/utils.test.js +0 -88
  234. package/clis/indeed/indeed.test.js +0 -375
  235. package/clis/instagram/_shared/private-publish.test.js +0 -705
  236. package/clis/instagram/_shared/protocol-capture.test.js +0 -114
  237. package/clis/instagram/download.test.js +0 -118
  238. package/clis/instagram/note.test.js +0 -53
  239. package/clis/instagram/post.test.js +0 -1647
  240. package/clis/instagram/reel.test.js +0 -167
  241. package/clis/instagram/story.test.js +0 -134
  242. package/clis/jd/commands.test.js +0 -41
  243. package/clis/jd/item.test.js +0 -354
  244. package/clis/jianyu/search.test.js +0 -153
  245. package/clis/jianyu/shared/procurement-contract.test.js +0 -72
  246. package/clis/jianyu/shared/procurement-detail.test.js +0 -84
  247. package/clis/jike/read.test.js +0 -86
  248. package/clis/jira/commands.test.js +0 -287
  249. package/clis/juejin/search.js +0 -123
  250. package/clis/juejin/search.test.js +0 -98
  251. package/clis/lesswrong/frontpage.test.js +0 -37
  252. package/clis/lichess/lichess.test.js +0 -85
  253. package/clis/linkedin/connect.test.js +0 -213
  254. package/clis/linkedin/inbox.test.js +0 -152
  255. package/clis/linkedin/job-detail.test.js +0 -38
  256. package/clis/linkedin/jobs-preferences.test.js +0 -43
  257. package/clis/linkedin/people-search.test.js +0 -216
  258. package/clis/linkedin/post-analytics.test.js +0 -40
  259. package/clis/linkedin/posts.test.js +0 -40
  260. package/clis/linkedin/profile-analytics.test.js +0 -67
  261. package/clis/linkedin/profile-experience.test.js +0 -152
  262. package/clis/linkedin/profile-projects.test.js +0 -111
  263. package/clis/linkedin/profile-read.test.js +0 -77
  264. package/clis/linkedin/safe-send.test.js +0 -204
  265. package/clis/linkedin/salesnav-inbox.test.js +0 -113
  266. package/clis/linkedin/salesnav-message.test.js +0 -172
  267. package/clis/linkedin/salesnav-search.test.js +0 -76
  268. package/clis/linkedin/salesnav-thread.test.js +0 -79
  269. package/clis/linkedin/search.test.js +0 -222
  270. package/clis/linkedin/sent-invitations.test.js +0 -62
  271. package/clis/linkedin/services-read.test.js +0 -105
  272. package/clis/linkedin/thread-snapshot.test.js +0 -89
  273. package/clis/linkedin/timeline.test.js +0 -81
  274. package/clis/linkedin-learning/course.test.js +0 -114
  275. package/clis/linkedin-learning/search.test.js +0 -144
  276. package/clis/linkedin-learning/trending.test.js +0 -123
  277. package/clis/linux-do/feed.test.js +0 -153
  278. package/clis/linux-do/topic-content.test.js +0 -59
  279. package/clis/lobsters/lobsters.test.js +0 -169
  280. package/clis/notebooklm/add-source.test.js +0 -97
  281. package/clis/notebooklm/compat.test.js +0 -16
  282. package/clis/notebooklm/create.test.js +0 -58
  283. package/clis/notebooklm/generate-audio.test.js +0 -63
  284. package/clis/notebooklm/generate-slides.test.js +0 -75
  285. package/clis/notebooklm/history.test.js +0 -58
  286. package/clis/notebooklm/note-list.test.js +0 -56
  287. package/clis/notebooklm/notes-get.test.js +0 -72
  288. package/clis/notebooklm/open.test.js +0 -63
  289. package/clis/notebooklm/rpc.test.js +0 -131
  290. package/clis/notebooklm/source-fulltext.test.js +0 -106
  291. package/clis/notebooklm/source-get.test.js +0 -84
  292. package/clis/notebooklm/source-guide.test.js +0 -104
  293. package/clis/notebooklm/summary.test.js +0 -78
  294. package/clis/notebooklm/utils.test.js +0 -449
  295. package/clis/notebooklm/write-note.test.js +0 -70
  296. package/clis/nuget/nuget.test.js +0 -111
  297. package/clis/oeis/oeis.test.js +0 -88
  298. package/clis/ones/task-helpers.test.js +0 -12
  299. package/clis/ones/worklog.test.js +0 -20
  300. package/clis/openfda/openfda.test.js +0 -114
  301. package/clis/openreview/openreview.test.js +0 -427
  302. package/clis/osv/osv.test.js +0 -97
  303. package/clis/paperreview/commands.test.js +0 -243
  304. package/clis/paperreview/utils.test.js +0 -49
  305. package/clis/pixiv/download.test.js +0 -87
  306. package/clis/pixiv/illusts.test.js +0 -99
  307. package/clis/pixiv/search.test.js +0 -83
  308. package/clis/powerchina/search.test.js +0 -93
  309. package/clis/producthunt/utils.test.js +0 -64
  310. package/clis/pubmed/pubmed.test.js +0 -276
  311. package/clis/quark/utils.test.js +0 -58
  312. package/clis/qwen/utils.test.js +0 -45
  313. package/clis/reddit/extract-media.test.js +0 -149
  314. package/clis/reddit/frontpage.test.js +0 -34
  315. package/clis/reddit/home.test.js +0 -170
  316. package/clis/reddit/hot.test.js +0 -32
  317. package/clis/reddit/popular.test.js +0 -26
  318. package/clis/reddit/read.test.js +0 -335
  319. package/clis/reddit/reply.test.js +0 -89
  320. package/clis/reddit/search.test.js +0 -26
  321. package/clis/reddit/subreddit-info.test.js +0 -163
  322. package/clis/reddit/subreddit.test.js +0 -31
  323. package/clis/reddit/subscribed.test.js +0 -168
  324. package/clis/reddit/whoami.test.js +0 -105
  325. package/clis/rednote/navigation.test.js +0 -26
  326. package/clis/rednote/rednote.test.js +0 -222
  327. package/clis/rest-countries/rest-countries.test.js +0 -83
  328. package/clis/reuters/reuters.test.js +0 -299
  329. package/clis/rfc/rfc.test.js +0 -74
  330. package/clis/sinafinance/stock.test.js +0 -59
  331. package/clis/spotify/utils.test.js +0 -67
  332. package/clis/stackoverflow/stackoverflow.test.js +0 -404
  333. package/clis/steam/steam.test.js +0 -46
  334. package/clis/substack/utils.test.js +0 -44
  335. package/clis/suno/commands.test.js +0 -188
  336. package/clis/suno/download.test.js +0 -151
  337. package/clis/suno/generate.test.js +0 -252
  338. package/clis/suno/utils.test.js +0 -329
  339. package/clis/taobao/commands.test.js +0 -41
  340. package/clis/tdx/hot-rank.test.js +0 -59
  341. package/clis/ths/hot-rank.test.js +0 -64
  342. package/clis/tieba/commands.test.js +0 -79
  343. package/clis/tieba/utils.test.js +0 -290
  344. package/clis/tiktok/creator-videos.test.js +0 -113
  345. package/clis/tiktok/refactor.test.js +0 -389
  346. package/clis/tiktok/write-refactor.test.js +0 -370
  347. package/clis/toutiao/toutiao.test.js +0 -378
  348. package/clis/tvmaze/tvmaze.test.js +0 -93
  349. package/clis/twitter/bookmark-folder.test.js +0 -395
  350. package/clis/twitter/bookmark-folders.test.js +0 -152
  351. package/clis/twitter/bookmark.test.js +0 -74
  352. package/clis/twitter/bookmarks.test.js +0 -205
  353. package/clis/twitter/delete.test.js +0 -85
  354. package/clis/twitter/device-follow.test.js +0 -287
  355. package/clis/twitter/download.test.js +0 -457
  356. package/clis/twitter/followers.test.js +0 -62
  357. package/clis/twitter/following.test.js +0 -338
  358. package/clis/twitter/hide-reply.test.js +0 -76
  359. package/clis/twitter/like.test.js +0 -73
  360. package/clis/twitter/likes.test.js +0 -220
  361. package/clis/twitter/list-add.test.js +0 -133
  362. package/clis/twitter/list-create.test.js +0 -169
  363. package/clis/twitter/list-remove.test.js +0 -110
  364. package/clis/twitter/list-tweets.test.js +0 -196
  365. package/clis/twitter/lists.test.js +0 -253
  366. package/clis/twitter/post.test.js +0 -258
  367. package/clis/twitter/profile.test.js +0 -39
  368. package/clis/twitter/quote.test.js +0 -194
  369. package/clis/twitter/reply.test.js +0 -237
  370. package/clis/twitter/retweet.test.js +0 -73
  371. package/clis/twitter/search.test.js +0 -349
  372. package/clis/twitter/shared.test.js +0 -794
  373. package/clis/twitter/thread.test.js +0 -58
  374. package/clis/twitter/timeline.test.js +0 -104
  375. package/clis/twitter/trending.test.js +0 -15
  376. package/clis/twitter/tweets.test.js +0 -362
  377. package/clis/twitter/unbookmark.test.js +0 -73
  378. package/clis/twitter/unlike.test.js +0 -75
  379. package/clis/twitter/unretweet.test.js +0 -73
  380. package/clis/twitter/utils.test.js +0 -169
  381. package/clis/uisdc/news.test.js +0 -66
  382. package/clis/uiverse/_shared.test.js +0 -62
  383. package/clis/uiverse/navigation.test.js +0 -12
  384. package/clis/upwork/upwork.test.js +0 -566
  385. package/clis/wanfang/search.test.js +0 -23
  386. package/clis/web/read.test.js +0 -392
  387. package/clis/weibo/delete.test.js +0 -94
  388. package/clis/weibo/envelope.test.js +0 -85
  389. package/clis/weibo/favorites.test.js +0 -114
  390. package/clis/weibo/publish.test.js +0 -192
  391. package/clis/weibo/user-posts.test.js +0 -92
  392. package/clis/weibo/utils.test.js +0 -36
  393. package/clis/weixin/drafts.test.js +0 -69
  394. package/clis/weixin/search.test.js +0 -227
  395. package/clis/weread/ai-outline.test.js +0 -83
  396. package/clis/weread/book-search.test.js +0 -242
  397. package/clis/weread/commands.test.js +0 -398
  398. package/clis/weread/private-api-regression.test.js +0 -369
  399. package/clis/weread/search-regression.test.js +0 -494
  400. package/clis/weread/utils.test.js +0 -128
  401. package/clis/weread-official/commands.test.js +0 -385
  402. package/clis/weread-official/utils.test.js +0 -242
  403. package/clis/wikidata/wikidata.test.js +0 -83
  404. package/clis/wikipedia/trending.test.js +0 -57
  405. package/clis/wttr/wttr.test.js +0 -84
  406. package/clis/xianyu/chat.test.js +0 -84
  407. package/clis/xianyu/im.test.js +0 -253
  408. package/clis/xianyu/item.test.js +0 -56
  409. package/clis/xianyu/publish.test.js +0 -220
  410. package/clis/xianyu/search.test.js +0 -17
  411. package/clis/xiaoe/xiaoe.test.js +0 -486
  412. package/clis/xiaohongshu/comments.test.js +0 -258
  413. package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
  414. package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
  415. package/clis/xiaohongshu/creator-notes.test.js +0 -281
  416. package/clis/xiaohongshu/creator-stats.test.js +0 -24
  417. package/clis/xiaohongshu/delete-note.test.js +0 -172
  418. package/clis/xiaohongshu/download.test.js +0 -316
  419. package/clis/xiaohongshu/navigation.test.js +0 -34
  420. package/clis/xiaohongshu/note.test.js +0 -249
  421. package/clis/xiaohongshu/publish.test.js +0 -608
  422. package/clis/xiaohongshu/search.test.js +0 -325
  423. package/clis/xiaohongshu/user-helpers.test.js +0 -160
  424. package/clis/xiaoyuzhou/auth.test.js +0 -124
  425. package/clis/xiaoyuzhou/download.test.js +0 -135
  426. package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
  427. package/clis/xiaoyuzhou/transcript.test.js +0 -195
  428. package/clis/xiaoyuzhou/utils.test.js +0 -39
  429. package/clis/xueqiu/comments.test.js +0 -696
  430. package/clis/xueqiu/danjuan-utils.test.js +0 -41
  431. package/clis/xueqiu/utils.test.js +0 -26
  432. package/clis/yahoo/search.test.js +0 -94
  433. package/clis/youdao/note.test.js +0 -99
  434. package/clis/youtube/channel.test.js +0 -59
  435. package/clis/youtube/feed.test.js +0 -131
  436. package/clis/youtube/transcript-group.test.js +0 -99
  437. package/clis/youtube/transcript.test.js +0 -296
  438. package/clis/youtube/utils.test.js +0 -84
  439. package/clis/yuanbao/ask.test.js +0 -124
  440. package/clis/yuanbao/new.test.js +0 -30
  441. package/clis/yuanbao/shared.test.js +0 -80
  442. package/clis/zhihu/answer-comments.test.js +0 -287
  443. package/clis/zhihu/answer-detail.test.js +0 -338
  444. package/clis/zhihu/answer.test.js +0 -54
  445. package/clis/zhihu/collection.test.js +0 -337
  446. package/clis/zhihu/collections.test.js +0 -182
  447. package/clis/zhihu/comment.test.js +0 -50
  448. package/clis/zhihu/download.test.js +0 -12
  449. package/clis/zhihu/favorite.test.js +0 -59
  450. package/clis/zhihu/follow.test.js +0 -42
  451. package/clis/zhihu/like.test.js +0 -41
  452. package/clis/zhihu/question.test.js +0 -251
  453. package/clis/zhihu/recommend.test.js +0 -143
  454. package/clis/zhihu/search.test.js +0 -198
  455. package/clis/zhihu/target.test.js +0 -77
  456. package/clis/zhihu/text.test.js +0 -24
  457. package/clis/zhihu/write-shared.test.js +0 -176
  458. package/clis/zlibrary/commands.test.js +0 -65
  459. package/clis/zsxq/search.test.js +0 -24
  460. package/clis/zsxq/topic.test.js +0 -30
  461. package/clis/zsxq/topics.test.js +0 -24
  462. package/clis/zsxq/utils.test.js +0 -31
  463. package/dist/src/adapter-shadow.test.js +0 -49
  464. package/dist/src/adapter-source.test.js +0 -29
  465. package/dist/src/browser/analyze.test.js +0 -166
  466. package/dist/src/browser/article-extract.e2e.test.js +0 -105
  467. package/dist/src/browser/article-extract.test.js +0 -94
  468. package/dist/src/browser/ax-snapshot.test.js +0 -91
  469. package/dist/src/browser/base-page.test.js +0 -758
  470. package/dist/src/browser/cdp-click-fixture.test.js +0 -87
  471. package/dist/src/browser/cdp.test.js +0 -79
  472. package/dist/src/browser/compound.test.js +0 -175
  473. package/dist/src/browser/daemon-client.test.js +0 -199
  474. package/dist/src/browser/dom-helpers.test.js +0 -106
  475. package/dist/src/browser/dom-snapshot.test.js +0 -313
  476. package/dist/src/browser/errors.test.js +0 -60
  477. package/dist/src/browser/extract.test.js +0 -129
  478. package/dist/src/browser/find.test.js +0 -180
  479. package/dist/src/browser/html-tree.test.js +0 -181
  480. package/dist/src/browser/network-cache.test.js +0 -58
  481. package/dist/src/browser/network-key.test.js +0 -49
  482. package/dist/src/browser/page.test.js +0 -378
  483. package/dist/src/browser/shape-filter.test.js +0 -101
  484. package/dist/src/browser/shape.test.js +0 -82
  485. package/dist/src/browser/stealth.test.js +0 -134
  486. package/dist/src/browser/target-errors.test.js +0 -94
  487. package/dist/src/browser/target-resolver.test.js +0 -118
  488. package/dist/src/browser/utils.test.js +0 -29
  489. package/dist/src/browser/verify-fixture.test.js +0 -219
  490. package/dist/src/browser.test.js +0 -232
  491. package/dist/src/build-manifest.test.js +0 -341
  492. package/dist/src/capabilityRouting.test.js +0 -63
  493. package/dist/src/cli-argv-preprocess.test.js +0 -209
  494. package/dist/src/cli.test.js +0 -2803
  495. package/dist/src/commanderAdapter.test.js +0 -352
  496. package/dist/src/commands/daemon.test.js +0 -219
  497. package/dist/src/completion.test.js +0 -24
  498. package/dist/src/convention-audit.test.js +0 -247
  499. package/dist/src/daemon.test.js +0 -60
  500. package/dist/src/doctor.test.js +0 -263
  501. package/dist/src/download/article-download.test.js +0 -235
  502. package/dist/src/download/index.test.js +0 -140
  503. package/dist/src/download/media-download.test.js +0 -112
  504. package/dist/src/download/progress.test.js +0 -36
  505. package/dist/src/electron-apps.test.js +0 -49
  506. package/dist/src/engine.test.js +0 -312
  507. package/dist/src/errors.test.js +0 -109
  508. package/dist/src/execution.test.js +0 -623
  509. package/dist/src/extension-manifest-regression.test.js +0 -12
  510. package/dist/src/external.test.js +0 -146
  511. package/dist/src/help.test.js +0 -58
  512. package/dist/src/hooks.test.js +0 -92
  513. package/dist/src/interceptor.test.js +0 -81
  514. package/dist/src/launcher.test.js +0 -138
  515. package/dist/src/node-network.test.js +0 -55
  516. package/dist/src/observation/artifact.test.js +0 -121
  517. package/dist/src/observation/manager.test.js +0 -13
  518. package/dist/src/observation/redaction.test.js +0 -32
  519. package/dist/src/observation/retention.test.js +0 -118
  520. package/dist/src/observation/ring-buffer.test.js +0 -22
  521. package/dist/src/output.test.js +0 -53
  522. package/dist/src/package-exports.test.js +0 -112
  523. package/dist/src/pipeline/executor.test.js +0 -182
  524. package/dist/src/pipeline/steps/download.test.js +0 -102
  525. package/dist/src/pipeline/steps/fetch.test.js +0 -117
  526. package/dist/src/pipeline/template.test.js +0 -175
  527. package/dist/src/pipeline/transform.test.js +0 -133
  528. package/dist/src/plugin-manifest.test.js +0 -179
  529. package/dist/src/plugin-scaffold.test.js +0 -83
  530. package/dist/src/plugin.test.js +0 -1324
  531. package/dist/src/registry.test.js +0 -209
  532. package/dist/src/runtime-detect.test.js +0 -39
  533. package/dist/src/serialization.test.js +0 -78
  534. package/dist/src/snapshotFormatter.test.js +0 -521
  535. package/dist/src/tui.test.js +0 -19
  536. package/dist/src/update-check.test.js +0 -116
  537. package/dist/src/utils.test.js +0 -155
  538. package/dist/src/validate.test.js +0 -90
  539. package/dist/src/weixin-download.test.js +0 -45
@@ -1,135 +0,0 @@
1
- import path from 'node:path';
2
- import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
3
- import { getRegistry } from '@sovovs/bycli/registry';
4
-
5
- const { mockRequestJson, mockLoadCredentials, mockHttpDownload, mockMkdirSync } = vi.hoisted(() => ({
6
- mockRequestJson: vi.fn(),
7
- mockLoadCredentials: vi.fn(),
8
- mockHttpDownload: vi.fn(),
9
- mockMkdirSync: vi.fn(),
10
- }));
11
-
12
- vi.mock('./auth.js', async () => {
13
- const actual = await vi.importActual('./auth.js');
14
- return {
15
- ...actual,
16
- requestXiaoyuzhouJson: mockRequestJson,
17
- loadXiaoyuzhouCredentials: mockLoadCredentials,
18
- };
19
- });
20
-
21
- vi.mock('@sovovs/bycli/download', () => ({
22
- httpDownload: mockHttpDownload,
23
- sanitizeFilename: vi.fn((value) => value.replace(/\s+/g, '_')),
24
- }));
25
-
26
- vi.mock('@sovovs/bycli/download/progress', () => ({
27
- formatBytes: vi.fn((size) => `${size} B`),
28
- }));
29
-
30
- vi.mock('node:fs', () => ({
31
- mkdirSync: mockMkdirSync,
32
- }));
33
-
34
- await import('./download.js');
35
-
36
- let cmd;
37
-
38
- function toPosixPath(value) {
39
- return value.replaceAll(path.sep, '/');
40
- }
41
-
42
- beforeAll(() => {
43
- cmd = getRegistry().get('xiaoyuzhou/download');
44
- expect(cmd?.func).toBeTypeOf('function');
45
- });
46
-
47
- describe('xiaoyuzhou download', () => {
48
- beforeEach(() => {
49
- mockRequestJson.mockReset();
50
- mockLoadCredentials.mockReset();
51
- mockHttpDownload.mockReset();
52
- mockMkdirSync.mockReset();
53
- mockLoadCredentials.mockReturnValue({});
54
- });
55
-
56
- it('downloads audio from media.source.url into an episode subdirectory', async () => {
57
- mockRequestJson.mockResolvedValue({
58
- credentials: {},
59
- data: {
60
- title: 'Hello World',
61
- podcast: { title: 'byCLI FM' },
62
- media: {
63
- source: {
64
- url: 'https://media.xyzcdn.net/audio/hello-world.mp3?sign=abc',
65
- },
66
- },
67
- },
68
- });
69
- mockHttpDownload.mockResolvedValue({ success: true, size: 1234 });
70
-
71
- const result = await cmd.func({
72
- id: 'ep123',
73
- output: '/tmp/xiaoyuzhou-test',
74
- });
75
-
76
- expect(mockRequestJson).toHaveBeenCalledWith('/v1/episode/get', {
77
- query: { eid: 'ep123' },
78
- credentials: {},
79
- });
80
- expect(toPosixPath(mockMkdirSync.mock.calls[0][0])).toBe('/tmp/xiaoyuzhou-test/ep123');
81
- expect(mockMkdirSync.mock.calls[0][1]).toEqual({ recursive: true });
82
- expect(mockHttpDownload).toHaveBeenCalledWith('https://media.xyzcdn.net/audio/hello-world.mp3?sign=abc', expect.stringContaining('/tmp/xiaoyuzhou-test/ep123/ep123_Hello_World.mp3'), {
83
- timeout: 60000,
84
- });
85
- expect(result).toEqual([{
86
- title: 'Hello World',
87
- podcast: 'byCLI FM',
88
- status: 'success',
89
- size: '1234 B',
90
- file: '/tmp/xiaoyuzhou-test/ep123/ep123_Hello_World.mp3',
91
- }]);
92
- });
93
-
94
- it('preserves non-mp3 extensions from media.source.url', async () => {
95
- mockRequestJson.mockResolvedValue({
96
- credentials: {},
97
- data: {
98
- title: 'Lossless Episode',
99
- podcast: { title: 'byCLI FM' },
100
- media: {
101
- source: {
102
- url: 'https://media.xyzcdn.net/audio/lossless.m4a',
103
- },
104
- },
105
- },
106
- });
107
- mockHttpDownload.mockResolvedValue({ success: true, size: 2048 });
108
-
109
- const result = await cmd.func({
110
- id: 'ep456',
111
- output: '/tmp/xiaoyuzhou-test',
112
- });
113
-
114
- expect(mockHttpDownload.mock.calls[0][1]).toContain('ep456_Lossless_Episode.m4a');
115
- expect(result[0].file).toBe('/tmp/xiaoyuzhou-test/ep456/ep456_Lossless_Episode.m4a');
116
- });
117
-
118
- it('throws when media.source.url is missing', async () => {
119
- mockRequestJson.mockResolvedValue({
120
- credentials: {},
121
- data: {
122
- title: 'No Audio',
123
- podcast: { title: 'byCLI FM' },
124
- media: {},
125
- },
126
- });
127
-
128
- await expect(cmd.func({ id: 'ep789', output: '/tmp/xiaoyuzhou-test' })).rejects.toMatchObject({
129
- code: 'PARSE_ERROR',
130
- message: 'Audio URL not found in episode payload',
131
- hint: 'Episode payload does not expose media.source.url',
132
- });
133
- expect(mockHttpDownload).not.toHaveBeenCalled();
134
- });
135
- });
@@ -1,78 +0,0 @@
1
- import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { getRegistry } from '@sovovs/bycli/registry';
3
-
4
- const { mockRequestJson, mockLoadCredentials } = vi.hoisted(() => ({
5
- mockRequestJson: vi.fn(),
6
- mockLoadCredentials: vi.fn(),
7
- }));
8
-
9
- vi.mock('./auth.js', async () => {
10
- const actual = await vi.importActual('./auth.js');
11
- return {
12
- ...actual,
13
- requestXiaoyuzhouJson: mockRequestJson,
14
- loadXiaoyuzhouCredentials: mockLoadCredentials,
15
- };
16
- });
17
-
18
- await import('./podcast-episodes.js');
19
-
20
- let cmd;
21
-
22
- beforeAll(() => {
23
- cmd = getRegistry().get('xiaoyuzhou/podcast-episodes');
24
- expect(cmd?.func).toBeTypeOf('function');
25
- });
26
-
27
- describe('xiaoyuzhou podcast-episodes', () => {
28
- beforeEach(() => {
29
- mockRequestJson.mockReset();
30
- mockLoadCredentials.mockReset();
31
- mockLoadCredentials.mockReturnValue({ access_token: 'access', refresh_token: 'refresh' });
32
- });
33
-
34
- it('calls the fixed episode list endpoint with desc ordering', async () => {
35
- mockRequestJson.mockResolvedValue({
36
- data: [
37
- {
38
- eid: 'ep-1',
39
- title: 'Episode 1',
40
- duration: 3661,
41
- playCount: 42,
42
- pubDate: '2026-04-20T10:00:00.000Z',
43
- },
44
- ],
45
- });
46
-
47
- const result = await cmd.func({
48
- id: 'podcast-1',
49
- limit: 3,
50
- });
51
-
52
- expect(mockRequestJson).toHaveBeenCalledWith('/v1/episode/list', {
53
- method: 'POST',
54
- body: { pid: 'podcast-1', order: 'desc', limit: 3 },
55
- credentials: { access_token: 'access', refresh_token: 'refresh' },
56
- });
57
- expect(result).toEqual([
58
- {
59
- eid: 'ep-1',
60
- title: 'Episode 1',
61
- duration: '61:01',
62
- plays: 42,
63
- date: '2026-04-20',
64
- },
65
- ]);
66
- });
67
-
68
- it('rejects non-positive limits before hitting the API', async () => {
69
- await expect(cmd.func({
70
- id: 'podcast-1',
71
- limit: 0,
72
- })).rejects.toMatchObject({
73
- code: 'INVALID_ARGUMENT',
74
- message: 'limit must be a positive integer',
75
- });
76
- expect(mockRequestJson).not.toHaveBeenCalled();
77
- });
78
- });
@@ -1,195 +0,0 @@
1
- import path from 'node:path';
2
- import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
3
- import { getRegistry } from '@sovovs/bycli/registry';
4
-
5
- const { mockLoadCredentials, mockRequestJson, mockFetchTranscriptBody, mockMkdirSync, mockWriteFileSync } = vi.hoisted(() => ({
6
- mockLoadCredentials: vi.fn(),
7
- mockRequestJson: vi.fn(),
8
- mockFetchTranscriptBody: vi.fn(),
9
- mockMkdirSync: vi.fn(),
10
- mockWriteFileSync: vi.fn(),
11
- }));
12
-
13
- vi.mock('./auth.js', async () => {
14
- const actual = await vi.importActual('./auth.js');
15
- return {
16
- ...actual,
17
- loadXiaoyuzhouCredentials: mockLoadCredentials,
18
- requestXiaoyuzhouJson: mockRequestJson,
19
- fetchXiaoyuzhouTranscriptBody: mockFetchTranscriptBody,
20
- };
21
- });
22
-
23
- vi.mock('node:fs', () => ({
24
- mkdirSync: mockMkdirSync,
25
- writeFileSync: mockWriteFileSync,
26
- }));
27
-
28
- await import('./transcript.js');
29
-
30
- let cmd;
31
-
32
- function toPosixPath(value) {
33
- return value.replaceAll(path.sep, '/');
34
- }
35
-
36
- beforeAll(() => {
37
- cmd = getRegistry().get('xiaoyuzhou/transcript');
38
- expect(cmd?.func).toBeTypeOf('function');
39
- });
40
-
41
- describe('xiaoyuzhou transcript', () => {
42
- beforeEach(() => {
43
- mockLoadCredentials.mockReset();
44
- mockRequestJson.mockReset();
45
- mockFetchTranscriptBody.mockReset();
46
- mockMkdirSync.mockReset();
47
- mockWriteFileSync.mockReset();
48
- mockLoadCredentials.mockReturnValue({ access_token: 'access', refresh_token: 'refresh' });
49
- });
50
-
51
- it('downloads transcript json and extracted text files', async () => {
52
- mockRequestJson
53
- .mockResolvedValueOnce({
54
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
55
- data: {
56
- title: 'Transcript Episode',
57
- podcast: { title: 'byCLI FM' },
58
- transcript: { mediaId: 'media-123' },
59
- },
60
- })
61
- .mockResolvedValueOnce({
62
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
63
- data: {
64
- transcriptUrl: 'https://cdn.example.com/transcript.json',
65
- },
66
- });
67
- mockFetchTranscriptBody.mockResolvedValue(JSON.stringify({
68
- segments: [{ text: 'hello' }, { text: 'world' }],
69
- }));
70
- const result = await cmd.func({
71
- id: 'ep123',
72
- output: '/tmp/xiaoyuzhou-transcripts',
73
- json: true,
74
- text: true,
75
- });
76
- expect(mockRequestJson).toHaveBeenNthCalledWith(1, '/v1/episode/get', {
77
- query: { eid: 'ep123' },
78
- credentials: { access_token: 'access', refresh_token: 'refresh' },
79
- });
80
- expect(mockRequestJson).toHaveBeenNthCalledWith(2, '/v1/episode-transcript/get', {
81
- method: 'POST',
82
- body: { eid: 'ep123', mediaId: 'media-123' },
83
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
84
- });
85
- expect(mockMkdirSync).toHaveBeenCalledWith('/tmp/xiaoyuzhou-transcripts/ep123', { recursive: true });
86
- expect(mockWriteFileSync).toHaveBeenNthCalledWith(1, '/tmp/xiaoyuzhou-transcripts/ep123/transcript.json', expect.any(String), 'utf-8');
87
- expect(mockWriteFileSync).toHaveBeenNthCalledWith(2, '/tmp/xiaoyuzhou-transcripts/ep123/transcript.txt', 'hello\nworld', 'utf-8');
88
- expect(result).toEqual([{
89
- title: 'Transcript Episode',
90
- podcast: 'byCLI FM',
91
- status: 'success',
92
- segments: '2',
93
- json_file: '/tmp/xiaoyuzhou-transcripts/ep123/transcript.json',
94
- text_file: '/tmp/xiaoyuzhou-transcripts/ep123/transcript.txt',
95
- }]);
96
- });
97
-
98
- it('derives mediaId from episode.media.id when transcript.mediaId is absent', async () => {
99
- mockRequestJson
100
- .mockResolvedValueOnce({
101
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
102
- data: {
103
- title: 'Transcript Episode',
104
- podcast: { title: 'byCLI FM' },
105
- media: { id: 'media-456' },
106
- },
107
- })
108
- .mockResolvedValueOnce({
109
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
110
- data: {
111
- transcriptUrl: 'https://cdn.example.com/transcript.json',
112
- },
113
- });
114
- mockFetchTranscriptBody.mockResolvedValue(JSON.stringify({ text: 'hello' }));
115
- await cmd.func({
116
- id: 'ep456',
117
- output: '/tmp/xiaoyuzhou-transcripts',
118
- json: false,
119
- text: true,
120
- });
121
- expect(mockRequestJson.mock.calls[1][1].body.mediaId).toBe('media-456');
122
- expect(mockWriteFileSync).toHaveBeenCalledTimes(1);
123
- expect(mockWriteFileSync).toHaveBeenCalledWith('/tmp/xiaoyuzhou-transcripts/ep456/transcript.txt', 'hello', 'utf-8');
124
- });
125
-
126
- it('throws when transcript url is missing', async () => {
127
- mockRequestJson
128
- .mockResolvedValueOnce({
129
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
130
- data: {
131
- title: 'Transcript Episode',
132
- podcast: { title: 'byCLI FM' },
133
- transcript: { mediaId: 'media-123' },
134
- },
135
- })
136
- .mockResolvedValueOnce({
137
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
138
- data: {},
139
- });
140
- await expect(cmd.func({
141
- id: 'ep123',
142
- output: '/tmp/xiaoyuzhou-transcripts',
143
- json: true,
144
- text: true,
145
- })).rejects.toMatchObject({
146
- code: 'EMPTY_RESULT',
147
- message: 'Transcript URL not found',
148
- });
149
- expect(mockWriteFileSync).not.toHaveBeenCalled();
150
- });
151
-
152
- it('throws parse_error when transcript text extraction fails', async () => {
153
- mockRequestJson
154
- .mockResolvedValueOnce({
155
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
156
- data: {
157
- title: 'Transcript Episode',
158
- podcast: { title: 'byCLI FM' },
159
- transcript: { mediaId: 'media-123' },
160
- },
161
- })
162
- .mockResolvedValueOnce({
163
- credentials: { access_token: 'access-1', refresh_token: 'refresh-1' },
164
- data: {
165
- transcriptUrl: 'https://cdn.example.com/transcript.json',
166
- },
167
- });
168
- mockFetchTranscriptBody.mockResolvedValue(JSON.stringify({
169
- segments: [{ startAt: 0, endAt: 1 }],
170
- }));
171
- await expect(cmd.func({
172
- id: 'ep123',
173
- output: '/tmp/xiaoyuzhou-transcripts',
174
- json: true,
175
- text: true,
176
- })).rejects.toMatchObject({
177
- code: 'PARSE_ERROR',
178
- message: 'Failed to extract transcript text',
179
- });
180
- expect(mockWriteFileSync).not.toHaveBeenCalled();
181
- });
182
-
183
- it('rejects disabling both json and text outputs', async () => {
184
- await expect(cmd.func({
185
- id: 'ep123',
186
- output: '/tmp/xiaoyuzhou-transcripts',
187
- json: false,
188
- text: false,
189
- })).rejects.toMatchObject({
190
- code: 'ARGUMENT',
191
- message: 'At least one of --json or --text must be enabled',
192
- });
193
- expect(mockRequestJson).not.toHaveBeenCalled();
194
- });
195
- });
@@ -1,39 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { formatDuration, formatDate } from './utils.js';
3
- describe('formatDuration', () => {
4
- it('formats typical duration', () => {
5
- expect(formatDuration(3890)).toBe('64:50');
6
- });
7
- it('formats zero seconds', () => {
8
- expect(formatDuration(0)).toBe('0:00');
9
- });
10
- it('pads single-digit seconds', () => {
11
- expect(formatDuration(62)).toBe('1:02');
12
- });
13
- it('handles exact minutes', () => {
14
- expect(formatDuration(120)).toBe('2:00');
15
- });
16
- it('rounds fractional seconds', () => {
17
- expect(formatDuration(65.7)).toBe('1:06');
18
- });
19
- it('returns dash for NaN', () => {
20
- expect(formatDuration(NaN)).toBe('-');
21
- });
22
- it('returns dash for negative', () => {
23
- expect(formatDuration(-1)).toBe('-');
24
- });
25
- it('returns dash for Infinity', () => {
26
- expect(formatDuration(Infinity)).toBe('-');
27
- });
28
- });
29
- describe('formatDate', () => {
30
- it('slices ISO string to date', () => {
31
- expect(formatDate('2026-03-15T12:00:00Z')).toBe('2026-03-15');
32
- });
33
- it('returns dash for empty string', () => {
34
- expect(formatDate('')).toBe('-');
35
- });
36
- it('returns dash for undefined', () => {
37
- expect(formatDate(undefined)).toBe('-');
38
- });
39
- });