@btst/stack 2.6.2 → 2.8.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 (309) hide show
  1. package/README.md +1 -0
  2. package/dist/api/index.d.cts +2 -2
  3. package/dist/api/index.d.mts +2 -2
  4. package/dist/api/index.d.ts +2 -2
  5. package/dist/client/index.d.cts +2 -2
  6. package/dist/client/index.d.mts +2 -2
  7. package/dist/client/index.d.ts +2 -2
  8. package/dist/components/auto-form/index.d.cts +2 -2
  9. package/dist/components/auto-form/index.d.mts +2 -2
  10. package/dist/components/auto-form/index.d.ts +2 -2
  11. package/dist/components/form-builder/index.d.cts +1 -1
  12. package/dist/components/form-builder/index.d.mts +1 -1
  13. package/dist/components/form-builder/index.d.ts +1 -1
  14. package/dist/components/stepped-auto-form/index.d.cts +1 -1
  15. package/dist/components/stepped-auto-form/index.d.mts +1 -1
  16. package/dist/components/stepped-auto-form/index.d.ts +1 -1
  17. package/dist/index.d.cts +1 -1
  18. package/dist/index.d.mts +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/packages/stack/src/plugins/blog/client/components/loading/post-navigation-skeleton.cjs +13 -0
  21. package/dist/packages/stack/src/plugins/blog/client/components/loading/post-navigation-skeleton.mjs +11 -0
  22. package/dist/packages/stack/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.cjs +17 -0
  23. package/dist/packages/stack/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.mjs +15 -0
  24. package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.cjs +18 -7
  25. package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.mjs +18 -7
  26. package/dist/packages/stack/src/plugins/blog/client/components/shared/post-navigation.cjs +48 -52
  27. package/dist/packages/stack/src/plugins/blog/client/components/shared/post-navigation.mjs +49 -53
  28. package/dist/packages/stack/src/plugins/blog/client/components/shared/recent-posts-carousel.cjs +34 -37
  29. package/dist/packages/stack/src/plugins/blog/client/components/shared/recent-posts-carousel.mjs +35 -38
  30. package/dist/packages/stack/src/plugins/blog/client/hooks/blog-hooks.cjs +4 -21
  31. package/dist/packages/stack/src/plugins/blog/client/hooks/blog-hooks.mjs +4 -21
  32. package/dist/packages/stack/src/plugins/comments/api/getters.cjs +284 -0
  33. package/dist/packages/stack/src/plugins/comments/api/getters.mjs +280 -0
  34. package/dist/packages/stack/src/plugins/comments/api/mutations.cjs +118 -0
  35. package/dist/packages/stack/src/plugins/comments/api/mutations.mjs +112 -0
  36. package/dist/packages/stack/src/plugins/comments/api/plugin.cjs +335 -0
  37. package/dist/packages/stack/src/plugins/comments/api/plugin.mjs +333 -0
  38. package/dist/packages/stack/src/plugins/comments/api/query-key-defs.cjs +60 -0
  39. package/dist/packages/stack/src/plugins/comments/api/query-key-defs.mjs +55 -0
  40. package/dist/packages/stack/src/plugins/comments/api/serializers.cjs +23 -0
  41. package/dist/packages/stack/src/plugins/comments/api/serializers.mjs +21 -0
  42. package/dist/packages/stack/src/plugins/comments/client/components/comment-count.cjs +46 -0
  43. package/dist/packages/stack/src/plugins/comments/client/components/comment-count.mjs +44 -0
  44. package/dist/packages/stack/src/plugins/comments/client/components/comment-form.cjs +86 -0
  45. package/dist/packages/stack/src/plugins/comments/client/components/comment-form.mjs +84 -0
  46. package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.cjs +540 -0
  47. package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.mjs +538 -0
  48. package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.cjs +64 -0
  49. package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.internal.cjs +426 -0
  50. package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.internal.mjs +424 -0
  51. package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.mjs +62 -0
  52. package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.cjs +66 -0
  53. package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.internal.cjs +256 -0
  54. package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.internal.mjs +254 -0
  55. package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.mjs +64 -0
  56. package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.cjs +86 -0
  57. package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.internal.cjs +191 -0
  58. package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.internal.mjs +189 -0
  59. package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.mjs +84 -0
  60. package/dist/packages/stack/src/plugins/comments/client/components/shared/page-wrapper.cjs +27 -0
  61. package/dist/packages/stack/src/plugins/comments/client/components/shared/page-wrapper.mjs +25 -0
  62. package/dist/packages/stack/src/plugins/comments/client/components/shared/pagination.cjs +37 -0
  63. package/dist/packages/stack/src/plugins/comments/client/components/shared/pagination.mjs +35 -0
  64. package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.cjs +476 -0
  65. package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.mjs +464 -0
  66. package/dist/packages/stack/src/plugins/comments/client/localization/comments-moderation.cjs +67 -0
  67. package/dist/packages/stack/src/plugins/comments/client/localization/comments-moderation.mjs +65 -0
  68. package/dist/packages/stack/src/plugins/comments/client/localization/comments-my.cjs +27 -0
  69. package/dist/packages/stack/src/plugins/comments/client/localization/comments-my.mjs +25 -0
  70. package/dist/packages/stack/src/plugins/comments/client/localization/comments-thread.cjs +30 -0
  71. package/dist/packages/stack/src/plugins/comments/client/localization/comments-thread.mjs +28 -0
  72. package/dist/packages/stack/src/plugins/comments/client/localization/index.cjs +13 -0
  73. package/dist/packages/stack/src/plugins/comments/client/localization/index.mjs +11 -0
  74. package/dist/packages/stack/src/plugins/comments/client/plugin.cjs +116 -0
  75. package/dist/packages/stack/src/plugins/comments/client/plugin.mjs +114 -0
  76. package/dist/packages/stack/src/plugins/comments/client/utils.cjs +41 -0
  77. package/dist/packages/stack/src/plugins/comments/client/utils.mjs +37 -0
  78. package/dist/packages/stack/src/plugins/comments/db.cjs +75 -0
  79. package/dist/packages/stack/src/plugins/comments/db.mjs +73 -0
  80. package/dist/packages/stack/src/plugins/comments/schemas.cjs +45 -0
  81. package/dist/packages/stack/src/plugins/comments/schemas.mjs +38 -0
  82. package/dist/packages/stack/src/plugins/kanban/api/plugin.cjs +5 -4
  83. package/dist/packages/stack/src/plugins/kanban/api/plugin.mjs +5 -4
  84. package/dist/packages/stack/src/plugins/kanban/client/components/forms/task-form.cjs +0 -1
  85. package/dist/packages/stack/src/plugins/kanban/client/components/forms/task-form.mjs +0 -1
  86. package/dist/packages/stack/src/plugins/kanban/client/components/pages/board-page.internal.cjs +39 -22
  87. package/dist/packages/stack/src/plugins/kanban/client/components/pages/board-page.internal.mjs +40 -23
  88. package/dist/packages/ui/src/components/avatar.mjs +1 -1
  89. package/dist/packages/ui/src/components/pagination-controls.cjs +64 -0
  90. package/dist/packages/ui/src/components/pagination-controls.mjs +62 -0
  91. package/dist/packages/ui/src/components/when-visible.cjs +39 -0
  92. package/dist/packages/ui/src/components/when-visible.mjs +37 -0
  93. package/dist/plugins/ai-chat/api/index.d.cts +4 -6
  94. package/dist/plugins/ai-chat/api/index.d.mts +4 -6
  95. package/dist/plugins/ai-chat/api/index.d.ts +4 -6
  96. package/dist/plugins/ai-chat/client/hooks/index.d.cts +1 -3
  97. package/dist/plugins/ai-chat/client/hooks/index.d.mts +1 -3
  98. package/dist/plugins/ai-chat/client/hooks/index.d.ts +1 -3
  99. package/dist/plugins/ai-chat/query-keys.d.cts +1 -3
  100. package/dist/plugins/ai-chat/query-keys.d.mts +1 -3
  101. package/dist/plugins/ai-chat/query-keys.d.ts +1 -3
  102. package/dist/plugins/api/index.d.cts +3 -3
  103. package/dist/plugins/api/index.d.mts +3 -3
  104. package/dist/plugins/api/index.d.ts +3 -3
  105. package/dist/plugins/blog/api/index.d.cts +3 -3
  106. package/dist/plugins/blog/api/index.d.mts +3 -3
  107. package/dist/plugins/blog/api/index.d.ts +3 -3
  108. package/dist/plugins/blog/client/hooks/index.d.cts +2 -2
  109. package/dist/plugins/blog/client/hooks/index.d.mts +2 -2
  110. package/dist/plugins/blog/client/hooks/index.d.ts +2 -2
  111. package/dist/plugins/blog/client/index.d.cts +25 -3
  112. package/dist/plugins/blog/client/index.d.mts +25 -3
  113. package/dist/plugins/blog/client/index.d.ts +25 -3
  114. package/dist/plugins/blog/query-keys.d.cts +3 -3
  115. package/dist/plugins/blog/query-keys.d.mts +3 -3
  116. package/dist/plugins/blog/query-keys.d.ts +3 -3
  117. package/dist/plugins/client/index.d.cts +2 -2
  118. package/dist/plugins/client/index.d.mts +2 -2
  119. package/dist/plugins/client/index.d.ts +2 -2
  120. package/dist/plugins/cms/api/index.d.cts +1 -1
  121. package/dist/plugins/cms/api/index.d.mts +1 -1
  122. package/dist/plugins/cms/api/index.d.ts +1 -1
  123. package/dist/plugins/cms/client/index.d.cts +1 -1
  124. package/dist/plugins/cms/client/index.d.mts +1 -1
  125. package/dist/plugins/cms/client/index.d.ts +1 -1
  126. package/dist/plugins/cms/query-keys.d.cts +1 -1
  127. package/dist/plugins/cms/query-keys.d.mts +1 -1
  128. package/dist/plugins/cms/query-keys.d.ts +1 -1
  129. package/dist/plugins/comments/api/index.cjs +21 -0
  130. package/dist/plugins/comments/api/index.d.cts +126 -0
  131. package/dist/plugins/comments/api/index.d.mts +126 -0
  132. package/dist/plugins/comments/api/index.d.ts +126 -0
  133. package/dist/plugins/comments/api/index.mjs +5 -0
  134. package/dist/plugins/comments/client/components/index.cjs +15 -0
  135. package/dist/plugins/comments/client/components/index.d.cts +125 -0
  136. package/dist/plugins/comments/client/components/index.d.mts +125 -0
  137. package/dist/plugins/comments/client/components/index.d.ts +125 -0
  138. package/dist/plugins/comments/client/components/index.mjs +5 -0
  139. package/dist/plugins/comments/client/hooks/index.cjs +17 -0
  140. package/dist/plugins/comments/client/hooks/index.d.cts +200 -0
  141. package/dist/plugins/comments/client/hooks/index.d.mts +200 -0
  142. package/dist/plugins/comments/client/hooks/index.d.ts +200 -0
  143. package/dist/plugins/comments/client/hooks/index.mjs +1 -0
  144. package/dist/plugins/comments/client/index.cjs +9 -0
  145. package/dist/plugins/comments/client/index.d.cts +262 -0
  146. package/dist/plugins/comments/client/index.d.mts +262 -0
  147. package/dist/plugins/comments/client/index.d.ts +262 -0
  148. package/dist/plugins/comments/client/index.mjs +2 -0
  149. package/dist/plugins/comments/client.css +2 -0
  150. package/dist/plugins/comments/query-keys.cjs +113 -0
  151. package/dist/plugins/comments/query-keys.d.cts +71 -0
  152. package/dist/plugins/comments/query-keys.d.mts +71 -0
  153. package/dist/plugins/comments/query-keys.d.ts +71 -0
  154. package/dist/plugins/comments/query-keys.mjs +111 -0
  155. package/dist/plugins/comments/style.css +15 -0
  156. package/dist/plugins/form-builder/api/index.d.cts +2 -2
  157. package/dist/plugins/form-builder/api/index.d.mts +2 -2
  158. package/dist/plugins/form-builder/api/index.d.ts +2 -2
  159. package/dist/plugins/form-builder/client/components/index.d.cts +1 -1
  160. package/dist/plugins/form-builder/client/components/index.d.mts +1 -1
  161. package/dist/plugins/form-builder/client/components/index.d.ts +1 -1
  162. package/dist/plugins/form-builder/client/index.d.cts +1 -1
  163. package/dist/plugins/form-builder/client/index.d.mts +1 -1
  164. package/dist/plugins/form-builder/client/index.d.ts +1 -1
  165. package/dist/plugins/form-builder/query-keys.d.cts +1 -1
  166. package/dist/plugins/form-builder/query-keys.d.mts +1 -1
  167. package/dist/plugins/form-builder/query-keys.d.ts +1 -1
  168. package/dist/plugins/kanban/api/index.d.cts +2 -2
  169. package/dist/plugins/kanban/api/index.d.mts +2 -2
  170. package/dist/plugins/kanban/api/index.d.ts +2 -2
  171. package/dist/plugins/kanban/client/hooks/index.d.cts +1 -1
  172. package/dist/plugins/kanban/client/hooks/index.d.mts +1 -1
  173. package/dist/plugins/kanban/client/hooks/index.d.ts +1 -1
  174. package/dist/plugins/kanban/client/index.d.cts +1 -1
  175. package/dist/plugins/kanban/client/index.d.mts +1 -1
  176. package/dist/plugins/kanban/client/index.d.ts +1 -1
  177. package/dist/plugins/kanban/query-keys.d.cts +2 -2
  178. package/dist/plugins/kanban/query-keys.d.mts +2 -2
  179. package/dist/plugins/kanban/query-keys.d.ts +2 -2
  180. package/dist/plugins/open-api/api/index.d.cts +3 -3
  181. package/dist/plugins/open-api/api/index.d.mts +3 -3
  182. package/dist/plugins/open-api/api/index.d.ts +3 -3
  183. package/dist/plugins/route-docs/client/index.d.cts +1 -1
  184. package/dist/plugins/route-docs/client/index.d.mts +1 -1
  185. package/dist/plugins/route-docs/client/index.d.ts +1 -1
  186. package/dist/plugins/ui-builder/client/components/index.d.cts +2 -2
  187. package/dist/plugins/ui-builder/client/components/index.d.mts +2 -2
  188. package/dist/plugins/ui-builder/client/components/index.d.ts +2 -2
  189. package/dist/plugins/ui-builder/client/hooks/index.d.cts +3 -3
  190. package/dist/plugins/ui-builder/client/hooks/index.d.mts +3 -3
  191. package/dist/plugins/ui-builder/client/hooks/index.d.ts +3 -3
  192. package/dist/plugins/ui-builder/client/index.d.cts +3 -3
  193. package/dist/plugins/ui-builder/client/index.d.mts +3 -3
  194. package/dist/plugins/ui-builder/client/index.d.ts +3 -3
  195. package/dist/plugins/ui-builder/index.d.cts +3 -3
  196. package/dist/plugins/ui-builder/index.d.mts +3 -3
  197. package/dist/plugins/ui-builder/index.d.ts +3 -3
  198. package/dist/shared/{stack.B1srlBud.d.mts → stack.BFoBvGML.d.mts} +1 -1
  199. package/dist/shared/{stack.DmpPDPxA.d.cts → stack.BOCvd9HK.d.cts} +1 -1
  200. package/dist/shared/{stack.n1_i1p2B.d.cts → stack.BOokfhZD.d.cts} +170 -110
  201. package/dist/shared/{stack.DXnclTG7.d.ts → stack.BSqJrCTM.d.cts} +120 -59
  202. package/dist/shared/{stack.B58oHdqm.d.mts → stack.BX7MHi0J.d.mts} +90 -45
  203. package/dist/shared/{stack.cfCkioTe.d.mts → stack.BXxrFL9R.d.ts} +120 -59
  204. package/dist/shared/{stack.CSx98K5H.d.cts → stack.BYN8wCV6.d.cts} +87 -58
  205. package/dist/shared/{stack.FVWf2JhZ.d.mts → stack.BgQrdSlo.d.mts} +60 -45
  206. package/dist/shared/{stack.BK9Z2dcL.d.ts → stack.BmMB0LNC.d.ts} +1 -1
  207. package/dist/shared/{stack.j75TpKh2.d.ts → stack.BvCR4-9H.d.ts} +170 -110
  208. package/dist/shared/{stack.FeaWkglm.d.ts → stack.BxFl46lB.d.cts} +24 -1
  209. package/dist/shared/stack.C-b3Sn8j.d.cts +142 -0
  210. package/dist/shared/stack.C-b3Sn8j.d.mts +142 -0
  211. package/dist/shared/stack.C-b3Sn8j.d.ts +142 -0
  212. package/dist/shared/{stack.CFECM0ew.d.cts → stack.C1nXGBr6.d.cts} +1 -1
  213. package/dist/shared/{stack.C9Mg2Q46.d.cts → stack.C9zoS1TN.d.cts} +90 -45
  214. package/dist/shared/stack.CJE9sAjV.d.ts +335 -0
  215. package/dist/shared/{stack.fdi94T4S.d.mts → stack.CPsYC2-Z.d.cts} +7 -7
  216. package/dist/shared/{stack.fdi94T4S.d.ts → stack.CPsYC2-Z.d.mts} +7 -7
  217. package/dist/shared/{stack.fdi94T4S.d.cts → stack.CPsYC2-Z.d.ts} +7 -7
  218. package/dist/shared/{stack.7n9Y_u7N.d.cts → stack.CQnwAN7x.d.cts} +6 -6
  219. package/dist/shared/{stack.7n9Y_u7N.d.mts → stack.CQnwAN7x.d.mts} +6 -6
  220. package/dist/shared/{stack.7n9Y_u7N.d.ts → stack.CQnwAN7x.d.ts} +6 -6
  221. package/dist/shared/{stack.CxaFNQCV.d.mts → stack.CWxAl9K3.d.mts} +170 -110
  222. package/dist/shared/{stack.D-b5zbPm.d.cts → stack.Cbsrl06u.d.cts} +60 -45
  223. package/dist/shared/stack.CmHRdhl8.d.cts +335 -0
  224. package/dist/shared/{stack.BgTmujxW.d.mts → stack.D88yU4FT.d.mts} +87 -58
  225. package/dist/shared/{stack.DVtk5CNw.d.mts → stack.DLPa6Gzm.d.mts} +1 -1
  226. package/dist/shared/{stack.BAT540yW.d.ts → stack.DOZ1EXjM.d.mts} +9 -15
  227. package/dist/shared/{stack.FeaWkglm.d.mts → stack.DRpeDS6X.d.ts} +24 -1
  228. package/dist/shared/{stack.B8vT-Yt4.d.mts → stack.DX-tQ93o.d.cts} +9 -15
  229. package/dist/shared/stack.Dcz6636A.d.mts +335 -0
  230. package/dist/shared/{stack.ASwEoINr.d.ts → stack.DxJ-tHLt.d.ts} +1 -1
  231. package/dist/shared/{stack.DaZM10cp.d.cts → stack.DzOhpIYM.d.mts} +120 -59
  232. package/dist/shared/{stack.CTDVxbrA.d.ts → stack.Fl2Kl_bt.d.ts} +60 -45
  233. package/dist/shared/{stack.FeaWkglm.d.cts → stack.Jb0kQDJC.d.mts} +24 -1
  234. package/dist/shared/stack.Ldfkr5b2.d.cts +112 -0
  235. package/dist/shared/stack.Ldfkr5b2.d.mts +112 -0
  236. package/dist/shared/stack.Ldfkr5b2.d.ts +112 -0
  237. package/dist/shared/{stack.CLQuVdwK.d.ts → stack.RuQ9JCLo.d.ts} +87 -58
  238. package/dist/shared/{stack.BwA7trxA.d.cts → stack.VF6FhyZw.d.ts} +9 -15
  239. package/dist/shared/{stack.sO33ZDhK.d.ts → stack.fQjVhw5a.d.ts} +90 -45
  240. package/package.json +70 -5
  241. package/src/__tests__/plugins.test.tsx +5 -1
  242. package/src/__tests__/stack-api.test.ts +1 -1
  243. package/src/plugins/ai-chat/__tests__/getters.test.ts +1 -1
  244. package/src/plugins/ai-chat/api/getters.ts +1 -1
  245. package/src/plugins/ai-chat/api/plugin.ts +1 -1
  246. package/src/plugins/api/index.ts +5 -1
  247. package/src/plugins/blog/__tests__/getters.test.ts +1 -1
  248. package/src/plugins/blog/api/getters.ts +1 -1
  249. package/src/plugins/blog/api/plugin.ts +1 -1
  250. package/src/plugins/blog/client/components/loading/post-navigation-skeleton.tsx +10 -0
  251. package/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.tsx +18 -0
  252. package/src/plugins/blog/client/components/pages/post-page.internal.tsx +23 -8
  253. package/src/plugins/blog/client/components/shared/post-navigation.tsx +0 -5
  254. package/src/plugins/blog/client/components/shared/recent-posts-carousel.tsx +1 -5
  255. package/src/plugins/blog/client/hooks/blog-hooks.tsx +8 -33
  256. package/src/plugins/blog/client/overrides.ts +26 -1
  257. package/src/plugins/cms/__tests__/getters.test.ts +1 -1
  258. package/src/plugins/cms/api/getters.ts +1 -1
  259. package/src/plugins/cms/api/mutations.ts +1 -1
  260. package/src/plugins/cms/api/plugin.ts +1 -1
  261. package/src/plugins/cms/client/components/shared/pagination.tsx +14 -42
  262. package/src/plugins/comments/api/getters.ts +444 -0
  263. package/src/plugins/comments/api/index.ts +21 -0
  264. package/src/plugins/comments/api/mutations.ts +206 -0
  265. package/src/plugins/comments/api/plugin.ts +628 -0
  266. package/src/plugins/comments/api/query-key-defs.ts +143 -0
  267. package/src/plugins/comments/api/serializers.ts +37 -0
  268. package/src/plugins/comments/client/components/comment-count.tsx +66 -0
  269. package/src/plugins/comments/client/components/comment-form.tsx +112 -0
  270. package/src/plugins/comments/client/components/comment-thread.tsx +799 -0
  271. package/src/plugins/comments/client/components/index.tsx +11 -0
  272. package/src/plugins/comments/client/components/pages/moderation-page.internal.tsx +550 -0
  273. package/src/plugins/comments/client/components/pages/moderation-page.tsx +70 -0
  274. package/src/plugins/comments/client/components/pages/my-comments-page.internal.tsx +367 -0
  275. package/src/plugins/comments/client/components/pages/my-comments-page.tsx +72 -0
  276. package/src/plugins/comments/client/components/pages/resource-comments-page.internal.tsx +225 -0
  277. package/src/plugins/comments/client/components/pages/resource-comments-page.tsx +97 -0
  278. package/src/plugins/comments/client/components/shared/page-wrapper.tsx +32 -0
  279. package/src/plugins/comments/client/components/shared/pagination.tsx +44 -0
  280. package/src/plugins/comments/client/hooks/index.tsx +13 -0
  281. package/src/plugins/comments/client/hooks/use-comments.tsx +717 -0
  282. package/src/plugins/comments/client/index.ts +14 -0
  283. package/src/plugins/comments/client/localization/comments-moderation.ts +75 -0
  284. package/src/plugins/comments/client/localization/comments-my.ts +32 -0
  285. package/src/plugins/comments/client/localization/comments-thread.ts +32 -0
  286. package/src/plugins/comments/client/localization/index.ts +11 -0
  287. package/src/plugins/comments/client/overrides.ts +164 -0
  288. package/src/plugins/comments/client/plugin.tsx +195 -0
  289. package/src/plugins/comments/client/utils.ts +67 -0
  290. package/src/plugins/comments/client.css +2 -0
  291. package/src/plugins/comments/db.ts +77 -0
  292. package/src/plugins/comments/query-keys.ts +189 -0
  293. package/src/plugins/comments/schemas.ts +72 -0
  294. package/src/plugins/comments/style.css +15 -0
  295. package/src/plugins/comments/types.ts +73 -0
  296. package/src/plugins/form-builder/__tests__/getters.test.ts +1 -1
  297. package/src/plugins/form-builder/api/getters.ts +1 -1
  298. package/src/plugins/form-builder/api/plugin.ts +1 -1
  299. package/src/plugins/kanban/__tests__/getters.test.ts +1 -1
  300. package/src/plugins/kanban/api/getters.ts +1 -1
  301. package/src/plugins/kanban/api/mutations.ts +1 -1
  302. package/src/plugins/kanban/api/plugin.ts +6 -5
  303. package/src/plugins/kanban/client/components/forms/task-form.tsx +0 -1
  304. package/src/plugins/kanban/client/components/pages/board-page.internal.tsx +46 -27
  305. package/src/plugins/kanban/client/overrides.ts +27 -1
  306. package/src/types.ts +5 -1
  307. package/dist/shared/{stack.BQmuNl5p.d.mts → stack.BWp0hcm9.d.cts} +3 -3
  308. package/dist/shared/{stack.BQmuNl5p.d.ts → stack.BWp0hcm9.d.mts} +3 -3
  309. package/dist/shared/{stack.BQmuNl5p.d.cts → stack.BWp0hcm9.d.ts} +3 -3
@@ -8,7 +8,7 @@ const postCard = require('./post-card.cjs');
8
8
  const defaults = require('./defaults.cjs');
9
9
  const index = require('../../localization/index.cjs');
10
10
 
11
- function RecentPostsCarousel({ posts, ref }) {
11
+ function RecentPostsCarousel({ posts }) {
12
12
  const { PostCard, Link, localization } = context.usePluginOverrides("blog", {
13
13
  PostCard: postCard.PostCard,
14
14
  Link: defaults.DefaultLink,
@@ -16,44 +16,41 @@ function RecentPostsCarousel({ posts, ref }) {
16
16
  });
17
17
  const PostCardComponent = PostCard || postCard.PostCard;
18
18
  const basePath = context.useBasePath();
19
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
20
- ref && /* @__PURE__ */ jsxRuntime.jsx("div", { ref }),
21
- posts && posts.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
22
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 py-4 w-full text-start border-t", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center justify-between", children: [
23
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-semibold", children: localization.BLOG_POST_KEEP_READING }),
24
- /* @__PURE__ */ jsxRuntime.jsx(
25
- Link,
26
- {
27
- href: `${basePath}/blog`,
28
- className: "text-sm text-muted-foreground hover:text-foreground transition-colors",
29
- children: localization.BLOG_POST_VIEW_ALL
30
- }
31
- )
32
- ] }) }),
33
- /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "recent-posts-carousel", children: /* @__PURE__ */ jsxRuntime.jsxs(
34
- carousel.Carousel,
19
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full", children: posts && posts.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 py-4 w-full text-start border-t", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center justify-between", children: [
21
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-semibold", children: localization.BLOG_POST_KEEP_READING }),
22
+ /* @__PURE__ */ jsxRuntime.jsx(
23
+ Link,
35
24
  {
36
- opts: {
37
- align: "start",
38
- loop: false
39
- },
40
- className: "w-full",
41
- children: [
42
- /* @__PURE__ */ jsxRuntime.jsx(carousel.CarouselContent, { className: "-ml-2 md:-ml-4", children: posts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
43
- carousel.CarouselItem,
44
- {
45
- className: "pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3",
46
- children: /* @__PURE__ */ jsxRuntime.jsx(PostCardComponent, { post })
47
- },
48
- post.id
49
- )) }),
50
- /* @__PURE__ */ jsxRuntime.jsx(carousel.CarouselPrevious, { className: "-left-4 z-50 hover:cursor-pointer" }),
51
- /* @__PURE__ */ jsxRuntime.jsx(carousel.CarouselNext, { className: "-right-4 z-50 hover:cursor-pointer" })
52
- ]
25
+ href: `${basePath}/blog`,
26
+ className: "text-sm text-muted-foreground hover:text-foreground transition-colors",
27
+ children: localization.BLOG_POST_VIEW_ALL
53
28
  }
54
- ) })
55
- ] })
56
- ] });
29
+ )
30
+ ] }) }),
31
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "recent-posts-carousel", children: /* @__PURE__ */ jsxRuntime.jsxs(
32
+ carousel.Carousel,
33
+ {
34
+ opts: {
35
+ align: "start",
36
+ loop: false
37
+ },
38
+ className: "w-full",
39
+ children: [
40
+ /* @__PURE__ */ jsxRuntime.jsx(carousel.CarouselContent, { className: "-ml-2 md:-ml-4", children: posts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
41
+ carousel.CarouselItem,
42
+ {
43
+ className: "pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3",
44
+ children: /* @__PURE__ */ jsxRuntime.jsx(PostCardComponent, { post })
45
+ },
46
+ post.id
47
+ )) }),
48
+ /* @__PURE__ */ jsxRuntime.jsx(carousel.CarouselPrevious, { className: "-left-4 z-50 hover:cursor-pointer" }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(carousel.CarouselNext, { className: "-right-4 z-50 hover:cursor-pointer" })
50
+ ]
51
+ }
52
+ ) })
53
+ ] }) });
57
54
  }
58
55
 
59
56
  exports.RecentPostsCarousel = RecentPostsCarousel;
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
3
  import { usePluginOverrides, useBasePath } from '@btst/stack/context';
4
4
  import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext } from '../../../../../../../ui/src/components/carousel.mjs';
5
5
  import { PostCard } from './post-card.mjs';
6
6
  import { DefaultLink } from './defaults.mjs';
7
7
  import { BLOG_LOCALIZATION } from '../../localization/index.mjs';
8
8
 
9
- function RecentPostsCarousel({ posts, ref }) {
9
+ function RecentPostsCarousel({ posts }) {
10
10
  const { PostCard: PostCard$1, Link, localization } = usePluginOverrides("blog", {
11
11
  PostCard: PostCard,
12
12
  Link: DefaultLink,
@@ -14,44 +14,41 @@ function RecentPostsCarousel({ posts, ref }) {
14
14
  });
15
15
  const PostCardComponent = PostCard$1 || PostCard;
16
16
  const basePath = useBasePath();
17
- return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
18
- ref && /* @__PURE__ */ jsx("div", { ref }),
19
- posts && posts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
20
- /* @__PURE__ */ jsx("div", { className: "mt-4 py-4 w-full text-start border-t", children: /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center justify-between", children: [
21
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold", children: localization.BLOG_POST_KEEP_READING }),
22
- /* @__PURE__ */ jsx(
23
- Link,
24
- {
25
- href: `${basePath}/blog`,
26
- className: "text-sm text-muted-foreground hover:text-foreground transition-colors",
27
- children: localization.BLOG_POST_VIEW_ALL
28
- }
29
- )
30
- ] }) }),
31
- /* @__PURE__ */ jsx("div", { "data-testid": "recent-posts-carousel", children: /* @__PURE__ */ jsxs(
32
- Carousel,
17
+ return /* @__PURE__ */ jsx("div", { className: "w-full", children: posts && posts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18
+ /* @__PURE__ */ jsx("div", { className: "mt-4 py-4 w-full text-start border-t", children: /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center justify-between", children: [
19
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold", children: localization.BLOG_POST_KEEP_READING }),
20
+ /* @__PURE__ */ jsx(
21
+ Link,
33
22
  {
34
- opts: {
35
- align: "start",
36
- loop: false
37
- },
38
- className: "w-full",
39
- children: [
40
- /* @__PURE__ */ jsx(CarouselContent, { className: "-ml-2 md:-ml-4", children: posts.map((post) => /* @__PURE__ */ jsx(
41
- CarouselItem,
42
- {
43
- className: "pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3",
44
- children: /* @__PURE__ */ jsx(PostCardComponent, { post })
45
- },
46
- post.id
47
- )) }),
48
- /* @__PURE__ */ jsx(CarouselPrevious, { className: "-left-4 z-50 hover:cursor-pointer" }),
49
- /* @__PURE__ */ jsx(CarouselNext, { className: "-right-4 z-50 hover:cursor-pointer" })
50
- ]
23
+ href: `${basePath}/blog`,
24
+ className: "text-sm text-muted-foreground hover:text-foreground transition-colors",
25
+ children: localization.BLOG_POST_VIEW_ALL
51
26
  }
52
- ) })
53
- ] })
54
- ] });
27
+ )
28
+ ] }) }),
29
+ /* @__PURE__ */ jsx("div", { "data-testid": "recent-posts-carousel", children: /* @__PURE__ */ jsxs(
30
+ Carousel,
31
+ {
32
+ opts: {
33
+ align: "start",
34
+ loop: false
35
+ },
36
+ className: "w-full",
37
+ children: [
38
+ /* @__PURE__ */ jsx(CarouselContent, { className: "-ml-2 md:-ml-4", children: posts.map((post) => /* @__PURE__ */ jsx(
39
+ CarouselItem,
40
+ {
41
+ className: "pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3",
42
+ children: /* @__PURE__ */ jsx(PostCardComponent, { post })
43
+ },
44
+ post.id
45
+ )) }),
46
+ /* @__PURE__ */ jsx(CarouselPrevious, { className: "-left-4 z-50 hover:cursor-pointer" }),
47
+ /* @__PURE__ */ jsx(CarouselNext, { className: "-right-4 z-50 hover:cursor-pointer" })
48
+ ]
49
+ }
50
+ ) })
51
+ ] }) });
55
52
  }
56
53
 
57
54
  export { RecentPostsCarousel };
@@ -5,7 +5,6 @@ const client = require('@btst/stack/plugins/client');
5
5
  const reactQuery = require('@tanstack/react-query');
6
6
  const useDebounce = require('./use-debounce.cjs');
7
7
  const React = require('react');
8
- const reactIntersectionObserver = require('react-intersection-observer');
9
8
  const plugins_blog_queryKeys = require('../../../../../../../plugins/blog/query-keys.cjs');
10
9
  const context = require('@btst/stack/context');
11
10
 
@@ -342,27 +341,19 @@ function useNextPreviousPosts(createdAt, options = {}) {
342
341
  basePath: apiBasePath
343
342
  });
344
343
  const queries = plugins_blog_queryKeys.createBlogQueryKeys(client$1, headers);
345
- const { ref, inView } = reactIntersectionObserver.useInView({
346
- // start a little early so the data is ready as it scrolls in
347
- rootMargin: "200px 0px",
348
- // run once; keep data cached after
349
- triggerOnce: true
350
- });
351
344
  const dateValue = typeof createdAt === "string" ? new Date(createdAt) : createdAt;
352
345
  const baseQuery = queries.posts.nextPrevious(dateValue);
353
346
  const { data, isLoading, error, refetch } = reactQuery.useQuery({
354
347
  ...baseQuery,
355
348
  ...SHARED_QUERY_CONFIG,
356
- enabled: (options.enabled ?? true) && inView && !!client$1
349
+ enabled: (options.enabled ?? true) && !!client$1
357
350
  });
358
351
  return {
359
352
  previousPost: data?.previous ?? null,
360
353
  nextPost: data?.next ?? null,
361
354
  isLoading,
362
355
  error,
363
- refetch,
364
- ref,
365
- inView
356
+ refetch
366
357
  };
367
358
  }
368
359
  function useRecentPosts(options = {}) {
@@ -372,12 +363,6 @@ function useRecentPosts(options = {}) {
372
363
  basePath: apiBasePath
373
364
  });
374
365
  const queries = plugins_blog_queryKeys.createBlogQueryKeys(client$1, headers);
375
- const { ref, inView } = reactIntersectionObserver.useInView({
376
- // start a little early so the data is ready as it scrolls in
377
- rootMargin: "200px 0px",
378
- // run once; keep data cached after
379
- triggerOnce: true
380
- });
381
366
  const baseQuery = queries.posts.recent({
382
367
  limit: options.limit ?? 5,
383
368
  excludeSlug: options.excludeSlug
@@ -385,15 +370,13 @@ function useRecentPosts(options = {}) {
385
370
  const { data, isLoading, error, refetch } = reactQuery.useQuery({
386
371
  ...baseQuery,
387
372
  ...SHARED_QUERY_CONFIG,
388
- enabled: (options.enabled ?? true) && inView && !!client$1
373
+ enabled: (options.enabled ?? true) && !!client$1
389
374
  });
390
375
  return {
391
376
  recentPosts: data ?? [],
392
377
  isLoading,
393
378
  error,
394
- refetch,
395
- ref,
396
- inView
379
+ refetch
397
380
  };
398
381
  }
399
382
 
@@ -3,7 +3,6 @@ import { createApiClient } from '@btst/stack/plugins/client';
3
3
  import { useInfiniteQuery, useSuspenseInfiniteQuery, useQuery, useSuspenseQuery, useQueryClient, useMutation } from '@tanstack/react-query';
4
4
  import { useDebounce } from './use-debounce.mjs';
5
5
  import { useRef, useEffect } from 'react';
6
- import { useInView } from 'react-intersection-observer';
7
6
  import { createBlogQueryKeys } from '../../../../../../../plugins/blog/query-keys.mjs';
8
7
  import { usePluginOverrides } from '@btst/stack/context';
9
8
 
@@ -340,27 +339,19 @@ function useNextPreviousPosts(createdAt, options = {}) {
340
339
  basePath: apiBasePath
341
340
  });
342
341
  const queries = createBlogQueryKeys(client, headers);
343
- const { ref, inView } = useInView({
344
- // start a little early so the data is ready as it scrolls in
345
- rootMargin: "200px 0px",
346
- // run once; keep data cached after
347
- triggerOnce: true
348
- });
349
342
  const dateValue = typeof createdAt === "string" ? new Date(createdAt) : createdAt;
350
343
  const baseQuery = queries.posts.nextPrevious(dateValue);
351
344
  const { data, isLoading, error, refetch } = useQuery({
352
345
  ...baseQuery,
353
346
  ...SHARED_QUERY_CONFIG,
354
- enabled: (options.enabled ?? true) && inView && !!client
347
+ enabled: (options.enabled ?? true) && !!client
355
348
  });
356
349
  return {
357
350
  previousPost: data?.previous ?? null,
358
351
  nextPost: data?.next ?? null,
359
352
  isLoading,
360
353
  error,
361
- refetch,
362
- ref,
363
- inView
354
+ refetch
364
355
  };
365
356
  }
366
357
  function useRecentPosts(options = {}) {
@@ -370,12 +361,6 @@ function useRecentPosts(options = {}) {
370
361
  basePath: apiBasePath
371
362
  });
372
363
  const queries = createBlogQueryKeys(client, headers);
373
- const { ref, inView } = useInView({
374
- // start a little early so the data is ready as it scrolls in
375
- rootMargin: "200px 0px",
376
- // run once; keep data cached after
377
- triggerOnce: true
378
- });
379
364
  const baseQuery = queries.posts.recent({
380
365
  limit: options.limit ?? 5,
381
366
  excludeSlug: options.excludeSlug
@@ -383,15 +368,13 @@ function useRecentPosts(options = {}) {
383
368
  const { data, isLoading, error, refetch } = useQuery({
384
369
  ...baseQuery,
385
370
  ...SHARED_QUERY_CONFIG,
386
- enabled: (options.enabled ?? true) && inView && !!client
371
+ enabled: (options.enabled ?? true) && !!client
387
372
  });
388
373
  return {
389
374
  recentPosts: data ?? [],
390
375
  isLoading,
391
376
  error,
392
- refetch,
393
- ref,
394
- inView
377
+ refetch
395
378
  };
396
379
  }
397
380
 
@@ -0,0 +1,284 @@
1
+ 'use strict';
2
+
3
+ async function resolveAuthors(authorIds, resolveUser) {
4
+ const unique = [...new Set(authorIds)];
5
+ const map = /* @__PURE__ */ new Map();
6
+ if (!resolveUser || unique.length === 0) {
7
+ for (const id of unique) {
8
+ map.set(id, { name: "[deleted]", avatarUrl: null });
9
+ }
10
+ return map;
11
+ }
12
+ await Promise.all(
13
+ unique.map(async (id) => {
14
+ try {
15
+ const result = await resolveUser(id);
16
+ map.set(id, {
17
+ name: result?.name ?? "[deleted]",
18
+ avatarUrl: result?.avatarUrl ?? null
19
+ });
20
+ } catch {
21
+ map.set(id, { name: "[deleted]", avatarUrl: null });
22
+ }
23
+ })
24
+ );
25
+ return map;
26
+ }
27
+ function enrichComment(comment, authorMap, likedCommentIds, replyCount = 0) {
28
+ const author = authorMap.get(comment.authorId) ?? {
29
+ name: "[deleted]",
30
+ avatarUrl: null
31
+ };
32
+ return {
33
+ id: comment.id,
34
+ resourceId: comment.resourceId,
35
+ resourceType: comment.resourceType,
36
+ parentId: comment.parentId ?? null,
37
+ authorId: comment.authorId,
38
+ resolvedAuthorName: author.name,
39
+ resolvedAvatarUrl: author.avatarUrl,
40
+ body: comment.body,
41
+ status: comment.status,
42
+ likes: comment.likes,
43
+ isLikedByCurrentUser: likedCommentIds.has(comment.id),
44
+ editedAt: comment.editedAt?.toISOString() ?? null,
45
+ createdAt: comment.createdAt.toISOString(),
46
+ updatedAt: comment.updatedAt.toISOString(),
47
+ replyCount
48
+ };
49
+ }
50
+ function buildBaseConditions(params) {
51
+ const conditions = [];
52
+ if (params.resourceId) {
53
+ conditions.push({
54
+ field: "resourceId",
55
+ value: params.resourceId,
56
+ operator: "eq"
57
+ });
58
+ }
59
+ if (params.resourceType) {
60
+ conditions.push({
61
+ field: "resourceType",
62
+ value: params.resourceType,
63
+ operator: "eq"
64
+ });
65
+ }
66
+ if (params.parentId !== void 0) {
67
+ const parentValue = params.parentId === null || params.parentId === "null" ? null : params.parentId;
68
+ conditions.push({ field: "parentId", value: parentValue, operator: "eq" });
69
+ }
70
+ if (params.authorId) {
71
+ conditions.push({
72
+ field: "authorId",
73
+ value: params.authorId,
74
+ operator: "eq"
75
+ });
76
+ }
77
+ return conditions;
78
+ }
79
+ async function listComments(adapter, params, resolveUser) {
80
+ const limit = params.limit ?? 20;
81
+ const offset = params.offset ?? 0;
82
+ const sortDirection = params.sort ?? "asc";
83
+ const omitStatusFilter = !!params.authorId && !params.status;
84
+ const statusFilter = omitStatusFilter ? null : params.status ?? "approved";
85
+ const baseConditions = buildBaseConditions(params);
86
+ let comments;
87
+ let total;
88
+ if (!omitStatusFilter && statusFilter === "approved" && params.currentUserId) {
89
+ const [ownPendingAll, approvedCount] = await Promise.all([
90
+ adapter.findMany({
91
+ model: "comment",
92
+ where: [
93
+ ...baseConditions,
94
+ { field: "status", value: "pending", operator: "eq" },
95
+ { field: "authorId", value: params.currentUserId, operator: "eq" }
96
+ ],
97
+ sortBy: { field: "createdAt", direction: sortDirection }
98
+ }),
99
+ adapter.count({
100
+ model: "comment",
101
+ where: [
102
+ ...baseConditions,
103
+ { field: "status", value: "approved", operator: "eq" }
104
+ ]
105
+ })
106
+ ]);
107
+ total = approvedCount + ownPendingAll.length;
108
+ if (ownPendingAll.length === 0) {
109
+ comments = await adapter.findMany({
110
+ model: "comment",
111
+ limit,
112
+ offset,
113
+ where: [
114
+ ...baseConditions,
115
+ { field: "status", value: "approved", operator: "eq" }
116
+ ],
117
+ sortBy: { field: "createdAt", direction: sortDirection }
118
+ });
119
+ } else {
120
+ const dateOp = sortDirection === "asc" ? "lt" : "gt";
121
+ const pendingWithPositions = await Promise.all(
122
+ ownPendingAll.map(async (p, i) => {
123
+ const approvedBefore = await adapter.count({
124
+ model: "comment",
125
+ where: [
126
+ ...baseConditions,
127
+ { field: "status", value: "approved", operator: "eq" },
128
+ {
129
+ field: "createdAt",
130
+ value: p.createdAt,
131
+ operator: dateOp
132
+ }
133
+ ]
134
+ });
135
+ return { comment: p, mergedPosition: approvedBefore + i };
136
+ })
137
+ );
138
+ const pendingInWindow = pendingWithPositions.filter(
139
+ ({ mergedPosition }) => mergedPosition >= offset && mergedPosition < offset + limit
140
+ );
141
+ const countPendingBeforeWindow = pendingWithPositions.filter(
142
+ ({ mergedPosition }) => mergedPosition < offset
143
+ ).length;
144
+ const approvedOffset = Math.max(0, offset - countPendingBeforeWindow);
145
+ const approvedLimit = limit - pendingInWindow.length;
146
+ const approvedPage = approvedLimit > 0 ? await adapter.findMany({
147
+ model: "comment",
148
+ limit: approvedLimit,
149
+ offset: approvedOffset,
150
+ where: [
151
+ ...baseConditions,
152
+ { field: "status", value: "approved", operator: "eq" }
153
+ ],
154
+ sortBy: { field: "createdAt", direction: sortDirection }
155
+ }) : [];
156
+ const merged = [
157
+ ...approvedPage,
158
+ ...pendingInWindow.map(({ comment }) => comment)
159
+ ];
160
+ merged.sort((a, b) => {
161
+ const diff = a.createdAt.getTime() - b.createdAt.getTime();
162
+ return sortDirection === "desc" ? -diff : diff;
163
+ });
164
+ comments = merged;
165
+ }
166
+ } else {
167
+ const where = [...baseConditions];
168
+ if (statusFilter !== null) {
169
+ where.push({
170
+ field: "status",
171
+ value: statusFilter,
172
+ operator: "eq"
173
+ });
174
+ }
175
+ const [found, count] = await Promise.all([
176
+ adapter.findMany({
177
+ model: "comment",
178
+ limit,
179
+ offset,
180
+ where,
181
+ sortBy: { field: "createdAt", direction: sortDirection }
182
+ }),
183
+ adapter.count({ model: "comment", where })
184
+ ]);
185
+ comments = found;
186
+ total = count;
187
+ }
188
+ const authorIds = comments.map((c) => c.authorId);
189
+ const authorMap = await resolveAuthors(authorIds, resolveUser);
190
+ const likedCommentIds = /* @__PURE__ */ new Set();
191
+ if (params.currentUserId && comments.length > 0) {
192
+ const commentIds = comments.map((c) => c.id);
193
+ const likes = await Promise.all(
194
+ commentIds.map(
195
+ (commentId) => adapter.findOne({
196
+ model: "commentLike",
197
+ where: [
198
+ { field: "commentId", value: commentId, operator: "eq" },
199
+ {
200
+ field: "authorId",
201
+ value: params.currentUserId,
202
+ operator: "eq"
203
+ }
204
+ ]
205
+ })
206
+ )
207
+ );
208
+ likes.forEach((like, i) => {
209
+ if (like) likedCommentIds.add(commentIds[i]);
210
+ });
211
+ }
212
+ const replyCounts = /* @__PURE__ */ new Map();
213
+ const isTopLevelQuery = params.parentId === null || params.parentId === "null";
214
+ if (isTopLevelQuery && comments.length > 0) {
215
+ await Promise.all(
216
+ comments.map(async (c) => {
217
+ const approvedCount = await adapter.count({
218
+ model: "comment",
219
+ where: [
220
+ { field: "parentId", value: c.id, operator: "eq" },
221
+ { field: "status", value: "approved", operator: "eq" }
222
+ ]
223
+ });
224
+ let ownPendingCount = 0;
225
+ if (params.currentUserId) {
226
+ ownPendingCount = await adapter.count({
227
+ model: "comment",
228
+ where: [
229
+ { field: "parentId", value: c.id, operator: "eq" },
230
+ { field: "status", value: "pending", operator: "eq" },
231
+ {
232
+ field: "authorId",
233
+ value: params.currentUserId,
234
+ operator: "eq"
235
+ }
236
+ ]
237
+ });
238
+ }
239
+ replyCounts.set(c.id, approvedCount + ownPendingCount);
240
+ })
241
+ );
242
+ }
243
+ const items = comments.map(
244
+ (c) => enrichComment(c, authorMap, likedCommentIds, replyCounts.get(c.id) ?? 0)
245
+ );
246
+ return { items, total, limit, offset };
247
+ }
248
+ async function getCommentById(adapter, id, resolveUser, currentUserId) {
249
+ const comment = await adapter.findOne({
250
+ model: "comment",
251
+ where: [{ field: "id", value: id, operator: "eq" }]
252
+ });
253
+ if (!comment) return null;
254
+ const authorMap = await resolveAuthors([comment.authorId], resolveUser);
255
+ const likedCommentIds = /* @__PURE__ */ new Set();
256
+ if (currentUserId) {
257
+ const like = await adapter.findOne({
258
+ model: "commentLike",
259
+ where: [
260
+ { field: "commentId", value: id, operator: "eq" },
261
+ { field: "authorId", value: currentUserId, operator: "eq" }
262
+ ]
263
+ });
264
+ if (like) likedCommentIds.add(id);
265
+ }
266
+ return enrichComment(comment, authorMap, likedCommentIds);
267
+ }
268
+ async function getCommentCount(adapter, params) {
269
+ const whereConditions = [
270
+ { field: "resourceId", value: params.resourceId, operator: "eq" },
271
+ { field: "resourceType", value: params.resourceType, operator: "eq" }
272
+ ];
273
+ const statusFilter = params.status ?? "approved";
274
+ whereConditions.push({
275
+ field: "status",
276
+ value: statusFilter,
277
+ operator: "eq"
278
+ });
279
+ return adapter.count({ model: "comment", where: whereConditions });
280
+ }
281
+
282
+ exports.getCommentById = getCommentById;
283
+ exports.getCommentCount = getCommentCount;
284
+ exports.listComments = listComments;