@atproto/bsky 0.0.241 → 0.0.243

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 (328) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/api/age-assurance/const.d.ts +1 -1
  3. package/dist/api/age-assurance/index.d.ts.map +1 -1
  4. package/dist/api/age-assurance/kws/age-verified.d.ts +13 -13
  5. package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -1
  6. package/dist/api/age-assurance/kws/external-payload.d.ts +4 -4
  7. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -1
  8. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -1
  9. package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
  10. package/dist/api/app/bsky/actor/searchActors.js +7 -3
  11. package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
  12. package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts.map +1 -1
  13. package/dist/api/app/bsky/actor/searchActorsTypeahead.js +7 -3
  14. package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
  15. package/dist/api/app/bsky/bookmark/util.d.ts.map +1 -1
  16. package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
  17. package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
  18. package/dist/api/app/bsky/feed/getListFeed.d.ts.map +1 -1
  19. package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
  20. package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
  21. package/dist/api/app/bsky/feed/searchPosts.js +8 -3
  22. package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
  23. package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
  24. package/dist/api/app/bsky/graph/searchStarterPacks.js +7 -3
  25. package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
  26. package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
  27. package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
  28. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.d.ts.map +1 -1
  29. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js +3 -2
  30. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
  31. package/dist/api/external.d.ts.map +1 -1
  32. package/dist/api/health.d.ts.map +1 -1
  33. package/dist/api/kws/api.d.ts.map +1 -1
  34. package/dist/api/kws/index.d.ts.map +1 -1
  35. package/dist/api/kws/types.d.ts +6 -6
  36. package/dist/api/kws/util.d.ts +1 -1
  37. package/dist/api/kws/util.d.ts.map +1 -1
  38. package/dist/api/kws/webhook.d.ts.map +1 -1
  39. package/dist/api/sitemap.d.ts.map +1 -1
  40. package/dist/api/util.d.ts +5 -0
  41. package/dist/api/util.d.ts.map +1 -1
  42. package/dist/api/util.js +11 -0
  43. package/dist/api/util.js.map +1 -1
  44. package/dist/api/well-known.d.ts.map +1 -1
  45. package/dist/auth-verifier.d.ts +2 -2
  46. package/dist/auth-verifier.d.ts.map +1 -1
  47. package/dist/bsync.d.ts.map +1 -1
  48. package/dist/cache/read-through.d.ts.map +1 -1
  49. package/dist/cache/read-through.js.map +1 -1
  50. package/dist/config.d.ts +6 -4
  51. package/dist/config.d.ts.map +1 -1
  52. package/dist/config.js +5 -0
  53. package/dist/config.js.map +1 -1
  54. package/dist/context.d.ts.map +1 -1
  55. package/dist/context.js.map +1 -1
  56. package/dist/courier.d.ts.map +1 -1
  57. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  58. package/dist/data-plane/bsync/index.js.map +1 -1
  59. package/dist/data-plane/client/hosts.d.ts.map +1 -1
  60. package/dist/data-plane/client/index.d.ts.map +1 -1
  61. package/dist/data-plane/client/util.d.ts.map +1 -1
  62. package/dist/data-plane/server/background.d.ts.map +1 -1
  63. package/dist/data-plane/server/db/db.d.ts +4 -5
  64. package/dist/data-plane/server/db/db.d.ts.map +1 -1
  65. package/dist/data-plane/server/db/db.js +2 -1
  66. package/dist/data-plane/server/db/db.js.map +1 -1
  67. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.d.ts.map +1 -1
  68. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js +2 -4
  69. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js.map +1 -1
  70. package/dist/data-plane/server/db/migrations/provider.d.ts +2 -1
  71. package/dist/data-plane/server/db/migrations/provider.d.ts.map +1 -1
  72. package/dist/data-plane/server/db/migrations/provider.js.map +1 -1
  73. package/dist/data-plane/server/db/pagination.d.ts +4 -3
  74. package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
  75. package/dist/data-plane/server/db/pagination.js +8 -8
  76. package/dist/data-plane/server/db/pagination.js.map +1 -1
  77. package/dist/data-plane/server/db/util.d.ts +5 -5
  78. package/dist/data-plane/server/db/util.d.ts.map +1 -1
  79. package/dist/data-plane/server/db/util.js.map +1 -1
  80. package/dist/data-plane/server/index.d.ts.map +1 -1
  81. package/dist/data-plane/server/index.js.map +1 -1
  82. package/dist/data-plane/server/indexing/index.d.ts +78 -78
  83. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  84. package/dist/data-plane/server/indexing/index.js.map +1 -1
  85. package/dist/data-plane/server/indexing/plugins/block.d.ts +9 -4
  86. package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
  87. package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts.map +1 -1
  88. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts +13 -4
  89. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
  90. package/dist/data-plane/server/indexing/plugins/follow.d.ts +9 -4
  91. package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
  92. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -1
  93. package/dist/data-plane/server/indexing/plugins/labeler.d.ts +8 -4
  94. package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
  95. package/dist/data-plane/server/indexing/plugins/like.d.ts +12 -4
  96. package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
  97. package/dist/data-plane/server/indexing/plugins/list-block.d.ts +9 -4
  98. package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
  99. package/dist/data-plane/server/indexing/plugins/list-item.d.ts +10 -4
  100. package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
  101. package/dist/data-plane/server/indexing/plugins/list.d.ts +13 -4
  102. package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
  103. package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts.map +1 -1
  104. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -1
  105. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  106. package/dist/data-plane/server/indexing/plugins/post.js +4 -3
  107. package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
  108. package/dist/data-plane/server/indexing/plugins/profile.d.ts.map +1 -1
  109. package/dist/data-plane/server/indexing/plugins/repost.d.ts +12 -4
  110. package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
  111. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts +9 -4
  112. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
  113. package/dist/data-plane/server/indexing/plugins/status.d.ts.map +1 -1
  114. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
  115. package/dist/data-plane/server/indexing/plugins/verification.d.ts +12 -4
  116. package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
  117. package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
  118. package/dist/data-plane/server/indexing/processor.js.map +1 -1
  119. package/dist/data-plane/server/routes/activity-subscription.d.ts.map +1 -1
  120. package/dist/data-plane/server/routes/blocks.d.ts.map +1 -1
  121. package/dist/data-plane/server/routes/blocks.js +22 -14
  122. package/dist/data-plane/server/routes/blocks.js.map +1 -1
  123. package/dist/data-plane/server/routes/bookmarks.d.ts.map +1 -1
  124. package/dist/data-plane/server/routes/drafts.d.ts.map +1 -1
  125. package/dist/data-plane/server/routes/feed-gens.d.ts.map +1 -1
  126. package/dist/data-plane/server/routes/feed-gens.js +2 -2
  127. package/dist/data-plane/server/routes/feed-gens.js.map +1 -1
  128. package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
  129. package/dist/data-plane/server/routes/feeds.js +18 -16
  130. package/dist/data-plane/server/routes/feeds.js.map +1 -1
  131. package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
  132. package/dist/data-plane/server/routes/identity.d.ts.map +1 -1
  133. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  134. package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
  135. package/dist/data-plane/server/routes/labels.d.ts.map +1 -1
  136. package/dist/data-plane/server/routes/labels.js +1 -1
  137. package/dist/data-plane/server/routes/labels.js.map +1 -1
  138. package/dist/data-plane/server/routes/likes.d.ts.map +1 -1
  139. package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
  140. package/dist/data-plane/server/routes/moderation.d.ts.map +1 -1
  141. package/dist/data-plane/server/routes/mutes.d.ts.map +1 -1
  142. package/dist/data-plane/server/routes/mutes.js +2 -2
  143. package/dist/data-plane/server/routes/mutes.js.map +1 -1
  144. package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
  145. package/dist/data-plane/server/routes/notifs.js +10 -9
  146. package/dist/data-plane/server/routes/notifs.js.map +1 -1
  147. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  148. package/dist/data-plane/server/routes/quotes.d.ts.map +1 -1
  149. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  150. package/dist/data-plane/server/routes/relationships.d.ts.map +1 -1
  151. package/dist/data-plane/server/routes/relationships.js.map +1 -1
  152. package/dist/data-plane/server/routes/reposts.d.ts.map +1 -1
  153. package/dist/data-plane/server/routes/search.d.ts.map +1 -1
  154. package/dist/data-plane/server/routes/site-standard.d.ts.map +1 -1
  155. package/dist/data-plane/server/routes/sitemap.d.ts.map +1 -1
  156. package/dist/data-plane/server/routes/starter-packs.d.ts.map +1 -1
  157. package/dist/data-plane/server/routes/suggestions.d.ts.map +1 -1
  158. package/dist/data-plane/server/routes/suggestions.js +2 -2
  159. package/dist/data-plane/server/routes/suggestions.js.map +1 -1
  160. package/dist/data-plane/server/routes/sync.d.ts.map +1 -1
  161. package/dist/data-plane/server/routes/threads.d.ts.map +1 -1
  162. package/dist/data-plane/server/subscription.d.ts.map +1 -1
  163. package/dist/data-plane/server/subscription.js.map +1 -1
  164. package/dist/data-plane/server/util.d.ts +31 -23
  165. package/dist/data-plane/server/util.d.ts.map +1 -1
  166. package/dist/etcd.d.ts.map +1 -1
  167. package/dist/etcd.js.map +1 -1
  168. package/dist/feature-gates/index.d.ts.map +1 -1
  169. package/dist/feature-gates/metrics.d.ts.map +1 -1
  170. package/dist/feature-gates/metrics.js.map +1 -1
  171. package/dist/hydration/actor.d.ts.map +1 -1
  172. package/dist/hydration/actor.js.map +1 -1
  173. package/dist/hydration/external.d.ts.map +1 -1
  174. package/dist/hydration/external.js.map +1 -1
  175. package/dist/hydration/feed.d.ts.map +1 -1
  176. package/dist/hydration/feed.js.map +1 -1
  177. package/dist/hydration/graph.d.ts.map +1 -1
  178. package/dist/hydration/graph.js.map +1 -1
  179. package/dist/hydration/hydrator.d.ts +1 -1
  180. package/dist/hydration/hydrator.d.ts.map +1 -1
  181. package/dist/hydration/hydrator.js.map +1 -1
  182. package/dist/hydration/label.d.ts.map +1 -1
  183. package/dist/hydration/label.js.map +1 -1
  184. package/dist/hydration/util.d.ts.map +1 -1
  185. package/dist/image/invalidator.d.ts.map +1 -1
  186. package/dist/image/invalidator.js.map +1 -1
  187. package/dist/image/logger.d.ts.map +1 -1
  188. package/dist/image/server.d.ts.map +1 -1
  189. package/dist/image/server.js.map +1 -1
  190. package/dist/image/sharp.d.ts +1 -1
  191. package/dist/image/uri.d.ts.map +1 -1
  192. package/dist/image/uri.js.map +1 -1
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/kws.d.ts.map +1 -1
  195. package/dist/kws.js.map +1 -1
  196. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +75 -155
  197. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  198. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts +100 -300
  199. package/dist/lexicons/app/bsky/actor/profile.defs.d.ts.map +1 -1
  200. package/dist/lexicons/app/bsky/actor/status.defs.d.ts +40 -40
  201. package/dist/lexicons/app/bsky/actor/status.defs.d.ts.map +1 -1
  202. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts +4 -4
  203. package/dist/lexicons/app/bsky/draft/defs.defs.d.ts.map +1 -1
  204. package/dist/lexicons/app/bsky/embed/external.defs.d.ts +10 -10
  205. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts +10 -42
  206. package/dist/lexicons/app/bsky/embed/gallery.defs.d.ts.map +1 -1
  207. package/dist/lexicons/app/bsky/embed/images.defs.d.ts +10 -10
  208. package/dist/lexicons/app/bsky/embed/record.defs.d.ts +10 -10
  209. package/dist/lexicons/app/bsky/embed/recordWithMedia.defs.d.ts +10 -10
  210. package/dist/lexicons/app/bsky/embed/video.defs.d.ts +50 -162
  211. package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
  212. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts +80 -160
  213. package/dist/lexicons/app/bsky/feed/generator.defs.d.ts.map +1 -1
  214. package/dist/lexicons/app/bsky/feed/like.defs.d.ts +30 -30
  215. package/dist/lexicons/app/bsky/feed/like.defs.d.ts.map +1 -1
  216. package/dist/lexicons/app/bsky/feed/post.defs.d.ts +80 -200
  217. package/dist/lexicons/app/bsky/feed/post.defs.d.ts.map +1 -1
  218. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts +40 -80
  219. package/dist/lexicons/app/bsky/feed/postgate.defs.d.ts.map +1 -1
  220. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts +30 -30
  221. package/dist/lexicons/app/bsky/feed/repost.defs.d.ts.map +1 -1
  222. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts +30 -30
  223. package/dist/lexicons/app/bsky/feed/threadgate.defs.d.ts.map +1 -1
  224. package/dist/lexicons/app/bsky/graph/block.defs.d.ts +20 -20
  225. package/dist/lexicons/app/bsky/graph/block.defs.d.ts.map +1 -1
  226. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts +30 -30
  227. package/dist/lexicons/app/bsky/graph/follow.defs.d.ts.map +1 -1
  228. package/dist/lexicons/app/bsky/graph/list.defs.d.ts +70 -70
  229. package/dist/lexicons/app/bsky/graph/list.defs.d.ts.map +1 -1
  230. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts +20 -20
  231. package/dist/lexicons/app/bsky/graph/listblock.defs.d.ts.map +1 -1
  232. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts +20 -20
  233. package/dist/lexicons/app/bsky/graph/listitem.defs.d.ts.map +1 -1
  234. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts +50 -90
  235. package/dist/lexicons/app/bsky/graph/starterpack.defs.d.ts.map +1 -1
  236. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts +30 -30
  237. package/dist/lexicons/app/bsky/graph/verification.defs.d.ts.map +1 -1
  238. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts +60 -140
  239. package/dist/lexicons/app/bsky/labeler/service.defs.d.ts.map +1 -1
  240. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts +10 -10
  241. package/dist/lexicons/app/bsky/notification/declaration.defs.d.ts.map +1 -1
  242. package/dist/lexicons/app/bsky/richtext/facet.defs.d.ts +10 -10
  243. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +20 -20
  244. package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
  245. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +17 -0
  246. package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
  247. package/dist/lexicons/chat/bsky/convo/defs.defs.js +11 -0
  248. package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
  249. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts +7 -3
  250. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.d.ts.map +1 -1
  251. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js +5 -2
  252. package/dist/lexicons/chat/bsky/convo/getUnreadCounts.defs.js.map +1 -1
  253. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +1 -1
  254. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
  255. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +1 -0
  256. package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
  257. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +1 -1
  258. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
  259. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +1 -0
  260. package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
  261. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts +10 -42
  262. package/dist/lexicons/chat/bsky/embed/joinLink.defs.d.ts.map +1 -1
  263. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts +10 -10
  264. package/dist/lexicons/com/atproto/lexicon/schema.defs.d.ts.map +1 -1
  265. package/dist/lexicons/com/atproto/repo/strongRef.defs.d.ts +10 -10
  266. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts +40 -120
  267. package/dist/lexicons/com/germnetwork/declaration.defs.d.ts.map +1 -1
  268. package/dist/lexicons/site/standard/document.defs.d.ts +140 -460
  269. package/dist/lexicons/site/standard/document.defs.d.ts.map +1 -1
  270. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts +10 -10
  271. package/dist/lexicons/site/standard/graph/recommend.defs.d.ts.map +1 -1
  272. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts +20 -60
  273. package/dist/lexicons/site/standard/graph/subscription.defs.d.ts.map +1 -1
  274. package/dist/lexicons/site/standard/publication.defs.d.ts +60 -220
  275. package/dist/lexicons/site/standard/publication.defs.d.ts.map +1 -1
  276. package/dist/lexicons/site/standard/theme/basic.defs.d.ts +10 -10
  277. package/dist/lexicons/site/standard/theme/basic.defs.d.ts.map +1 -1
  278. package/dist/lexicons/tools/ozone/moderation/queryStatuses.defs.d.ts +2 -2
  279. package/dist/lexicons/tools/ozone/set/querySets.defs.d.ts +2 -2
  280. package/dist/pipeline.d.ts.map +1 -1
  281. package/dist/proto/bsky_connect.d.ts.map +1 -1
  282. package/dist/proto/bsky_pb.d.ts.map +1 -1
  283. package/dist/proto/bsky_pb.js.map +1 -1
  284. package/dist/proto/bsync_connect.d.ts.map +1 -1
  285. package/dist/proto/bsync_pb.d.ts.map +1 -1
  286. package/dist/proto/bsync_pb.js.map +1 -1
  287. package/dist/proto/courier_connect.d.ts.map +1 -1
  288. package/dist/proto/courier_pb.d.ts.map +1 -1
  289. package/dist/proto/courier_pb.js.map +1 -1
  290. package/dist/proto/rolodex_connect.d.ts.map +1 -1
  291. package/dist/proto/rolodex_pb.d.ts.map +1 -1
  292. package/dist/proto/rolodex_pb.js.map +1 -1
  293. package/dist/redis.d.ts.map +1 -1
  294. package/dist/rolodex.d.ts.map +1 -1
  295. package/dist/stash.d.ts.map +1 -1
  296. package/dist/stash.js.map +1 -1
  297. package/dist/util/debug.d.ts.map +1 -1
  298. package/dist/util/standard-site.d.ts.map +1 -1
  299. package/dist/util.d.ts.map +1 -1
  300. package/dist/views/index.d.ts.map +1 -1
  301. package/dist/views/types.d.ts +1 -1
  302. package/dist/views/types.d.ts.map +1 -1
  303. package/dist/views/util.d.ts.map +1 -1
  304. package/dist/views/util.js.map +1 -1
  305. package/package.json +17 -18
  306. package/src/api/app/bsky/actor/searchActors.ts +17 -6
  307. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +11 -5
  308. package/src/api/app/bsky/feed/searchPosts.ts +12 -5
  309. package/src/api/app/bsky/graph/searchStarterPacks.ts +14 -5
  310. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +9 -2
  311. package/src/api/util.ts +17 -0
  312. package/src/config.ts +9 -0
  313. package/src/data-plane/server/db/db.ts +1 -1
  314. package/src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts +2 -4
  315. package/src/data-plane/server/db/migrations/provider.ts +2 -1
  316. package/src/data-plane/server/db/pagination.ts +15 -15
  317. package/src/data-plane/server/db/util.ts +8 -5
  318. package/src/data-plane/server/indexing/plugins/post.ts +5 -4
  319. package/src/data-plane/server/routes/blocks.ts +30 -24
  320. package/src/data-plane/server/routes/feed-gens.ts +2 -2
  321. package/src/data-plane/server/routes/feeds.ts +23 -19
  322. package/src/data-plane/server/routes/labels.ts +2 -2
  323. package/src/data-plane/server/routes/mutes.ts +8 -6
  324. package/src/data-plane/server/routes/notifs.ts +15 -12
  325. package/src/data-plane/server/routes/relationships.ts +4 -2
  326. package/src/data-plane/server/routes/suggestions.ts +2 -2
  327. package/tests/data-plane/subscription.test.ts +18 -16
  328. package/tsconfig.build.tsbuildinfo +1 -1
@@ -14,7 +14,7 @@ import {
14
14
  createPipeline,
15
15
  } from '../../../../pipeline.js'
16
16
  import { Views } from '../../../../views/index.js'
17
- import { resHeaders } from '../../../util.js'
17
+ import { resHeaders, resolveSearchV2Override } from '../../../util.js'
18
18
 
19
19
  export default function (server: Server, ctx: AppContext) {
20
20
  const searchActors = createPipeline(
@@ -41,7 +41,14 @@ export default function (server: Server, ctx: AppContext) {
41
41
  }),
42
42
  ),
43
43
  })
44
- const results = await searchActors({ ...params, hydrateCtx }, ctx)
44
+ const results = await searchActors(
45
+ {
46
+ ...params,
47
+ hydrateCtx,
48
+ isV2Override: resolveSearchV2Override(req, ctx.cfg),
49
+ },
50
+ ctx,
51
+ )
45
52
  return {
46
53
  encoding: 'application/json',
47
54
  body: results,
@@ -109,9 +116,10 @@ const skeletonV2 = async (
109
116
  }
110
117
 
111
118
  const skeleton = async (input: SkeletonFnInput<Context, Params>) => {
112
- const useV2 = input.params.hydrateCtx.features.checkGate(
113
- input.params.hydrateCtx.features.Gate.SearchV2Enable,
114
- )
119
+ const useV2 =
120
+ input.params.hydrateCtx.features.checkGate(
121
+ input.params.hydrateCtx.features.Gate.SearchV2Enable,
122
+ ) || input.params.isV2Override
115
123
  const skeletonFn = useV2 ? skeletonV2 : skeletonV1
116
124
  return skeletonFn(input)
117
125
  }
@@ -151,7 +159,10 @@ type Context = {
151
159
  searchClient?: Client
152
160
  }
153
161
 
154
- type Params = app.bsky.actor.searchActors.$Params & { hydrateCtx: HydrateCtx }
162
+ type Params = app.bsky.actor.searchActors.$Params & {
163
+ hydrateCtx: HydrateCtx
164
+ isV2Override: boolean
165
+ }
155
166
 
156
167
  type Skeleton = {
157
168
  dids: DidString[]
@@ -13,7 +13,7 @@ import {
13
13
  createPipeline,
14
14
  } from '../../../../pipeline.js'
15
15
  import { Views } from '../../../../views/index.js'
16
- import { resHeaders } from '../../../util.js'
16
+ import { resHeaders, resolveSearchV2Override } from '../../../util.js'
17
17
 
18
18
  export default function (server: Server, ctx: AppContext) {
19
19
  const searchActorsTypeahead = createPipeline(
@@ -38,7 +38,11 @@ export default function (server: Server, ctx: AppContext) {
38
38
  ),
39
39
  })
40
40
  const results = await searchActorsTypeahead(
41
- { ...params, hydrateCtx },
41
+ {
42
+ ...params,
43
+ hydrateCtx,
44
+ isV2Override: resolveSearchV2Override(req, ctx.cfg),
45
+ },
42
46
  ctx,
43
47
  )
44
48
  return {
@@ -101,9 +105,10 @@ const skeletonV2 = async (
101
105
  }
102
106
 
103
107
  const skeleton = async (input: SkeletonFnInput<Context, Params>) => {
104
- const useV2 = input.params.hydrateCtx.features.checkGate(
105
- input.params.hydrateCtx.features.Gate.SearchV2Enable,
106
- )
108
+ const useV2 =
109
+ input.params.hydrateCtx.features.checkGate(
110
+ input.params.hydrateCtx.features.Gate.SearchV2Enable,
111
+ ) || input.params.isV2Override
107
112
  const skeletonFn = useV2 ? skeletonV2 : skeletonV1
108
113
  return skeletonFn(input)
109
114
  }
@@ -149,6 +154,7 @@ type Context = {
149
154
 
150
155
  type Params = app.bsky.actor.searchActorsTypeahead.$Params & {
151
156
  hydrateCtx: HydrateCtx
157
+ isV2Override: boolean
152
158
  }
153
159
 
154
160
  type Skeleton = {
@@ -22,7 +22,7 @@ import {
22
22
  import { SearchSortOrder } from '../../../../proto/bsky_pb.js'
23
23
  import { uriToDid as creatorFromUri } from '../../../../util/uris.js'
24
24
  import { Views } from '../../../../views/index.js'
25
- import { resHeaders } from '../../../util.js'
25
+ import { resHeaders, resolveSearchV2Override } from '../../../util.js'
26
26
 
27
27
  export default function (server: Server, ctx: AppContext) {
28
28
  const searchPosts = createPipeline(
@@ -50,7 +50,12 @@ export default function (server: Server, ctx: AppContext) {
50
50
  ),
51
51
  })
52
52
  const results = await searchPosts(
53
- { ...params, hydrateCtx, isModService },
53
+ {
54
+ ...params,
55
+ hydrateCtx,
56
+ isModService,
57
+ isV2Override: resolveSearchV2Override(req, ctx.cfg),
58
+ },
54
59
  ctx,
55
60
  )
56
61
  return {
@@ -146,9 +151,10 @@ const skeletonV2 = async (
146
151
  }
147
152
 
148
153
  const skeleton = async (input: SkeletonFnInput<Context, Params>) => {
149
- const useV2 = input.params.hydrateCtx.features.checkGate(
150
- input.params.hydrateCtx.features.Gate.SearchV2Enable,
151
- )
154
+ const useV2 =
155
+ input.params.hydrateCtx.features.checkGate(
156
+ input.params.hydrateCtx.features.Gate.SearchV2Enable,
157
+ ) || input.params.isV2Override
152
158
  const skeletonFn = useV2 ? skeletonV2 : skeletonV1
153
159
  return skeletonFn(input)
154
160
  }
@@ -237,6 +243,7 @@ type Context = {
237
243
  type Params = app.bsky.feed.searchPosts.$Params & {
238
244
  hydrateCtx: HydrateCtx
239
245
  isModService: boolean
246
+ isV2Override: boolean
240
247
  }
241
248
 
242
249
  type Skeleton = {
@@ -15,7 +15,7 @@ import {
15
15
  } from '../../../../pipeline.js'
16
16
  import { uriToDid as creatorFromUri } from '../../../../util/uris.js'
17
17
  import { Views } from '../../../../views/index.js'
18
- import { resHeaders } from '../../../util.js'
18
+ import { resHeaders, resolveSearchV2Override } from '../../../util.js'
19
19
 
20
20
  export default function (server: Server, ctx: AppContext) {
21
21
  const searchStarterPacks = createPipeline(
@@ -42,7 +42,14 @@ export default function (server: Server, ctx: AppContext) {
42
42
  }),
43
43
  ),
44
44
  })
45
- const results = await searchStarterPacks({ ...params, hydrateCtx }, ctx)
45
+ const results = await searchStarterPacks(
46
+ {
47
+ ...params,
48
+ hydrateCtx,
49
+ isV2Override: resolveSearchV2Override(req, ctx.cfg),
50
+ },
51
+ ctx,
52
+ )
46
53
  return {
47
54
  encoding: 'application/json',
48
55
  body: results,
@@ -107,9 +114,10 @@ const skeletonV2 = async (
107
114
  }
108
115
 
109
116
  const skeleton = async (input: SkeletonFnInput<Context, Params>) => {
110
- const useV2 = input.params.hydrateCtx.features.checkGate(
111
- input.params.hydrateCtx.features.Gate.SearchV2Enable,
112
- )
117
+ const useV2 =
118
+ input.params.hydrateCtx.features.checkGate(
119
+ input.params.hydrateCtx.features.Gate.SearchV2Enable,
120
+ ) || input.params.isV2Override
113
121
  const skeletonFn = useV2 ? skeletonV2 : skeletonV1
114
122
  return skeletonFn(input)
115
123
  }
@@ -152,6 +160,7 @@ type Context = {
152
160
 
153
161
  type Params = app.bsky.graph.searchStarterPacks.$Params & {
154
162
  hydrateCtx: HydrateCtx
163
+ isV2Override: boolean
155
164
  }
156
165
 
157
166
  type Skeleton = {
@@ -4,7 +4,11 @@ import { Server } from '@atproto/xrpc-server'
4
4
  import { AppContext } from '../../../../context.js'
5
5
  import { parseString } from '../../../../hydration/util.js'
6
6
  import { app } from '../../../../lexicons/index.js'
7
- import { clearlyBadCursor, resHeaders } from '../../../util.js'
7
+ import {
8
+ clearlyBadCursor,
9
+ resHeaders,
10
+ resolveSearchV2Override,
11
+ } from '../../../util.js'
8
12
 
9
13
  // THIS IS A TEMPORARY UNSPECCED ROUTE
10
14
  // @TODO currently mirrors getSuggestedFeeds and ignores the "query" param.
@@ -37,9 +41,12 @@ export default function (server: Server, ctx: AppContext) {
37
41
  let uris: AtUriString[]
38
42
  let cursor: string | undefined
39
43
 
44
+ const isV2Override = resolveSearchV2Override(req, ctx.cfg)
45
+
40
46
  const query = params.query?.trim() ?? ''
41
47
  if (query) {
42
- const useV2 = features.checkGate(features.Gate.SearchV2Enable)
48
+ const useV2 =
49
+ features.checkGate(features.Gate.SearchV2Enable) || isV2Override
43
50
  if (useV2) {
44
51
  const res = await ctx.dataplane.searchFeedGeneratorsV2({
45
52
  params: {
package/src/api/util.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { IncomingHttpHeaders } from 'node:http'
2
+ import { ServerConfig } from '../config.js'
1
3
  import { ParsedLabelers, formatLabelerHeader } from '../util.js'
2
4
 
3
5
  export const BSKY_USER_AGENT = 'BskyAppView'
@@ -26,3 +28,18 @@ export const clearlyBadCursor = (cursor?: string) => {
26
28
  // hallmark of v1 cursor, highly unlikely in v2 cursors based on time or rkeys
27
29
  return !!cursor?.includes('::')
28
30
  }
31
+
32
+ // @TEMPORARY backdoor to force search v2 via a request header, gated by the
33
+ // BSKY_SEARCH_V2_OVERRIDE_HEADER env var. Remove once search v2 is fully rolled out.
34
+ const SEARCH_V2_OVERRIDE_HEADER = 'x-bsky-search-v2-override'
35
+
36
+ export const resolveSearchV2Override = (
37
+ req: { headers: IncomingHttpHeaders },
38
+ cfg: ServerConfig,
39
+ ): boolean => {
40
+ const expected = cfg.searchV2OverrideHeader
41
+ if (!expected) return false
42
+ const value = req.headers[SEARCH_V2_OVERRIDE_HEADER]
43
+ const header = Array.isArray(value) ? value.join(',') : value
44
+ return header === expected
45
+ }
package/src/config.ts CHANGED
@@ -110,6 +110,7 @@ export interface ServerConfigValues {
110
110
  kws?: KwsConfig
111
111
  debugFieldAllowedDids: Set<string>
112
112
  draftsLimit: number
113
+ searchV2OverrideHeader?: string
113
114
  }
114
115
 
115
116
  export class ServerConfig {
@@ -331,6 +332,9 @@ export class ServerConfig {
331
332
  ? parseInt(process.env.BSKY_DRAFTS_LIMIT || '', 10)
332
333
  : 500
333
334
 
335
+ const searchV2OverrideHeader =
336
+ process.env.BSKY_SEARCH_V2_OVERRIDE_HEADER || undefined
337
+
334
338
  return new ServerConfig({
335
339
  version,
336
340
  debugMode,
@@ -399,6 +403,7 @@ export class ServerConfig {
399
403
  kws,
400
404
  debugFieldAllowedDids,
401
405
  draftsLimit,
406
+ searchV2OverrideHeader,
402
407
  ...noUndefinedVals(overrides ?? {}),
403
408
  })
404
409
  }
@@ -675,6 +680,10 @@ export class ServerConfig {
675
680
  get draftsLimit() {
676
681
  return this.cfg.draftsLimit
677
682
  }
683
+
684
+ get searchV2OverrideHeader() {
685
+ return this.cfg.searchV2OverrideHeader
686
+ }
678
687
  }
679
688
 
680
689
  function envList(str: string | undefined): string[] {
@@ -3,7 +3,6 @@ import EventEmitter from 'node:events'
3
3
  import {
4
4
  Kysely,
5
5
  KyselyPlugin,
6
- Migrator,
7
6
  PluginTransformQueryArgs,
8
7
  PluginTransformResultArgs,
9
8
  PostgresDialect,
@@ -11,6 +10,7 @@ import {
11
10
  RootOperationNode,
12
11
  UnknownRow,
13
12
  } from 'kysely'
13
+ import { Migrator } from 'kysely/migration'
14
14
  // eslint-disable-next-line import/default
15
15
  import pg from 'pg'
16
16
  // eslint-disable-next-line import/no-named-as-default-member
@@ -3,15 +3,13 @@ import { Kysely } from 'kysely'
3
3
  export async function up(db: Kysely<unknown>): Promise<void> {
4
4
  await db.schema
5
5
  .alterTable('actor')
6
- .alterColumn('handle')
7
- .dropNotNull()
6
+ .alterColumn('handle', (col) => col.dropNotNull())
8
7
  .execute()
9
8
  }
10
9
 
11
10
  export async function down(db: Kysely<unknown>): Promise<void> {
12
11
  await db.schema
13
12
  .alterTable('actor')
14
- .alterColumn('handle')
15
- .setNotNull()
13
+ .alterColumn('handle', (col) => col.setNotNull())
16
14
  .execute()
17
15
  }
@@ -1,4 +1,5 @@
1
- import { Kysely, Migration, MigrationProvider } from 'kysely'
1
+ import { Kysely } from 'kysely'
2
+ import { Migration, MigrationProvider } from 'kysely/migration'
2
3
 
3
4
  // Passes a context argument to migrations. We use this to thread the dialect into migrations
4
5
 
@@ -1,4 +1,4 @@
1
- import { sql } from 'kysely'
1
+ import { SqlBool, sql } from 'kysely'
2
2
  import { ensureValidRecordKey } from '@atproto/syntax'
3
3
  import { InvalidRequestError } from '@atproto/xrpc-server'
4
4
  import { AnyQb, DbRef } from './util.js'
@@ -67,16 +67,16 @@ export abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {
67
67
  if (tryIndex) {
68
68
  // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.
69
69
  if (direction === 'asc') {
70
- return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`
70
+ return sql<SqlBool>`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`
71
71
  } else {
72
- return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`
72
+ return sql<SqlBool>`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`
73
73
  }
74
74
  } else {
75
75
  // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the "or" usage.
76
76
  if (direction === 'asc') {
77
- return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`
77
+ return sql<SqlBool>`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`
78
78
  } else {
79
- return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`
79
+ return sql<SqlBool>`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`
80
80
  }
81
81
  }
82
82
  }
@@ -94,11 +94,11 @@ export abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {
94
94
  const { limit, cursor, direction = 'desc', tryIndex, nullsLast } = opts
95
95
  const keysetSql = this.getSql(this.unpack(cursor), direction, tryIndex)
96
96
  return qb
97
- .if(!!limit, (q) => q.limit(limit as number))
98
- .if(!nullsLast, (q) =>
97
+ .$if(!!limit, (q) => q.limit(limit as number))
98
+ .$if(!nullsLast, (q) =>
99
99
  q.orderBy(this.primary, direction).orderBy(this.secondary, direction),
100
100
  )
101
- .if(!!nullsLast, (q) =>
101
+ .$if(!!nullsLast, (q) =>
102
102
  q
103
103
  .orderBy(
104
104
  direction === 'asc'
@@ -111,7 +111,7 @@ export abstract class GenericKeyset<R, LR extends KeysetLabeledResult> {
111
111
  : sql`${this.secondary} desc nulls last`,
112
112
  ),
113
113
  )
114
- .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB
114
+ .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB
115
115
  }
116
116
  }
117
117
 
@@ -231,9 +231,9 @@ export abstract class GenericSingleKey<R, LR extends SingleKeyLabeledResult> {
231
231
  getSql(labeled?: LR, direction?: 'asc' | 'desc') {
232
232
  if (labeled === undefined) return
233
233
  if (direction === 'asc') {
234
- return sql`${this.primary} > ${labeled.primary}`
234
+ return sql<SqlBool>`${this.primary} > ${labeled.primary}`
235
235
  }
236
- return sql`${this.primary} < ${labeled.primary}`
236
+ return sql<SqlBool>`${this.primary} < ${labeled.primary}`
237
237
  }
238
238
  paginate<QB extends AnyQb>(
239
239
  qb: QB,
@@ -248,16 +248,16 @@ export abstract class GenericSingleKey<R, LR extends SingleKeyLabeledResult> {
248
248
  const { limit, cursor, direction = 'desc', nullsLast } = opts
249
249
  const keySql = this.getSql(this.unpack(cursor), direction)
250
250
  return qb
251
- .if(!!limit, (q) => q.limit(limit as number))
252
- .if(!nullsLast, (q) => q.orderBy(this.primary, direction))
253
- .if(!!nullsLast, (q) =>
251
+ .$if(!!limit, (q) => q.limit(limit as number))
252
+ .$if(!nullsLast, (q) => q.orderBy(this.primary, direction))
253
+ .$if(!!nullsLast, (q) =>
254
254
  q.orderBy(
255
255
  direction === 'asc'
256
256
  ? sql`${this.primary} asc nulls last`
257
257
  : sql`${this.primary} desc nulls last`,
258
258
  ),
259
259
  )
260
- .if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb)) as QB
260
+ .$if(!!keySql, (qb) => (keySql ? qb.where(keySql) : qb)) as QB
261
261
  }
262
262
  }
263
263
 
@@ -4,6 +4,7 @@ import {
4
4
  ExpressionBuilder,
5
5
  RawBuilder,
6
6
  SelectQueryBuilder,
7
+ SqlBool,
7
8
  SqliteAdapter,
8
9
  SqliteIntrospector,
9
10
  SqliteQueryCompiler,
@@ -21,7 +22,7 @@ export const actorWhereClause = (actor: string) => {
21
22
 
22
23
  // Applies to actor or record table
23
24
  export const notSoftDeletedClause = (alias: DbRef) => {
24
- return sql`${alias}."takedownRef" is null`
25
+ return sql<SqlBool>`${alias}."takedownRef" is null`
25
26
  }
26
27
 
27
28
  export const softDeleted = (actorOrRecord: { takedownRef: string | null }) => {
@@ -35,11 +36,11 @@ export const excluded = <T>(db: DatabaseSchema, col) => {
35
36
  return sql<T>`${db.dynamic.ref(`excluded.${col}`)}`
36
37
  }
37
38
 
38
- export const noMatch = sql`1 = 0`
39
+ export const noMatch = sql<SqlBool>`1 = 0`
39
40
 
40
41
  // Can be useful for large where-in clauses, to get the db to use a hash lookup on the list
41
- export const valuesList = (vals: unknown[]) => {
42
- return sql`(values (${sql.join(vals, sql`), (`)}))`
42
+ export const valuesList = <T = unknown>(vals: unknown[]) => {
43
+ return sql<T>`(values (${sql.join(vals, sql`), (`)}))`
43
44
  }
44
45
 
45
46
  export const dummyDialect = {
@@ -57,7 +58,9 @@ export const dummyDialect = {
57
58
  },
58
59
  }
59
60
 
60
- export type DbRef = RawBuilder | ReturnType<DynamicModule['ref']>
61
+ export type DbRef =
62
+ | RawBuilder<unknown>
63
+ | ReturnType<DynamicModule<unknown>['ref']>
61
64
 
62
65
  export type Subquery = ExpressionBuilder<DatabaseSchemaType, any>
63
66
 
@@ -505,10 +505,11 @@ const updateAggregates = async (db: DatabaseSchema, postIdx: IndexedPost) => {
505
505
  replyCount: db
506
506
  .selectFrom('post')
507
507
  .where('post.replyParent', '=', postIdx.post.replyParent)
508
- .where((qb) =>
509
- qb
510
- .where('post.violatesThreadGate', 'is', null)
511
- .orWhere('post.violatesThreadGate', '=', false),
508
+ .where((eb) =>
509
+ eb.or([
510
+ eb('post.violatesThreadGate', 'is', null),
511
+ eb('post.violatesThreadGate', '=', false),
512
+ ]),
512
513
  )
513
514
  .select(countAll.as('count')),
514
515
  })
@@ -8,15 +8,17 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
8
8
  const { actorDid, targetDid } = req
9
9
  const res = await db.db
10
10
  .selectFrom('actor_block')
11
- .where((qb) =>
12
- qb
13
- .where('actor_block.creator', '=', actorDid)
14
- .where('actor_block.subjectDid', '=', targetDid),
15
- )
16
- .orWhere((qb) =>
17
- qb
18
- .where('actor_block.creator', '=', targetDid)
19
- .where('actor_block.subjectDid', '=', actorDid),
11
+ .where((eb) =>
12
+ eb.or([
13
+ eb.and([
14
+ eb('actor_block.creator', '=', actorDid),
15
+ eb('actor_block.subjectDid', '=', targetDid),
16
+ ]),
17
+ eb.and([
18
+ eb('actor_block.creator', '=', targetDid),
19
+ eb('actor_block.subjectDid', '=', actorDid),
20
+ ]),
21
+ ]),
20
22
  )
21
23
  .limit(1)
22
24
  .selectAll()
@@ -58,15 +60,17 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
58
60
  const res = await db.db
59
61
  .selectFrom('list_block')
60
62
  .innerJoin('list_item', 'list_item.listUri', 'list_block.subjectUri')
61
- .where((qb) =>
62
- qb
63
- .where('list_block.creator', '=', actorDid)
64
- .where('list_item.subjectDid', '=', targetDid),
65
- )
66
- .orWhere((qb) =>
67
- qb
68
- .where('list_block.creator', '=', targetDid)
69
- .where('list_item.subjectDid', '=', actorDid),
63
+ .where((eb) =>
64
+ eb.or([
65
+ eb.and([
66
+ eb('list_block.creator', '=', actorDid),
67
+ eb('list_item.subjectDid', '=', targetDid),
68
+ ]),
69
+ eb.and([
70
+ eb('list_block.creator', '=', targetDid),
71
+ eb('list_item.subjectDid', '=', actorDid),
72
+ ]),
73
+ ]),
70
74
  )
71
75
  .limit(1)
72
76
  .selectAll('list_block')
@@ -96,12 +100,14 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
96
100
  const { ref } = db.db.dynamic
97
101
  let builder = db.db
98
102
  .selectFrom('list')
99
- .whereExists(
100
- db.db
101
- .selectFrom('list_block')
102
- .where('list_block.creator', '=', actorDid)
103
- .whereRef('list_block.subjectUri', '=', ref('list.uri'))
104
- .selectAll(),
103
+ .where(({ exists }) =>
104
+ exists(
105
+ db.db
106
+ .selectFrom('list_block')
107
+ .where('list_block.creator', '=', actorDid)
108
+ .whereRef('list_block.subjectUri', '=', ref('list.uri'))
109
+ .selectAll(),
110
+ ),
105
111
  )
106
112
  .selectAll('list')
107
113
 
@@ -34,7 +34,7 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
34
34
  const feeds = await db.db
35
35
  .selectFrom('suggested_feed')
36
36
  .orderBy('suggested_feed.order', 'asc')
37
- .if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))
37
+ .$if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))
38
38
  .limit(req.limit || 50)
39
39
  .selectAll()
40
40
  .execute()
@@ -74,7 +74,7 @@ const searchFeedGeneratorsImpl = async (
74
74
  const trimmed = query.trim()
75
75
  let builder = db.db
76
76
  .selectFrom('feed_generator')
77
- .if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))
77
+ .$if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))
78
78
  .selectAll()
79
79
  const keyset = new TimeCidKeyset(
80
80
  ref('feed_generator.createdAt'),
@@ -21,16 +21,16 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
21
21
  // only your own posts
22
22
  .where('type', '=', 'post')
23
23
  // only posts with media
24
- .where((qb) =>
25
- qb
26
- .whereExists((iqb) =>
27
- iqb
24
+ .where((eb) =>
25
+ eb.or([
26
+ eb.exists(
27
+ eb
28
28
  .selectFrom('post_embed_image')
29
29
  .select('post_embed_image.postUri')
30
30
  .whereRef('post_embed_image.postUri', '=', 'feed_item.postUri'),
31
- )
32
- .orWhereExists((iqb) =>
33
- iqb
31
+ ),
32
+ eb.exists(
33
+ eb
34
34
  .selectFrom('post_embed_gallery_image')
35
35
  .select('post_embed_gallery_image.postUri')
36
36
  .whereRef(
@@ -39,28 +39,32 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
39
39
  'feed_item.postUri',
40
40
  ),
41
41
  ),
42
+ ]),
42
43
  )
43
44
  } else if (feedType === FeedType.POSTS_WITH_VIDEO) {
44
45
  builder = builder
45
46
  // only your own posts
46
47
  .where('type', '=', 'post')
47
48
  // only posts with video
48
- .whereExists((qb) =>
49
- qb
50
- .selectFrom('post_embed_video')
51
- .select('post_embed_video.postUri')
52
- .whereRef('post_embed_video.postUri', '=', 'feed_item.postUri'),
49
+ .where(({ eb, exists }) =>
50
+ exists(
51
+ eb
52
+ .selectFrom('post_embed_video')
53
+ .select('post_embed_video.postUri')
54
+ .whereRef('post_embed_video.postUri', '=', 'feed_item.postUri'),
55
+ ),
53
56
  )
54
57
  } else if (feedType === FeedType.POSTS_NO_REPLIES) {
55
- builder = builder.where((qb) =>
56
- qb.where('post.replyParent', 'is', null).orWhere('type', '=', 'repost'),
58
+ builder = builder.where((eb) =>
59
+ eb.or([eb('post.replyParent', 'is', null), eb('type', '=', 'repost')]),
57
60
  )
58
61
  } else if (feedType === FeedType.POSTS_AND_AUTHOR_THREADS) {
59
- builder = builder.where((qb) =>
60
- qb
61
- .where('type', '=', 'repost')
62
- .orWhere('post.replyParent', 'is', null)
63
- .orWhere('post.replyRoot', 'like', `at://${actorDid}/%`),
62
+ builder = builder.where((eb) =>
63
+ eb.or([
64
+ eb('type', '=', 'repost'),
65
+ eb('post.replyParent', 'is', null),
66
+ eb('post.replyRoot', 'like', `at://${actorDid}/%`),
67
+ ]),
64
68
  )
65
69
  }
66
70
 
@@ -19,8 +19,8 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
19
19
  .selectFrom('label')
20
20
  .where('uri', 'in', subjects)
21
21
  .where('src', 'in', issuers)
22
- .where((qb) =>
23
- qb.where('exp', 'is', null).orWhere(sql`exp::timestamp > now()`),
22
+ .where((eb) =>
23
+ eb.or([eb('exp', 'is', null), sql<boolean>`exp::timestamp > now()`]),
24
24
  )
25
25
  .selectAll()
26
26
  .execute()
@@ -88,12 +88,14 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
88
88
  const { ref } = db.db.dynamic
89
89
  let builder = db.db
90
90
  .selectFrom('list')
91
- .whereExists(
92
- db.db
93
- .selectFrom('list_mute')
94
- .where('list_mute.mutedByDid', '=', actorDid)
95
- .whereRef('list_mute.listUri', '=', ref('list.uri'))
96
- .selectAll(),
91
+ .where(({ exists }) =>
92
+ exists(
93
+ db.db
94
+ .selectFrom('list_mute')
95
+ .where('list_mute.mutedByDid', '=', actorDid)
96
+ .whereRef('list_mute.listUri', '=', ref('list.uri'))
97
+ .selectAll(),
98
+ ),
97
99
  )
98
100
  .selectAll('list')
99
101