@mx-space/cli 0.15.1 → 0.15.2

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 (611) hide show
  1. package/dist/{Lexical.dev-BSvx45_E.mjs → Lexical.dev-Df5TNMgP.mjs} +2 -2
  2. package/dist/{Lexical.node-kAh5GM2n.mjs → Lexical.node-B064E4Hy.mjs} +1 -1
  3. package/dist/{Lexical.prod-Bqwgb3ez.mjs → Lexical.prod-DRFSwoE7.mjs} +2 -2
  4. package/dist/{LexicalClipboard.dev-BWU3KXIa.mjs → LexicalClipboard.dev-ClOWeg5v.mjs} +5 -5
  5. package/dist/{LexicalClipboard.node-BygAdNdF.mjs → LexicalClipboard.node-BJBLWpEi.mjs} +1 -1
  6. package/dist/{LexicalClipboard.prod-BtMuKNyT.mjs → LexicalClipboard.prod-Ytt65eQo.mjs} +5 -5
  7. package/dist/{LexicalCodeCore.dev-CD2xgvDs.mjs → LexicalCodeCore.dev-CzEPINOT.mjs} +4 -4
  8. package/dist/{LexicalCodeCore.prod-Bl6FFMc7.mjs → LexicalCodeCore.prod-DOVk7lL_.mjs} +4 -4
  9. package/dist/{LexicalDragon.dev-BwdYhm4K.mjs → LexicalDragon.dev-DxePN9fP.mjs} +2 -2
  10. package/dist/{LexicalDragon.node-CpJhkCVV.mjs → LexicalDragon.node-DBwaqStp.mjs} +1 -1
  11. package/dist/{LexicalDragon.prod-CvXmWwo1.mjs → LexicalDragon.prod-Bji84-Hq.mjs} +2 -2
  12. package/dist/{LexicalExtension.dev-LcRLXI5Z.mjs → LexicalExtension.dev-DtSRyjbf.mjs} +2 -2
  13. package/dist/{LexicalExtension.node-BwJt2LXV.mjs → LexicalExtension.node-3nsS5NjU.mjs} +1 -1
  14. package/dist/{LexicalExtension.prod-lg8_33-H.mjs → LexicalExtension.prod-Ddk0ja_6.mjs} +2 -2
  15. package/dist/{LexicalHeadless.dev-BeUbKBes.mjs → LexicalHeadless.dev-DdWJsPoH.mjs} +1 -1
  16. package/dist/{LexicalHeadless.prod-4gbIA8HM.mjs → LexicalHeadless.prod-CH74ZDMt.mjs} +1 -1
  17. package/dist/{LexicalHtml.dev-BLdZWTCJ.mjs → LexicalHtml.dev-DN7QIb_7.mjs} +4 -4
  18. package/dist/{LexicalHtml.node-BeuJMvvt.mjs → LexicalHtml.node-DAwuaPeI.mjs} +1 -1
  19. package/dist/{LexicalHtml.prod-CHUyCocN.mjs → LexicalHtml.prod-X4eTHEfI.mjs} +4 -4
  20. package/dist/{LexicalLink.dev-DgsFRqw0.mjs → LexicalLink.dev-owitIl6I.mjs} +4 -4
  21. package/dist/{LexicalLink.prod-CkXkeKY2.mjs → LexicalLink.prod-BZ7ZZkVD.mjs} +4 -4
  22. package/dist/{LexicalList.dev-OOms3kQi.mjs → LexicalList.dev-CUbi09Yo.mjs} +4 -4
  23. package/dist/{LexicalList.prod-DzMBeqHn.mjs → LexicalList.prod-pUsUZa0r.mjs} +4 -4
  24. package/dist/{LexicalMarkdown.dev-DJLKbZtD.mjs → LexicalMarkdown.dev-S2yWckH9.mjs} +3 -3
  25. package/dist/{LexicalMarkdown.prod-Cp21kDCU.mjs → LexicalMarkdown.prod-TRkMWfmC.mjs} +3 -3
  26. package/dist/{LexicalRichText.dev-0rkAGjUf.mjs → LexicalRichText.dev-Y3ybFF2S.mjs} +7 -7
  27. package/dist/{LexicalRichText.node-Cd-BySPE.mjs → LexicalRichText.node-wNAi2Z4i.mjs} +4 -4
  28. package/dist/{LexicalRichText.prod-DTQiEr8C.mjs → LexicalRichText.prod-HLxqZ6hQ.mjs} +7 -7
  29. package/dist/{LexicalSelection.dev-Bi0VlUEv.mjs → LexicalSelection.dev-CyhKOKbs.mjs} +1 -1
  30. package/dist/{LexicalSelection.node-t2U46EF_.mjs → LexicalSelection.node-BCuHMbzl.mjs} +1 -1
  31. package/dist/{LexicalSelection.prod-CrFG111g.mjs → LexicalSelection.prod-RebDJliC.mjs} +1 -1
  32. package/dist/{LexicalTable.dev-D-sFhO-o.mjs → LexicalTable.dev-DN3ezVey.mjs} +5 -5
  33. package/dist/{LexicalTable.prod-DwYaa_dN.mjs → LexicalTable.prod-B0MioVyq.mjs} +5 -5
  34. package/dist/{LexicalUtils.dev-Q2q3-UDM.mjs → LexicalUtils.dev-Bw6LFRlt.mjs} +2 -2
  35. package/dist/{LexicalUtils.node-Dl7OvqJV.mjs → LexicalUtils.node-BPKMFN80.mjs} +1 -1
  36. package/dist/{LexicalUtils.prod-CBnq_iEV.mjs → LexicalUtils.prod-CJYQVQJO.mjs} +2 -2
  37. package/dist/bin/mxs.mjs +1 -1
  38. package/dist/{esm-ZXjJmLEC.mjs → esm-7vSMGlFz.mjs} +171 -245
  39. package/dist/esm-ZrfYH2y2.mjs +2 -0
  40. package/dist/index.mjs +1 -1
  41. package/dist/{mxs-DC9zR3f2.mjs → mxs-DKv-4ZTg.mjs} +362 -297
  42. package/dist/vendor/litexml/cli.mjs +94 -38
  43. package/dist/vendor/litexml/litexml-html-preview-client.css +329 -836
  44. package/dist/vendor/litexml/litexml-html-preview-client.js +6048 -5832
  45. package/dist/vendor/litexml/style.css +5 -1
  46. package/package.json +10 -10
  47. package/dist/esm-CNZ7kdTg.mjs +0 -2
  48. package/dist/src/bin/mxs.d.ts +0 -2
  49. package/dist/src/bin/mxs.js +0 -310
  50. package/dist/src/cli/ai/_poll.d.ts +0 -12
  51. package/dist/src/cli/ai/_poll.js +0 -38
  52. package/dist/src/cli/ai/_resolve.d.ts +0 -8
  53. package/dist/src/cli/ai/_resolve.js +0 -27
  54. package/dist/src/cli/ai/index.d.ts +0 -127
  55. package/dist/src/cli/ai/index.js +0 -46
  56. package/dist/src/cli/ai/insights/by-article.d.ts +0 -10
  57. package/dist/src/cli/ai/insights/by-article.js +0 -21
  58. package/dist/src/cli/ai/insights/delete.d.ts +0 -7
  59. package/dist/src/cli/ai/insights/delete.js +0 -18
  60. package/dist/src/cli/ai/insights/edit.d.ts +0 -8
  61. package/dist/src/cli/ai/insights/edit.js +0 -54
  62. package/dist/src/cli/ai/insights/get.d.ts +0 -6
  63. package/dist/src/cli/ai/insights/get.js +0 -11
  64. package/dist/src/cli/ai/insights/index.d.ts +0 -30
  65. package/dist/src/cli/ai/insights/index.js +0 -17
  66. package/dist/src/cli/ai/insights/list.d.ts +0 -10
  67. package/dist/src/cli/ai/insights/list.js +0 -20
  68. package/dist/src/cli/ai/insights/refresh.d.ts +0 -10
  69. package/dist/src/cli/ai/insights/refresh.js +0 -25
  70. package/dist/src/cli/ai/insights/translate.d.ts +0 -10
  71. package/dist/src/cli/ai/insights/translate.js +0 -25
  72. package/dist/src/cli/ai/overview/by-article.d.ts +0 -7
  73. package/dist/src/cli/ai/overview/by-article.js +0 -15
  74. package/dist/src/cli/ai/overview/index.d.ts +0 -11
  75. package/dist/src/cli/ai/overview/index.js +0 -4
  76. package/dist/src/cli/ai/overview/list.d.ts +0 -10
  77. package/dist/src/cli/ai/overview/list.js +0 -20
  78. package/dist/src/cli/ai/summary/by-article.d.ts +0 -10
  79. package/dist/src/cli/ai/summary/by-article.js +0 -21
  80. package/dist/src/cli/ai/summary/delete.d.ts +0 -7
  81. package/dist/src/cli/ai/summary/delete.js +0 -18
  82. package/dist/src/cli/ai/summary/edit.d.ts +0 -8
  83. package/dist/src/cli/ai/summary/edit.js +0 -54
  84. package/dist/src/cli/ai/summary/get.d.ts +0 -6
  85. package/dist/src/cli/ai/summary/get.js +0 -11
  86. package/dist/src/cli/ai/summary/index.d.ts +0 -30
  87. package/dist/src/cli/ai/summary/index.js +0 -9
  88. package/dist/src/cli/ai/summary/list.d.ts +0 -10
  89. package/dist/src/cli/ai/summary/list.js +0 -20
  90. package/dist/src/cli/ai/summary/regen.d.ts +0 -10
  91. package/dist/src/cli/ai/summary/regen.js +0 -25
  92. package/dist/src/cli/ai/summary/translate.d.ts +0 -10
  93. package/dist/src/cli/ai/summary/translate.js +0 -25
  94. package/dist/src/cli/ai/translate/by-article.d.ts +0 -9
  95. package/dist/src/cli/ai/translate/by-article.js +0 -19
  96. package/dist/src/cli/ai/translate/delete.d.ts +0 -7
  97. package/dist/src/cli/ai/translate/delete.js +0 -18
  98. package/dist/src/cli/ai/translate/edit.d.ts +0 -8
  99. package/dist/src/cli/ai/translate/edit.js +0 -97
  100. package/dist/src/cli/ai/translate/entries/delete.d.ts +0 -7
  101. package/dist/src/cli/ai/translate/entries/delete.js +0 -18
  102. package/dist/src/cli/ai/translate/entries/edit.d.ts +0 -8
  103. package/dist/src/cli/ai/translate/entries/edit.js +0 -73
  104. package/dist/src/cli/ai/translate/entries/generate.d.ts +0 -7
  105. package/dist/src/cli/ai/translate/entries/generate.js +0 -15
  106. package/dist/src/cli/ai/translate/entries/index.d.ts +0 -17
  107. package/dist/src/cli/ai/translate/entries/index.js +0 -6
  108. package/dist/src/cli/ai/translate/entries/list.d.ts +0 -10
  109. package/dist/src/cli/ai/translate/entries/list.js +0 -20
  110. package/dist/src/cli/ai/translate/get.d.ts +0 -6
  111. package/dist/src/cli/ai/translate/get.js +0 -11
  112. package/dist/src/cli/ai/translate/index.d.ts +0 -40
  113. package/dist/src/cli/ai/translate/index.js +0 -19
  114. package/dist/src/cli/ai/translate/languages.d.ts +0 -7
  115. package/dist/src/cli/ai/translate/languages.js +0 -15
  116. package/dist/src/cli/ai/translate/list.d.ts +0 -9
  117. package/dist/src/cli/ai/translate/list.js +0 -19
  118. package/dist/src/cli/ai/translate/run.d.ts +0 -10
  119. package/dist/src/cli/ai/translate/run.js +0 -31
  120. package/dist/src/cli/ai/tts/by-article.d.ts +0 -7
  121. package/dist/src/cli/ai/tts/by-article.js +0 -15
  122. package/dist/src/cli/ai/tts/delete.d.ts +0 -7
  123. package/dist/src/cli/ai/tts/delete.js +0 -18
  124. package/dist/src/cli/ai/tts/index.d.ts +0 -22
  125. package/dist/src/cli/ai/tts/index.js +0 -7
  126. package/dist/src/cli/ai/tts/list.d.ts +0 -10
  127. package/dist/src/cli/ai/tts/list.js +0 -20
  128. package/dist/src/cli/ai/tts/run.d.ts +0 -10
  129. package/dist/src/cli/ai/tts/run.js +0 -25
  130. package/dist/src/cli/ai/tts/voices.d.ts +0 -7
  131. package/dist/src/cli/ai/tts/voices.js +0 -12
  132. package/dist/src/cli/ai/views.d.ts +0 -3
  133. package/dist/src/cli/ai/views.js +0 -45
  134. package/dist/src/cli/auth/index.d.ts +0 -6
  135. package/dist/src/cli/auth/index.js +0 -22
  136. package/dist/src/cli/auth/login.d.ts +0 -11
  137. package/dist/src/cli/auth/login.js +0 -168
  138. package/dist/src/cli/auth/logout.d.ts +0 -6
  139. package/dist/src/cli/auth/logout.js +0 -21
  140. package/dist/src/cli/auth/status.d.ts +0 -4
  141. package/dist/src/cli/auth/status.js +0 -31
  142. package/dist/src/cli/auth/view.d.ts +0 -25
  143. package/dist/src/cli/auth/view.js +0 -46
  144. package/dist/src/cli/auth/whoami.d.ts +0 -7
  145. package/dist/src/cli/auth/whoami.js +0 -44
  146. package/dist/src/cli/category/create.d.ts +0 -10
  147. package/dist/src/cli/category/create.js +0 -24
  148. package/dist/src/cli/category/delete.d.ts +0 -8
  149. package/dist/src/cli/category/delete.js +0 -21
  150. package/dist/src/cli/category/get.d.ts +0 -6
  151. package/dist/src/cli/category/get.js +0 -11
  152. package/dist/src/cli/category/index.d.ts +0 -20
  153. package/dist/src/cli/category/index.js +0 -41
  154. package/dist/src/cli/category/list.d.ts +0 -4
  155. package/dist/src/cli/category/list.js +0 -10
  156. package/dist/src/cli/category/update.d.ts +0 -12
  157. package/dist/src/cli/category/update.js +0 -34
  158. package/dist/src/cli/comment/_flags.d.ts +0 -28
  159. package/dist/src/cli/comment/_flags.js +0 -48
  160. package/dist/src/cli/comment/approve.d.ts +0 -9
  161. package/dist/src/cli/comment/approve.js +0 -23
  162. package/dist/src/cli/comment/delete.d.ts +0 -9
  163. package/dist/src/cli/comment/delete.js +0 -24
  164. package/dist/src/cli/comment/get.d.ts +0 -6
  165. package/dist/src/cli/comment/get.js +0 -12
  166. package/dist/src/cli/comment/index.d.ts +0 -34
  167. package/dist/src/cli/comment/index.js +0 -53
  168. package/dist/src/cli/comment/list.d.ts +0 -9
  169. package/dist/src/cli/comment/list.js +0 -20
  170. package/dist/src/cli/comment/reject.d.ts +0 -9
  171. package/dist/src/cli/comment/reject.js +0 -23
  172. package/dist/src/cli/comment/reply.d.ts +0 -9
  173. package/dist/src/cli/comment/reply.js +0 -31
  174. package/dist/src/cli/comment/unread.d.ts +0 -7
  175. package/dist/src/cli/comment/unread.js +0 -21
  176. package/dist/src/cli/comment/view.d.ts +0 -3
  177. package/dist/src/cli/comment/view.js +0 -197
  178. package/dist/src/cli/config/edit.d.ts +0 -5
  179. package/dist/src/cli/config/edit.js +0 -36
  180. package/dist/src/cli/config/get.d.ts +0 -6
  181. package/dist/src/cli/config/get.js +0 -11
  182. package/dist/src/cli/config/index.d.ts +0 -10
  183. package/dist/src/cli/config/index.js +0 -22
  184. package/dist/src/cli/config/list.d.ts +0 -4
  185. package/dist/src/cli/config/list.js +0 -10
  186. package/dist/src/cli/config/set.d.ts +0 -9
  187. package/dist/src/cli/config/set.js +0 -48
  188. package/dist/src/cli/draft/_shared.d.ts +0 -27
  189. package/dist/src/cli/draft/_shared.js +0 -85
  190. package/dist/src/cli/draft/create.d.ts +0 -21
  191. package/dist/src/cli/draft/create.js +0 -34
  192. package/dist/src/cli/draft/delete.d.ts +0 -7
  193. package/dist/src/cli/draft/delete.js +0 -20
  194. package/dist/src/cli/draft/get.d.ts +0 -6
  195. package/dist/src/cli/draft/get.js +0 -11
  196. package/dist/src/cli/draft/index.d.ts +0 -54
  197. package/dist/src/cli/draft/index.js +0 -42
  198. package/dist/src/cli/draft/list.d.ts +0 -11
  199. package/dist/src/cli/draft/list.js +0 -23
  200. package/dist/src/cli/draft/publish.d.ts +0 -8
  201. package/dist/src/cli/draft/publish.js +0 -64
  202. package/dist/src/cli/draft/update.d.ts +0 -22
  203. package/dist/src/cli/draft/update.js +0 -29
  204. package/dist/src/cli/file/_shared.d.ts +0 -6
  205. package/dist/src/cli/file/_shared.js +0 -5
  206. package/dist/src/cli/file/delete.d.ts +0 -8
  207. package/dist/src/cli/file/delete.js +0 -21
  208. package/dist/src/cli/file/index.d.ts +0 -19
  209. package/dist/src/cli/file/index.js +0 -33
  210. package/dist/src/cli/file/list.d.ts +0 -6
  211. package/dist/src/cli/file/list.js +0 -11
  212. package/dist/src/cli/file/rename.d.ts +0 -8
  213. package/dist/src/cli/file/rename.js +0 -16
  214. package/dist/src/cli/file/upload.d.ts +0 -9
  215. package/dist/src/cli/file/upload.js +0 -32
  216. package/dist/src/cli/help/index.d.ts +0 -62
  217. package/dist/src/cli/help/index.js +0 -276
  218. package/dist/src/cli/help/registry.d.ts +0 -28
  219. package/dist/src/cli/help/registry.js +0 -29
  220. package/dist/src/cli/note/_flags.d.ts +0 -66
  221. package/dist/src/cli/note/_flags.js +0 -73
  222. package/dist/src/cli/note/create.d.ts +0 -23
  223. package/dist/src/cli/note/create.js +0 -25
  224. package/dist/src/cli/note/delete.d.ts +0 -8
  225. package/dist/src/cli/note/delete.js +0 -21
  226. package/dist/src/cli/note/edit.d.ts +0 -28
  227. package/dist/src/cli/note/edit.js +0 -114
  228. package/dist/src/cli/note/get.d.ts +0 -6
  229. package/dist/src/cli/note/get.js +0 -29
  230. package/dist/src/cli/note/index.d.ts +0 -77
  231. package/dist/src/cli/note/index.js +0 -63
  232. package/dist/src/cli/note/list.d.ts +0 -10
  233. package/dist/src/cli/note/list.js +0 -22
  234. package/dist/src/cli/note/publish.d.ts +0 -7
  235. package/dist/src/cli/note/publish.js +0 -17
  236. package/dist/src/cli/note/unpublish.d.ts +0 -7
  237. package/dist/src/cli/note/unpublish.js +0 -17
  238. package/dist/src/cli/note/update.d.ts +0 -25
  239. package/dist/src/cli/note/update.js +0 -36
  240. package/dist/src/cli/note/view.d.ts +0 -3
  241. package/dist/src/cli/note/view.js +0 -162
  242. package/dist/src/cli/page/create.d.ts +0 -41
  243. package/dist/src/cli/page/create.js +0 -56
  244. package/dist/src/cli/page/delete.d.ts +0 -7
  245. package/dist/src/cli/page/delete.js +0 -37
  246. package/dist/src/cli/page/edit.d.ts +0 -19
  247. package/dist/src/cli/page/edit.js +0 -117
  248. package/dist/src/cli/page/get.d.ts +0 -6
  249. package/dist/src/cli/page/get.js +0 -16
  250. package/dist/src/cli/page/index.d.ts +0 -44
  251. package/dist/src/cli/page/index.js +0 -38
  252. package/dist/src/cli/page/list.d.ts +0 -4
  253. package/dist/src/cli/page/list.js +0 -10
  254. package/dist/src/cli/page/update.d.ts +0 -16
  255. package/dist/src/cli/page/update.js +0 -48
  256. package/dist/src/cli/page/view.d.ts +0 -2
  257. package/dist/src/cli/page/view.js +0 -79
  258. package/dist/src/cli/post/_flags.d.ts +0 -66
  259. package/dist/src/cli/post/_flags.js +0 -96
  260. package/dist/src/cli/post/apply.d.ts +0 -7
  261. package/dist/src/cli/post/apply.js +0 -70
  262. package/dist/src/cli/post/create.d.ts +0 -21
  263. package/dist/src/cli/post/create.js +0 -24
  264. package/dist/src/cli/post/delete.d.ts +0 -8
  265. package/dist/src/cli/post/delete.js +0 -21
  266. package/dist/src/cli/post/edit.d.ts +0 -26
  267. package/dist/src/cli/post/edit.js +0 -115
  268. package/dist/src/cli/post/get.d.ts +0 -7
  269. package/dist/src/cli/post/get.js +0 -15
  270. package/dist/src/cli/post/index.d.ts +0 -91
  271. package/dist/src/cli/post/index.js +0 -73
  272. package/dist/src/cli/post/list.d.ts +0 -10
  273. package/dist/src/cli/post/list.js +0 -23
  274. package/dist/src/cli/post/publish.d.ts +0 -7
  275. package/dist/src/cli/post/publish.js +0 -17
  276. package/dist/src/cli/post/stage.d.ts +0 -23
  277. package/dist/src/cli/post/stage.js +0 -55
  278. package/dist/src/cli/post/unpublish.d.ts +0 -7
  279. package/dist/src/cli/post/unpublish.js +0 -17
  280. package/dist/src/cli/post/update.d.ts +0 -23
  281. package/dist/src/cli/post/update.js +0 -38
  282. package/dist/src/cli/post/view.d.ts +0 -3
  283. package/dist/src/cli/post/view.js +0 -150
  284. package/dist/src/cli/preview/index.d.ts +0 -13
  285. package/dist/src/cli/preview/index.js +0 -226
  286. package/dist/src/cli/profile/index.d.ts +0 -14
  287. package/dist/src/cli/profile/index.js +0 -36
  288. package/dist/src/cli/profile/ls.d.ts +0 -5
  289. package/dist/src/cli/profile/ls.js +0 -26
  290. package/dist/src/cli/profile/mark.d.ts +0 -9
  291. package/dist/src/cli/profile/mark.js +0 -23
  292. package/dist/src/cli/profile/rm.d.ts +0 -12
  293. package/dist/src/cli/profile/rm.js +0 -50
  294. package/dist/src/cli/profile/show.d.ts +0 -9
  295. package/dist/src/cli/profile/show.js +0 -40
  296. package/dist/src/cli/profile/use.d.ts +0 -6
  297. package/dist/src/cli/profile/use.js +0 -11
  298. package/dist/src/cli/profile/view.d.ts +0 -8
  299. package/dist/src/cli/profile/view.js +0 -21
  300. package/dist/src/cli/project/_flags.d.ts +0 -56
  301. package/dist/src/cli/project/_flags.js +0 -130
  302. package/dist/src/cli/project/create.d.ts +0 -17
  303. package/dist/src/cli/project/create.js +0 -25
  304. package/dist/src/cli/project/delete.d.ts +0 -8
  305. package/dist/src/cli/project/delete.js +0 -22
  306. package/dist/src/cli/project/edit.d.ts +0 -11
  307. package/dist/src/cli/project/edit.js +0 -61
  308. package/dist/src/cli/project/get.d.ts +0 -7
  309. package/dist/src/cli/project/get.js +0 -14
  310. package/dist/src/cli/project/index.d.ts +0 -43
  311. package/dist/src/cli/project/index.js +0 -52
  312. package/dist/src/cli/project/list.d.ts +0 -8
  313. package/dist/src/cli/project/list.js +0 -19
  314. package/dist/src/cli/project/update.d.ts +0 -18
  315. package/dist/src/cli/project/update.js +0 -24
  316. package/dist/src/cli/project/view-cmd.d.ts +0 -7
  317. package/dist/src/cli/project/view-cmd.js +0 -15
  318. package/dist/src/cli/project/view.d.ts +0 -3
  319. package/dist/src/cli/project/view.js +0 -102
  320. package/dist/src/cli/render/codehighlight.d.ts +0 -8
  321. package/dist/src/cli/render/codehighlight.js +0 -264
  322. package/dist/src/cli/render/envelope.d.ts +0 -7
  323. package/dist/src/cli/render/envelope.js +0 -23
  324. package/dist/src/cli/render/frontmatter.d.ts +0 -8
  325. package/dist/src/cli/render/frontmatter.js +0 -50
  326. package/dist/src/cli/render/helpers.d.ts +0 -2
  327. package/dist/src/cli/render/helpers.js +0 -11
  328. package/dist/src/cli/render/index.d.ts +0 -7
  329. package/dist/src/cli/render/index.js +0 -10
  330. package/dist/src/cli/render/lexical/blocks.d.ts +0 -19
  331. package/dist/src/cli/render/lexical/blocks.js +0 -208
  332. package/dist/src/cli/render/lexical/code.d.ts +0 -2
  333. package/dist/src/cli/render/lexical/code.js +0 -22
  334. package/dist/src/cli/render/lexical/embeds.d.ts +0 -6
  335. package/dist/src/cli/render/lexical/embeds.js +0 -51
  336. package/dist/src/cli/render/lexical/index.d.ts +0 -9
  337. package/dist/src/cli/render/lexical/index.js +0 -25
  338. package/dist/src/cli/render/lexical/inlines.d.ts +0 -17
  339. package/dist/src/cli/render/lexical/inlines.js +0 -76
  340. package/dist/src/cli/render/lexical/parser.d.ts +0 -10
  341. package/dist/src/cli/render/lexical/parser.js +0 -64
  342. package/dist/src/cli/render/lexical/walker.d.ts +0 -21
  343. package/dist/src/cli/render/lexical/walker.js +0 -51
  344. package/dist/src/cli/render/markdown.d.ts +0 -18
  345. package/dist/src/cli/render/markdown.js +0 -196
  346. package/dist/src/cli/render/metadata-block.d.ts +0 -14
  347. package/dist/src/cli/render/metadata-block.js +0 -50
  348. package/dist/src/cli/skill/all.d.ts +0 -4
  349. package/dist/src/cli/skill/all.js +0 -11
  350. package/dist/src/cli/skill/get.d.ts +0 -6
  351. package/dist/src/cli/skill/get.js +0 -12
  352. package/dist/src/cli/skill/index.d.ts +0 -10
  353. package/dist/src/cli/skill/index.js +0 -34
  354. package/dist/src/cli/skill/list.d.ts +0 -4
  355. package/dist/src/cli/skill/list.js +0 -11
  356. package/dist/src/cli/skill/search.d.ts +0 -6
  357. package/dist/src/cli/skill/search.js +0 -12
  358. package/dist/src/cli/skill/views.d.ts +0 -6
  359. package/dist/src/cli/skill/views.js +0 -90
  360. package/dist/src/cli/snippet/_flags.d.ts +0 -57
  361. package/dist/src/cli/snippet/_flags.js +0 -123
  362. package/dist/src/cli/snippet/_resolve.d.ts +0 -4
  363. package/dist/src/cli/snippet/_resolve.js +0 -32
  364. package/dist/src/cli/snippet/_sync.d.ts +0 -5
  365. package/dist/src/cli/snippet/_sync.js +0 -54
  366. package/dist/src/cli/snippet/create.d.ts +0 -19
  367. package/dist/src/cli/snippet/create.js +0 -35
  368. package/dist/src/cli/snippet/delete.d.ts +0 -8
  369. package/dist/src/cli/snippet/delete.js +0 -28
  370. package/dist/src/cli/snippet/edit.d.ts +0 -7
  371. package/dist/src/cli/snippet/edit.js +0 -29
  372. package/dist/src/cli/snippet/get.d.ts +0 -6
  373. package/dist/src/cli/snippet/get.js +0 -12
  374. package/dist/src/cli/snippet/index.d.ts +0 -43
  375. package/dist/src/cli/snippet/index.js +0 -58
  376. package/dist/src/cli/snippet/list.d.ts +0 -9
  377. package/dist/src/cli/snippet/list.js +0 -20
  378. package/dist/src/cli/snippet/pull.d.ts +0 -8
  379. package/dist/src/cli/snippet/pull.js +0 -33
  380. package/dist/src/cli/snippet/push.d.ts +0 -10
  381. package/dist/src/cli/snippet/push.js +0 -31
  382. package/dist/src/cli/snippet/update.d.ts +0 -8
  383. package/dist/src/cli/snippet/update.js +0 -16
  384. package/dist/src/cli/topic/create.d.ts +0 -10
  385. package/dist/src/cli/topic/create.js +0 -24
  386. package/dist/src/cli/topic/delete.d.ts +0 -7
  387. package/dist/src/cli/topic/delete.js +0 -37
  388. package/dist/src/cli/topic/get.d.ts +0 -6
  389. package/dist/src/cli/topic/get.js +0 -15
  390. package/dist/src/cli/topic/index.d.ts +0 -20
  391. package/dist/src/cli/topic/index.js +0 -32
  392. package/dist/src/cli/topic/list.d.ts +0 -4
  393. package/dist/src/cli/topic/list.js +0 -10
  394. package/dist/src/cli/topic/update.d.ts +0 -11
  395. package/dist/src/cli/topic/update.js +0 -51
  396. package/dist/src/cli/ui/index.d.ts +0 -24
  397. package/dist/src/cli/ui/index.js +0 -83
  398. package/dist/src/cli/update/index.d.ts +0 -10
  399. package/dist/src/cli/update/index.js +0 -142
  400. package/dist/src/domain/admin-link.d.ts +0 -12
  401. package/dist/src/domain/admin-link.js +0 -45
  402. package/dist/src/domain/content-spec.d.ts +0 -20
  403. package/dist/src/domain/content-spec.js +0 -78
  404. package/dist/src/domain/envelope-compat.d.ts +0 -68
  405. package/dist/src/domain/envelope-compat.js +0 -121
  406. package/dist/src/domain/envelope.d.ts +0 -34
  407. package/dist/src/domain/envelope.js +0 -355
  408. package/dist/src/domain/errors.d.ts +0 -336
  409. package/dist/src/domain/errors.js +0 -239
  410. package/dist/src/domain/gate.d.ts +0 -14
  411. package/dist/src/domain/gate.js +0 -18
  412. package/dist/src/domain/payload.d.ts +0 -64
  413. package/dist/src/domain/payload.js +0 -237
  414. package/dist/src/domain/preflight-guards.d.ts +0 -54
  415. package/dist/src/domain/preflight-guards.js +0 -130
  416. package/dist/src/domain/runtime-flags.d.ts +0 -33
  417. package/dist/src/domain/runtime-flags.js +0 -166
  418. package/dist/src/domain/schema/api-envelope.d.ts +0 -67
  419. package/dist/src/domain/schema/api-envelope.js +0 -65
  420. package/dist/src/domain/schema/category.d.ts +0 -23
  421. package/dist/src/domain/schema/category.js +0 -19
  422. package/dist/src/domain/schema/config.d.ts +0 -13
  423. package/dist/src/domain/schema/config.js +0 -18
  424. package/dist/src/domain/schema/note.d.ts +0 -76
  425. package/dist/src/domain/schema/note.js +0 -35
  426. package/dist/src/domain/schema/page.d.ts +0 -40
  427. package/dist/src/domain/schema/page.js +0 -22
  428. package/dist/src/domain/schema/post.d.ts +0 -68
  429. package/dist/src/domain/schema/post.js +0 -35
  430. package/dist/src/domain/schema/profile.d.ts +0 -14
  431. package/dist/src/domain/schema/profile.js +0 -22
  432. package/dist/src/domain/schema/topic.d.ts +0 -24
  433. package/dist/src/domain/schema/topic.js +0 -16
  434. package/dist/src/domain/version.d.ts +0 -15
  435. package/dist/src/domain/version.js +0 -43
  436. package/dist/src/index.d.ts +0 -4
  437. package/dist/src/index.js +0 -8
  438. package/dist/src/layers/App.d.ts +0 -30
  439. package/dist/src/layers/App.js +0 -39
  440. package/dist/src/services/Ai/index.d.ts +0 -13
  441. package/dist/src/services/Ai/index.js +0 -127
  442. package/dist/src/services/Ai/overview.d.ts +0 -7
  443. package/dist/src/services/Ai/overview.js +0 -11
  444. package/dist/src/services/Ai/resources.d.ts +0 -7
  445. package/dist/src/services/Ai/resources.js +0 -59
  446. package/dist/src/services/Ai/shared.d.ts +0 -2
  447. package/dist/src/services/Ai/shared.js +0 -11
  448. package/dist/src/services/Ai/tasks.d.ts +0 -8
  449. package/dist/src/services/Ai/tasks.js +0 -144
  450. package/dist/src/services/Ai/types.d.ts +0 -130
  451. package/dist/src/services/Ai/types.js +0 -1
  452. package/dist/src/services/Api.d.ts +0 -67
  453. package/dist/src/services/Api.js +0 -348
  454. package/dist/src/services/Auth.d.ts +0 -101
  455. package/dist/src/services/Auth.js +0 -402
  456. package/dist/src/services/Backup.d.ts +0 -8
  457. package/dist/src/services/Backup.js +0 -4
  458. package/dist/src/services/Cache.d.ts +0 -8
  459. package/dist/src/services/Cache.js +0 -4
  460. package/dist/src/services/Comment.d.ts +0 -48
  461. package/dist/src/services/Comment.js +0 -102
  462. package/dist/src/services/Config.d.ts +0 -95
  463. package/dist/src/services/Config.js +0 -359
  464. package/dist/src/services/Editor.d.ts +0 -28
  465. package/dist/src/services/Editor.js +0 -95
  466. package/dist/src/services/Lexical.d.ts +0 -27
  467. package/dist/src/services/Lexical.js +0 -56
  468. package/dist/src/services/Migration.d.ts +0 -31
  469. package/dist/src/services/Migration.js +0 -177
  470. package/dist/src/services/Profile.d.ts +0 -29
  471. package/dist/src/services/Profile.js +0 -115
  472. package/dist/src/services/Renderer/content.d.ts +0 -16
  473. package/dist/src/services/Renderer/content.js +0 -110
  474. package/dist/src/services/Renderer/datetime.d.ts +0 -38
  475. package/dist/src/services/Renderer/datetime.js +0 -147
  476. package/dist/src/services/Renderer/errors.d.ts +0 -3
  477. package/dist/src/services/Renderer/errors.js +0 -59
  478. package/dist/src/services/Renderer/index.d.ts +0 -13
  479. package/dist/src/services/Renderer/index.js +0 -11
  480. package/dist/src/services/Renderer/lists.d.ts +0 -1
  481. package/dist/src/services/Renderer/lists.js +0 -101
  482. package/dist/src/services/Renderer/options.d.ts +0 -10
  483. package/dist/src/services/Renderer/options.js +0 -13
  484. package/dist/src/services/Renderer/primitives.d.ts +0 -4
  485. package/dist/src/services/Renderer/primitives.js +0 -12
  486. package/dist/src/services/Renderer/service.d.ts +0 -35
  487. package/dist/src/services/Renderer/service.js +0 -123
  488. package/dist/src/services/Renderer/view.d.ts +0 -16
  489. package/dist/src/services/Renderer/view.js +0 -1
  490. package/dist/src/services/Resolver.d.ts +0 -47
  491. package/dist/src/services/Resolver.js +0 -269
  492. package/dist/src/services/Skill.d.ts +0 -29
  493. package/dist/src/services/Skill.js +0 -421
  494. package/dist/src/services/UpdateNotifier.d.ts +0 -162
  495. package/dist/src/services/UpdateNotifier.js +0 -572
  496. package/dist/test/cli/ai/ai.test.d.ts +0 -1
  497. package/dist/test/cli/ai/ai.test.js +0 -507
  498. package/dist/test/cli/ai/verbs.test.d.ts +0 -1
  499. package/dist/test/cli/ai/verbs.test.js +0 -235
  500. package/dist/test/cli/auth/login.test.d.ts +0 -1
  501. package/dist/test/cli/auth/login.test.js +0 -236
  502. package/dist/test/cli/auth/logout-whoami.test.d.ts +0 -1
  503. package/dist/test/cli/auth/logout-whoami.test.js +0 -124
  504. package/dist/test/cli/auth/status.test.d.ts +0 -1
  505. package/dist/test/cli/auth/status.test.js +0 -90
  506. package/dist/test/cli/category/category.test.d.ts +0 -1
  507. package/dist/test/cli/category/category.test.js +0 -175
  508. package/dist/test/cli/comment/comment.test.d.ts +0 -1
  509. package/dist/test/cli/comment/comment.test.js +0 -445
  510. package/dist/test/cli/config/config.test.d.ts +0 -1
  511. package/dist/test/cli/config/config.test.js +0 -281
  512. package/dist/test/cli/edit-roundtrip.test.d.ts +0 -1
  513. package/dist/test/cli/edit-roundtrip.test.js +0 -259
  514. package/dist/test/cli/file/file.test.d.ts +0 -1
  515. package/dist/test/cli/file/file.test.js +0 -185
  516. package/dist/test/cli/help.test.d.ts +0 -1
  517. package/dist/test/cli/help.test.js +0 -289
  518. package/dist/test/cli/note/create.test.d.ts +0 -1
  519. package/dist/test/cli/note/create.test.js +0 -155
  520. package/dist/test/cli/note/list.test.d.ts +0 -1
  521. package/dist/test/cli/note/list.test.js +0 -115
  522. package/dist/test/cli/note/publish.test.d.ts +0 -1
  523. package/dist/test/cli/note/publish.test.js +0 -123
  524. package/dist/test/cli/page/page.test.d.ts +0 -1
  525. package/dist/test/cli/page/page.test.js +0 -185
  526. package/dist/test/cli/post/create.test.d.ts +0 -1
  527. package/dist/test/cli/post/create.test.js +0 -172
  528. package/dist/test/cli/post/list.test.d.ts +0 -1
  529. package/dist/test/cli/post/list.test.js +0 -133
  530. package/dist/test/cli/post/publish.test.d.ts +0 -1
  531. package/dist/test/cli/post/publish.test.js +0 -139
  532. package/dist/test/cli/post/stage-apply.test.d.ts +0 -1
  533. package/dist/test/cli/post/stage-apply.test.js +0 -215
  534. package/dist/test/cli/post/update.test.d.ts +0 -1
  535. package/dist/test/cli/post/update.test.js +0 -160
  536. package/dist/test/cli/post-note-crud.test.d.ts +0 -1
  537. package/dist/test/cli/post-note-crud.test.js +0 -362
  538. package/dist/test/cli/profile/ls.test.d.ts +0 -1
  539. package/dist/test/cli/profile/ls.test.js +0 -93
  540. package/dist/test/cli/profile/mark-use.test.d.ts +0 -1
  541. package/dist/test/cli/profile/mark-use.test.js +0 -216
  542. package/dist/test/cli/project-crud.test.d.ts +0 -1
  543. package/dist/test/cli/project-crud.test.js +0 -315
  544. package/dist/test/cli/render/lexical.test.d.ts +0 -1
  545. package/dist/test/cli/render/lexical.test.js +0 -216
  546. package/dist/test/cli/render/markdown.test.d.ts +0 -1
  547. package/dist/test/cli/render/markdown.test.js +0 -39
  548. package/dist/test/cli/snippet-crud.test.d.ts +0 -1
  549. package/dist/test/cli/snippet-crud.test.js +0 -293
  550. package/dist/test/cli/topic/topic.test.d.ts +0 -1
  551. package/dist/test/cli/topic/topic.test.js +0 -181
  552. package/dist/test/cli/update.test.d.ts +0 -1
  553. package/dist/test/cli/update.test.js +0 -395
  554. package/dist/test/domain/content-spec.test.d.ts +0 -1
  555. package/dist/test/domain/content-spec.test.js +0 -126
  556. package/dist/test/domain/envelope-compat.test.d.ts +0 -1
  557. package/dist/test/domain/envelope-compat.test.js +0 -126
  558. package/dist/test/domain/envelope.test.d.ts +0 -1
  559. package/dist/test/domain/envelope.test.js +0 -149
  560. package/dist/test/domain/errors.test.d.ts +0 -1
  561. package/dist/test/domain/errors.test.js +0 -127
  562. package/dist/test/domain/gate.test.d.ts +0 -1
  563. package/dist/test/domain/gate.test.js +0 -128
  564. package/dist/test/domain/payload.test.d.ts +0 -1
  565. package/dist/test/domain/payload.test.js +0 -259
  566. package/dist/test/helper/test-fs.d.ts +0 -24
  567. package/dist/test/helper/test-fs.js +0 -161
  568. package/dist/test/helper/test-http.d.ts +0 -31
  569. package/dist/test/helper/test-http.js +0 -66
  570. package/dist/test/integration/_helpers.d.ts +0 -5
  571. package/dist/test/integration/_helpers.js +0 -24
  572. package/dist/test/integration/cli-error-envelope.test.d.ts +0 -1
  573. package/dist/test/integration/cli-error-envelope.test.js +0 -137
  574. package/dist/test/integration/cli-help-render.test.d.ts +0 -1
  575. package/dist/test/integration/cli-help-render.test.js +0 -149
  576. package/dist/test/integration/cli-help.test.d.ts +0 -1
  577. package/dist/test/integration/cli-help.test.js +0 -67
  578. package/dist/test/integration/cli-post-list.test.d.ts +0 -1
  579. package/dist/test/integration/cli-post-list.test.js +0 -140
  580. package/dist/test/integration/cli-skill.test.d.ts +0 -1
  581. package/dist/test/integration/cli-skill.test.js +0 -74
  582. package/dist/test/integration/cli-version.test.d.ts +0 -1
  583. package/dist/test/integration/cli-version.test.js +0 -37
  584. package/dist/test/services/Api.test.d.ts +0 -1
  585. package/dist/test/services/Api.test.js +0 -553
  586. package/dist/test/services/Auth.test.d.ts +0 -1
  587. package/dist/test/services/Auth.test.js +0 -650
  588. package/dist/test/services/Config.test.d.ts +0 -1
  589. package/dist/test/services/Config.test.js +0 -510
  590. package/dist/test/services/Datetime.test.d.ts +0 -1
  591. package/dist/test/services/Datetime.test.js +0 -113
  592. package/dist/test/services/Editor.test.d.ts +0 -1
  593. package/dist/test/services/Editor.test.js +0 -205
  594. package/dist/test/services/Lexical.errors.test.d.ts +0 -1
  595. package/dist/test/services/Lexical.errors.test.js +0 -60
  596. package/dist/test/services/Lexical.test.d.ts +0 -1
  597. package/dist/test/services/Lexical.test.js +0 -68
  598. package/dist/test/services/Migration.test.d.ts +0 -1
  599. package/dist/test/services/Migration.test.js +0 -376
  600. package/dist/test/services/Profile.test.d.ts +0 -1
  601. package/dist/test/services/Profile.test.js +0 -277
  602. package/dist/test/services/Renderer.test.d.ts +0 -1
  603. package/dist/test/services/Renderer.test.js +0 -538
  604. package/dist/test/services/Resolver.test.d.ts +0 -1
  605. package/dist/test/services/Resolver.test.js +0 -320
  606. package/dist/test/services/Skill.test.d.ts +0 -1
  607. package/dist/test/services/Skill.test.js +0 -261
  608. package/dist/test/services/UpdateNotifier.spawn.test.d.ts +0 -1
  609. package/dist/test/services/UpdateNotifier.spawn.test.js +0 -73
  610. package/dist/test/services/UpdateNotifier.test.d.ts +0 -1
  611. package/dist/test/services/UpdateNotifier.test.js +0 -912
@@ -1,510 +0,0 @@
1
- import { FileSystem } from '@effect/platform';
2
- import { it } from '@effect/vitest';
3
- import { Effect, Exit, Layer } from 'effect';
4
- import { afterEach, beforeEach, describe, expect } from 'vitest';
5
- import { Config, LOCAL_DEV_ENV, LOCAL_DEV_PROFILE_NAME, normalizeApiUrl, parseApiUrl, shouldUseLocalDev, stripLegacyConfigFields, } from '../../src/services/Config';
6
- import { makeMemFs, TestFsLive, TestPathLive } from '../helper/test-fs';
7
- // Each test gets its own in-memory FS + Config layer.
8
- const makeLayer = () => {
9
- const mem = makeMemFs();
10
- const fsLayer = TestFsLive(mem);
11
- const baseLayer = Layer.merge(fsLayer, TestPathLive);
12
- const configLayer = Config.Default.pipe(Layer.provide(baseLayer));
13
- return { mem, layer: Layer.merge(baseLayer, configLayer) };
14
- };
15
- const makeLayerWithFs = (overrides) => {
16
- const fsLayer = FileSystem.layerNoop(overrides);
17
- const baseLayer = Layer.merge(fsLayer, TestPathLive);
18
- const configLayer = Config.Default.pipe(Layer.provide(baseLayer));
19
- return Layer.merge(baseLayer, configLayer);
20
- };
21
- const expectConfigFailure = async (effect) => {
22
- const exit = await Effect.runPromiseExit(effect);
23
- expect(Exit.isFailure(exit)).toBe(true);
24
- };
25
- const failFs = (message) => Effect.fail(new Error(message));
26
- beforeEach(() => {
27
- process.env.XDG_CONFIG_HOME = '/xdg';
28
- delete process.env.MXS_API_URL;
29
- delete process.env.MXS_TOKEN;
30
- delete process.env.MXS_API_KEY;
31
- delete process.env.MXS_PROFILE;
32
- delete process.env.MXS_CLI_LOCAL_DEV;
33
- delete process.env.MXS_CLI_LOCAL_DEV_API_URL;
34
- });
35
- afterEach(() => {
36
- delete process.env.XDG_CONFIG_HOME;
37
- delete process.env.MXS_API_URL;
38
- delete process.env.MXS_TOKEN;
39
- delete process.env.MXS_API_KEY;
40
- delete process.env.MXS_PROFILE;
41
- delete process.env.MXS_CLI_LOCAL_DEV;
42
- delete process.env.MXS_CLI_LOCAL_DEV_API_URL;
43
- });
44
- describe('pure helpers', () => {
45
- it.effect('normalizeApiUrl strips trailing slash', () => Effect.gen(function* () {
46
- const out = yield* normalizeApiUrl('https://blog.example.com/');
47
- expect(out).toBe('https://blog.example.com');
48
- }));
49
- it.effect('normalizeApiUrl adds https for remote hosts', () => Effect.gen(function* () {
50
- const out = yield* normalizeApiUrl('blog.example.com');
51
- expect(out).toBe('https://blog.example.com');
52
- }));
53
- it.effect('normalizeApiUrl adds http for localhost', () => Effect.gen(function* () {
54
- const out = yield* normalizeApiUrl('localhost:3000');
55
- expect(out).toBe('http://localhost:3000');
56
- }));
57
- it.effect('parseApiUrl rejects blank input and supports 127.0.0.1', () => Effect.gen(function* () {
58
- const err = yield* Effect.flip(parseApiUrl(' '));
59
- expect(err._tag).toBe('ConfigMissingApiUrl');
60
- const local = yield* normalizeApiUrl('127.0.0.1:2333');
61
- expect(local).toBe('http://127.0.0.1:2333');
62
- }));
63
- it.effect('parseApiUrl extracts api version from path', () => Effect.gen(function* () {
64
- const out = yield* parseApiUrl('https://x.example.com/api/v3');
65
- expect(out.baseUrl).toBe('https://x.example.com');
66
- expect(out.apiVersion).toBe(3);
67
- }));
68
- it.effect('parseApiUrl strips a bare /api suffix', () => Effect.gen(function* () {
69
- const out = yield* parseApiUrl('https://x.example.com/api');
70
- expect(out.baseUrl).toBe('https://x.example.com');
71
- expect(out.apiVersion).toBeUndefined();
72
- const trailing = yield* parseApiUrl('https://x.example.com/api/');
73
- expect(trailing.baseUrl).toBe('https://x.example.com');
74
- }));
75
- it('stripLegacyConfigFields removes legacy keys', () => {
76
- expect(stripLegacyConfigFields({
77
- api_url: 'x',
78
- api_base: 'y',
79
- auth_base: 'z',
80
- client_id: 'c',
81
- })).toEqual({ api_url: 'x' });
82
- });
83
- it('shouldUseLocalDev requires the env flag', () => {
84
- expect(shouldUseLocalDev({})).toBe(false);
85
- process.env[LOCAL_DEV_ENV] = '1';
86
- expect(shouldUseLocalDev({})).toBe(true);
87
- expect(shouldUseLocalDev({ envProfile: 'dev' })).toBe(false);
88
- expect(shouldUseLocalDev({ profileOverride: 'dev' })).toBe(false);
89
- expect(shouldUseLocalDev({ envApiUrl: 'http://x' })).toBe(false);
90
- expect(shouldUseLocalDev({ apiUrlOverride: 'http://x' })).toBe(false);
91
- });
92
- it('reads the local-dev API URL override from env', async () => {
93
- process.env.MXS_CLI_LOCAL_DEV_API_URL = 'http://localhost:4000';
94
- const { getLocalDevApiUrl } = await import('../../src/services/Config');
95
- expect(getLocalDevApiUrl()).toBe('http://localhost:4000');
96
- });
97
- });
98
- describe('Config — profile config IO', () => {
99
- it('round-trips profile config', async () => {
100
- const { mem, layer } = makeLayer();
101
- const result = await Effect.runPromise(Effect.gen(function* () {
102
- const config = yield* Config;
103
- yield* config.writeProfileConfig('dev', {
104
- api_url: 'https://dev.example.com',
105
- api_version: 2,
106
- });
107
- return yield* config.readProfileConfig('dev');
108
- }).pipe(Effect.provide(layer)));
109
- expect(result.api_url).toBe('https://dev.example.com');
110
- expect(result.api_version).toBe(2);
111
- expect(mem.mode('/xdg/mxs/profiles/dev/config.json')).toBe(0o644);
112
- expect(mem.mode('/xdg/mxs/profiles/dev')).toBe(0o700);
113
- });
114
- it('returns empty object when config absent', async () => {
115
- const { layer } = makeLayer();
116
- const result = await Effect.runPromise(Effect.gen(function* () {
117
- const config = yield* Config;
118
- return yield* config.readProfileConfig('ghost');
119
- }).pipe(Effect.provide(layer)));
120
- expect(result).toEqual({});
121
- });
122
- it('strips legacy config fields on read', async () => {
123
- const { mem, layer } = makeLayer();
124
- mem.seed('/xdg/mxs/profiles/old/config.json', JSON.stringify({
125
- api_url: 'https://x.example.com',
126
- api_base: 'should-be-stripped',
127
- client_id: 'old',
128
- }));
129
- const result = await Effect.runPromise(Effect.gen(function* () {
130
- const config = yield* Config;
131
- return yield* config.readProfileConfig('old');
132
- }).pipe(Effect.provide(layer)));
133
- expect(result).toEqual({ api_url: 'https://x.example.com' });
134
- });
135
- it('updates profile config and reports malformed JSON', async () => {
136
- const { mem, layer } = makeLayer();
137
- const result = await Effect.runPromise(Effect.gen(function* () {
138
- const config = yield* Config;
139
- yield* config.writeProfileConfig('dev', {
140
- api_url: 'https://dev.example.com',
141
- });
142
- return yield* config.updateProfileConfig('dev', (prev) => ({
143
- ...prev,
144
- production: true,
145
- }));
146
- }).pipe(Effect.provide(layer)));
147
- expect(result.production).toBe(true);
148
- mem.seed('/xdg/mxs/profiles/bad/config.json', '{');
149
- const exit = await Effect.runPromiseExit(Effect.gen(function* () {
150
- const config = yield* Config;
151
- return yield* config.readProfileConfig('bad');
152
- }).pipe(Effect.provide(layer)));
153
- expect(Exit.isFailure(exit)).toBe(true);
154
- });
155
- it('maps profile config filesystem failures to Generic', async () => {
156
- await expectConfigFailure(Effect.gen(function* () {
157
- const config = yield* Config;
158
- return yield* config.readProfileConfig('dev');
159
- }).pipe(Effect.provide(makeLayerWithFs({
160
- readFileString: () => failFs('read failed'),
161
- }))));
162
- await expectConfigFailure(Effect.gen(function* () {
163
- const config = yield* Config;
164
- return yield* config.writeProfileConfig('dev', {});
165
- }).pipe(Effect.provide(makeLayerWithFs({
166
- makeDirectory: () => failFs('mkdir failed'),
167
- }))));
168
- await expectConfigFailure(Effect.gen(function* () {
169
- const config = yield* Config;
170
- return yield* config.writeProfileConfig('dev', {});
171
- }).pipe(Effect.provide(makeLayerWithFs({
172
- makeDirectory: () => Effect.void,
173
- writeFileString: () => failFs('write failed'),
174
- }))));
175
- });
176
- });
177
- describe('Config — credentials IO', () => {
178
- it('round-trips credentials with mode 0600', async () => {
179
- const { mem, layer } = makeLayer();
180
- const result = await Effect.runPromise(Effect.gen(function* () {
181
- const config = yield* Config;
182
- yield* config.writeProfileCredentials('dev', {
183
- access_token: 'tok-abc',
184
- expires_at: 100,
185
- });
186
- return yield* config.readProfileCredentials('dev');
187
- }).pipe(Effect.provide(layer)));
188
- expect(result?.access_token).toBe('tok-abc');
189
- expect(mem.mode('/xdg/mxs/profiles/dev/credentials.json')).toBe(0o600);
190
- });
191
- it('returns null when credentials missing', async () => {
192
- const { layer } = makeLayer();
193
- const result = await Effect.runPromise(Effect.gen(function* () {
194
- const config = yield* Config;
195
- return yield* config.readProfileCredentials('ghost');
196
- }).pipe(Effect.provide(layer)));
197
- expect(result).toBeNull();
198
- });
199
- it('deleteProfileCredentials is idempotent when absent', async () => {
200
- const { layer } = makeLayer();
201
- await Effect.runPromise(Effect.gen(function* () {
202
- const config = yield* Config;
203
- yield* config.deleteProfileCredentials('ghost');
204
- }).pipe(Effect.provide(layer)));
205
- });
206
- it('fixes loose credentials file mode on read and deletes present credentials', async () => {
207
- const { mem, layer } = makeLayer();
208
- mem.seed('/xdg/mxs/profiles/dev/credentials.json', JSON.stringify({ access_token: 'tok', expires_at: 1 }), 0o644);
209
- const stderr = [];
210
- const descriptor = process.stderr.write;
211
- process.stderr.write = (chunk) => {
212
- stderr.push(String(chunk));
213
- return true;
214
- };
215
- try {
216
- const result = await Effect.runPromise(Effect.gen(function* () {
217
- const config = yield* Config;
218
- const creds = yield* config.readProfileCredentials('dev');
219
- yield* config.deleteProfileCredentials('dev');
220
- return creds;
221
- }).pipe(Effect.provide(layer)));
222
- expect(result?.access_token).toBe('tok');
223
- expect(mem.mode('/xdg/mxs/profiles/dev/credentials.json')).toBeNull();
224
- expect(stderr.join('')).toContain('chmod 600');
225
- }
226
- finally {
227
- process.stderr.write = descriptor;
228
- }
229
- });
230
- it('maps credential removal failures to Generic', async () => {
231
- await expectConfigFailure(Effect.gen(function* () {
232
- const config = yield* Config;
233
- return yield* config.deleteProfileCredentials('dev');
234
- }).pipe(Effect.provide(makeLayerWithFs({
235
- remove: () => failFs('remove failed'),
236
- }))));
237
- });
238
- });
239
- describe('Config — pointers, legacy files, and profile listing', () => {
240
- it('exposes derived paths, current pointer, legacy files, and profile listing', async () => {
241
- const { mem, layer } = makeLayer();
242
- mem.seed('/xdg/mxs/config.json', '{"api_url":"https://legacy.example.com","api_base":"old"}');
243
- mem.seed('/xdg/mxs/credentials.json', '{"access_token":"legacy","expires_at":1}');
244
- mem.seed('/xdg/mxs/profiles/.hidden/config.json', '{}');
245
- mem.seed('/xdg/mxs/profiles/file.txt', 'not a directory');
246
- await Effect.runPromise(Effect.gen(function* () {
247
- const config = yield* Config;
248
- expect(yield* config.getConfigDir).toBe('/xdg/mxs');
249
- expect(yield* config.getProfilesDir).toBe('/xdg/mxs/profiles');
250
- expect(yield* config.getProfileDir('dev')).toBe('/xdg/mxs/profiles/dev');
251
- expect(yield* config.getProfileConfigPath('dev')).toBe('/xdg/mxs/profiles/dev/config.json');
252
- expect(yield* config.getProfileCredentialsPath('dev')).toBe('/xdg/mxs/profiles/dev/credentials.json');
253
- expect(yield* config.getCurrentPath).toBe('/xdg/mxs/current');
254
- expect(yield* config.getLegacyConfigPath).toBe('/xdg/mxs/config.json');
255
- expect(yield* config.getLegacyCredentialsPath).toBe('/xdg/mxs/credentials.json');
256
- yield* config.writeProfileConfig('dev', { api_url: 'https://dev.example.com' });
257
- yield* config.writeProfileConfig('prod', { api_url: 'https://prod.example.com' });
258
- expect(yield* config.listProfileDirs).toEqual(['dev', 'prod']);
259
- expect(yield* config.profileExists('dev')).toBe(true);
260
- expect(yield* config.profileExists('ghost')).toBe(false);
261
- yield* config.writeCurrent('prod');
262
- expect(yield* config.readCurrent).toBe('prod');
263
- mem.seed('/xdg/mxs/current', ' \n');
264
- expect(yield* config.readCurrent).toBeNull();
265
- expect(yield* config.readLegacyConfig).toEqual({
266
- api_url: 'https://legacy.example.com',
267
- });
268
- expect(yield* config.readLegacyConfigRaw).toMatchObject({
269
- api_url: 'https://legacy.example.com',
270
- });
271
- expect(yield* config.readLegacyCredentialsRaw).toMatchObject({
272
- access_token: 'legacy',
273
- });
274
- yield* config.deleteLegacyConfig;
275
- yield* config.deleteLegacyCredentials;
276
- yield* config.removeProfileDir('prod');
277
- expect(yield* config.profileExists('prod')).toBe(false);
278
- }).pipe(Effect.provide(layer)));
279
- });
280
- it('maps pointer and profile-listing filesystem failures to Generic', async () => {
281
- await expectConfigFailure(Effect.gen(function* () {
282
- const config = yield* Config;
283
- return yield* config.writeCurrent('dev');
284
- }).pipe(Effect.provide(makeLayerWithFs({
285
- makeDirectory: () => failFs('mkdir failed'),
286
- }))));
287
- await expectConfigFailure(Effect.gen(function* () {
288
- const config = yield* Config;
289
- return yield* config.writeCurrent('dev');
290
- }).pipe(Effect.provide(makeLayerWithFs({
291
- makeDirectory: () => Effect.void,
292
- writeFileString: () => failFs('write failed'),
293
- }))));
294
- await expectConfigFailure(Effect.gen(function* () {
295
- const config = yield* Config;
296
- return yield* config.listProfileDirs;
297
- }).pipe(Effect.provide(makeLayerWithFs({
298
- readDirectory: () => failFs('list failed'),
299
- }))));
300
- await expectConfigFailure(Effect.gen(function* () {
301
- const config = yield* Config;
302
- return yield* config.profileExists('dev');
303
- }).pipe(Effect.provide(makeLayerWithFs({
304
- stat: () => failFs('stat failed'),
305
- }))));
306
- await expectConfigFailure(Effect.gen(function* () {
307
- const config = yield* Config;
308
- return yield* config.removeProfileDir('dev');
309
- }).pipe(Effect.provide(makeLayerWithFs({
310
- remove: () => failFs('remove failed'),
311
- }))));
312
- });
313
- });
314
- describe('Config.resolve — no profile configured', () => {
315
- it('fails when api_url missing and no profile', async () => {
316
- const { layer } = makeLayer();
317
- const exit = await Effect.runPromiseExit(Effect.gen(function* () {
318
- const config = yield* Config;
319
- return yield* config.resolve();
320
- }).pipe(Effect.provide(layer)));
321
- expect(Exit.isFailure(exit)).toBe(true);
322
- if (Exit.isFailure(exit)) {
323
- const err = exit.cause.error ?? exit.cause;
324
- const tag = (err && err._tag) || (err && err.failure && err.failure._tag);
325
- expect(['ConfigMissingApiUrl']).toContain(tag ?? err.error?._tag ?? 'unknown');
326
- }
327
- });
328
- it('uses the virtual local-dev profile when dev default is enabled', async () => {
329
- process.env[LOCAL_DEV_ENV] = '1';
330
- const { layer } = makeLayer();
331
- const r = await Effect.runPromise(Effect.gen(function* () {
332
- const config = yield* Config;
333
- return yield* config.resolve();
334
- }).pipe(Effect.provide(layer)));
335
- expect(r.apiUrl).toBe('http://localhost:2333');
336
- expect(r.apiBase).toBe('http://localhost:2333');
337
- expect(r.authBase).toBe('http://localhost:2333/auth');
338
- expect(r.profileName).toBe(LOCAL_DEV_PROFILE_NAME);
339
- expect(r.isProduction).toBe(false);
340
- expect(r.urlOverridden).toBe(false);
341
- });
342
- it('lets explicit URLs override the virtual local-dev profile', async () => {
343
- process.env[LOCAL_DEV_ENV] = '1';
344
- process.env.MXS_API_URL = 'https://x.example.com';
345
- const { layer } = makeLayer();
346
- const r = await Effect.runPromise(Effect.gen(function* () {
347
- const config = yield* Config;
348
- return yield* config.resolve();
349
- }).pipe(Effect.provide(layer)));
350
- expect(r.apiUrl).toBe('https://x.example.com');
351
- expect(r.apiBase).toBe('https://x.example.com/api/v2');
352
- expect(r.profileName).toBeNull();
353
- expect(r.urlOverridden).toBe(true);
354
- });
355
- it('reads MXS_API_URL env', async () => {
356
- process.env.MXS_API_URL = 'https://x.example.com';
357
- const { layer } = makeLayer();
358
- const r = await Effect.runPromise(Effect.gen(function* () {
359
- const config = yield* Config;
360
- return yield* config.resolve();
361
- }).pipe(Effect.provide(layer)));
362
- expect(r.apiUrl).toBe('https://x.example.com');
363
- expect(r.apiBase).toBe('https://x.example.com/api/v2');
364
- expect(r.urlOverridden).toBe(true);
365
- expect(r.profileExplicit).toBe(false);
366
- });
367
- it('respects --api-url flag override over env', async () => {
368
- process.env.MXS_API_URL = 'https://env.example.com';
369
- const { layer } = makeLayer();
370
- const r = await Effect.runPromise(Effect.gen(function* () {
371
- const config = yield* Config;
372
- return yield* config.resolve({ apiUrl: 'https://flag.example.com' });
373
- }).pipe(Effect.provide(layer)));
374
- expect(r.apiUrl).toBe('https://flag.example.com');
375
- expect(r.urlOverridden).toBe(true);
376
- });
377
- it('reads token from MXS_TOKEN env', async () => {
378
- process.env.MXS_API_URL = 'https://x.example.com';
379
- process.env.MXS_TOKEN = 'abc';
380
- const { layer } = makeLayer();
381
- const r = await Effect.runPromise(Effect.gen(function* () {
382
- const config = yield* Config;
383
- return yield* config.resolve();
384
- }).pipe(Effect.provide(layer)));
385
- expect(r.token).toBe('abc');
386
- });
387
- it('reads api key from MXS_API_KEY env, with flag override', async () => {
388
- process.env.MXS_API_URL = 'https://x.example.com';
389
- process.env.MXS_API_KEY = 'txo-env';
390
- const { layer } = makeLayer();
391
- const r = await Effect.runPromise(Effect.gen(function* () {
392
- const config = yield* Config;
393
- return yield* config.resolve({ apiKey: 'txo-flag' });
394
- }).pipe(Effect.provide(layer)));
395
- expect(r.apiKey).toBe('txo-flag');
396
- });
397
- });
398
- describe('Config.resolve — profile-aware resolution', () => {
399
- it('reads api_url from active profile via MXS_PROFILE', async () => {
400
- const { layer } = makeLayer();
401
- const r = await Effect.runPromise(Effect.gen(function* () {
402
- const config = yield* Config;
403
- yield* config.writeProfileConfig('dev', {
404
- api_url: 'https://dev.example.com',
405
- });
406
- process.env.MXS_PROFILE = 'dev';
407
- return yield* config.resolve();
408
- }).pipe(Effect.provide(layer)));
409
- expect(r.apiUrl).toBe('https://dev.example.com');
410
- expect(r.profileName).toBe('dev');
411
- expect(r.profileExplicit).toBe(true);
412
- expect(r.urlOverridden).toBe(false);
413
- });
414
- it('reads api_url from current pointer', async () => {
415
- const { mem, layer } = makeLayer();
416
- mem.seed('/xdg/mxs/current', 'prod\n');
417
- const r = await Effect.runPromise(Effect.gen(function* () {
418
- const config = yield* Config;
419
- yield* config.writeProfileConfig('prod', {
420
- api_url: 'https://prod.example.com',
421
- production: true,
422
- });
423
- return yield* config.resolve();
424
- }).pipe(Effect.provide(layer)));
425
- expect(r.profileName).toBe('prod');
426
- expect(r.apiUrl).toBe('https://prod.example.com');
427
- expect(r.isProduction).toBe(true);
428
- expect(r.profileExplicit).toBe(false);
429
- });
430
- it('flag override > env > current pointer', async () => {
431
- const { mem, layer } = makeLayer();
432
- mem.seed('/xdg/mxs/current', 'file-profile\n');
433
- process.env.MXS_PROFILE = 'env-profile';
434
- const r = await Effect.runPromise(Effect.gen(function* () {
435
- const config = yield* Config;
436
- yield* config.writeProfileConfig('flag-profile', {
437
- api_url: 'https://flag.example.com',
438
- });
439
- yield* config.writeProfileConfig('env-profile', {
440
- api_url: 'https://env.example.com',
441
- });
442
- yield* config.writeProfileConfig('file-profile', {
443
- api_url: 'https://file.example.com',
444
- });
445
- return yield* config.resolve({ profile: 'flag-profile' });
446
- }).pipe(Effect.provide(layer)));
447
- expect(r.profileName).toBe('flag-profile');
448
- expect(r.apiUrl).toBe('https://flag.example.com');
449
- });
450
- it('token comes from profile credentials when no url override', async () => {
451
- const { layer } = makeLayer();
452
- process.env.MXS_PROFILE = 'dev';
453
- const r = await Effect.runPromise(Effect.gen(function* () {
454
- const config = yield* Config;
455
- yield* config.writeProfileConfig('dev', {
456
- api_url: 'https://dev.example.com',
457
- });
458
- yield* config.writeProfileCredentials('dev', {
459
- access_token: 'profile-token-xyz',
460
- expires_at: 99999,
461
- });
462
- return yield* config.resolve();
463
- }).pipe(Effect.provide(layer)));
464
- expect(r.token).toBe('profile-token-xyz');
465
- });
466
- it('does NOT read profile credentials when --api-url overrides', async () => {
467
- const { layer } = makeLayer();
468
- process.env.MXS_PROFILE = 'prod';
469
- const r = await Effect.runPromise(Effect.gen(function* () {
470
- const config = yield* Config;
471
- yield* config.writeProfileConfig('prod', {
472
- api_url: 'https://prod.example.com',
473
- production: true,
474
- });
475
- yield* config.writeProfileCredentials('prod', {
476
- access_token: 'fixture',
477
- expires_at: 99999,
478
- });
479
- return yield* config.resolve({ apiUrl: 'https://custom.example.com' });
480
- }).pipe(Effect.provide(layer)));
481
- expect(r.urlOverridden).toBe(true);
482
- expect(r.token).toBeUndefined();
483
- expect(r.isProduction).toBe(false);
484
- });
485
- it('throws ProfileNotFound when current points to a missing dir', async () => {
486
- const { mem, layer } = makeLayer();
487
- mem.seed('/xdg/mxs/current', 'ghost\n');
488
- const exit = await Effect.runPromiseExit(Effect.gen(function* () {
489
- const config = yield* Config;
490
- return yield* config.resolve();
491
- }).pipe(Effect.provide(layer)));
492
- expect(Exit.isFailure(exit)).toBe(true);
493
- if (Exit.isFailure(exit)) {
494
- const cause = exit.cause;
495
- const err = cause.error ?? cause.failure ?? cause;
496
- const tag = err?._tag ?? err?.error?._tag ?? err?.failure?._tag;
497
- expect(tag).toBe('ProfileNotFound');
498
- }
499
- });
500
- it('does NOT throw ProfileNotFound in url-override mode even with stale current', async () => {
501
- const { mem, layer } = makeLayer();
502
- mem.seed('/xdg/mxs/current', 'ghost\n');
503
- const r = await Effect.runPromise(Effect.gen(function* () {
504
- const config = yield* Config;
505
- return yield* config.resolve({ apiUrl: 'https://custom.example.com' });
506
- }).pipe(Effect.provide(layer)));
507
- expect(r.urlOverridden).toBe(true);
508
- expect(r.apiUrl).toBe('https://custom.example.com');
509
- });
510
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,113 +0,0 @@
1
- import { describe, expect, it } from '@effect/vitest';
2
- import { formatAbsoluteDateTime, formatDateTime, formatRelativeTime, looksLikeTimestamp, toDate, tryFormatTimestamp, } from '../../src/services/Renderer/datetime';
3
- describe('toDate', () => {
4
- it('returns null for nullish values', () => {
5
- expect(toDate(null)).toBeNull();
6
- expect(toDate(undefined)).toBeNull();
7
- expect(toDate('')).toBeNull();
8
- expect(toDate(' ')).toBeNull();
9
- });
10
- it('parses ISO strings', () => {
11
- const d = toDate('2026-05-19T14:32:00.000Z');
12
- expect(d).not.toBeNull();
13
- expect(d.getUTCFullYear()).toBe(2026);
14
- expect(d.getUTCMonth()).toBe(4);
15
- expect(d.getUTCDate()).toBe(19);
16
- });
17
- it('treats large numbers as milliseconds and small numbers as seconds', () => {
18
- const ms = 1747668720000; // 2025-05-19T..
19
- const s = ms / 1000;
20
- expect(toDate(ms)?.getTime()).toBe(ms);
21
- expect(toDate(s)?.getTime()).toBe(ms);
22
- });
23
- it('rejects non-positive or NaN numbers', () => {
24
- expect(toDate(0)).toBeNull();
25
- expect(toDate(-1)).toBeNull();
26
- expect(toDate(Number.NaN)).toBeNull();
27
- expect(toDate(Number.POSITIVE_INFINITY)).toBeNull();
28
- });
29
- it('preserves Date instances unless invalid', () => {
30
- const d = new Date('2026-05-19T14:32:00.000Z');
31
- expect(toDate(d)).toBe(d);
32
- expect(toDate(new Date('invalid'))).toBeNull();
33
- });
34
- });
35
- describe('formatAbsoluteDateTime', () => {
36
- it('emits YYYY-MM-DD HH:mm in local time', () => {
37
- const date = new Date(2026, 4, 19, 14, 5);
38
- expect(formatAbsoluteDateTime(date)).toBe('2026-05-19 14:05');
39
- });
40
- it('zero-pads month, day, hour, and minute', () => {
41
- const date = new Date(2026, 0, 1, 1, 7);
42
- expect(formatAbsoluteDateTime(date)).toBe('2026-01-01 01:07');
43
- });
44
- });
45
- describe('formatRelativeTime', () => {
46
- const now = new Date('2026-05-19T14:00:00.000Z');
47
- it('renders "just now" for very recent past', () => {
48
- expect(formatRelativeTime(new Date('2026-05-19T13:59:30.000Z'), now)).toBe('just now');
49
- });
50
- it('renders pluralized minutes', () => {
51
- expect(formatRelativeTime(new Date('2026-05-19T13:55:00.000Z'), now)).toBe('5 minutes ago');
52
- });
53
- it('uses singular for exactly 1 unit', () => {
54
- expect(formatRelativeTime(new Date('2026-05-19T13:00:00.000Z'), now)).toBe('1 hour ago');
55
- });
56
- it('renders future as "in N units"', () => {
57
- expect(formatRelativeTime(new Date('2026-05-20T14:00:00.000Z'), now)).toBe('in 1 day');
58
- });
59
- it('caps long horizons at years', () => {
60
- expect(formatRelativeTime(new Date('2023-05-19T14:00:00.000Z'), now)).toBe('3 years ago');
61
- });
62
- });
63
- describe('formatDateTime style switch', () => {
64
- const fixedNow = new Date('2026-05-19T14:00:00.000Z');
65
- it('defaults to absolute form', () => {
66
- const out = formatDateTime('2026-05-19T13:55:00.000Z', { now: fixedNow });
67
- expect(out).toMatch(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/);
68
- });
69
- it('"both" appends the relative phrase in parens', () => {
70
- const out = formatDateTime('2026-05-19T13:55:00.000Z', {
71
- style: 'both',
72
- now: fixedNow,
73
- });
74
- expect(out).toContain('(5 minutes ago)');
75
- });
76
- it('"rel" omits the absolute portion', () => {
77
- const out = formatDateTime('2026-05-19T13:55:00.000Z', {
78
- style: 'rel',
79
- now: fixedNow,
80
- });
81
- expect(out).toBe('5 minutes ago');
82
- });
83
- it('returns empty for nullish, raw string fallback for unparseable values', () => {
84
- expect(formatDateTime(null)).toBe('');
85
- expect(formatDateTime(undefined)).toBe('');
86
- expect(formatDateTime('not-a-date')).toBe('not-a-date');
87
- });
88
- });
89
- describe('looksLikeTimestamp / tryFormatTimestamp', () => {
90
- it('matches ISO 8601 with T separator', () => {
91
- expect(looksLikeTimestamp('2026-05-19T14:00:00.000Z')).toBe(true);
92
- });
93
- it('matches the space variant', () => {
94
- expect(looksLikeTimestamp('2026-05-19 14:00:00')).toBe(true);
95
- });
96
- it('rejects date-only strings and arbitrary identifiers', () => {
97
- expect(looksLikeTimestamp('2026-05-19')).toBe(false);
98
- expect(looksLikeTimestamp('post-slug-2026')).toBe(false);
99
- expect(looksLikeTimestamp('123456789012345')).toBe(false);
100
- expect(looksLikeTimestamp(12345)).toBe(false);
101
- });
102
- it('returns null when value is not timestamp-shaped', () => {
103
- expect(tryFormatTimestamp('hello')).toBeNull();
104
- expect(tryFormatTimestamp(42)).toBeNull();
105
- });
106
- it('formats valid timestamps with the given style', () => {
107
- const fixedNow = new Date('2026-05-19T14:00:00.000Z');
108
- expect(tryFormatTimestamp('2026-05-19T13:55:00.000Z', {
109
- style: 'rel',
110
- now: fixedNow,
111
- })).toBe('5 minutes ago');
112
- });
113
- });
@@ -1 +0,0 @@
1
- export {};