@atproto/bsky 0.0.242 → 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 (107) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
  3. package/dist/api/app/bsky/actor/searchActors.js +7 -3
  4. package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
  5. package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts.map +1 -1
  6. package/dist/api/app/bsky/actor/searchActorsTypeahead.js +7 -3
  7. package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
  8. package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
  9. package/dist/api/app/bsky/feed/searchPosts.js +8 -3
  10. package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
  11. package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
  12. package/dist/api/app/bsky/graph/searchStarterPacks.js +7 -3
  13. package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
  14. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.d.ts.map +1 -1
  15. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js +3 -2
  16. package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
  17. package/dist/api/util.d.ts +5 -0
  18. package/dist/api/util.d.ts.map +1 -1
  19. package/dist/api/util.js +11 -0
  20. package/dist/api/util.js.map +1 -1
  21. package/dist/config.d.ts +2 -0
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +5 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/data-plane/server/db/db.d.ts +4 -5
  26. package/dist/data-plane/server/db/db.d.ts.map +1 -1
  27. package/dist/data-plane/server/db/db.js +2 -1
  28. package/dist/data-plane/server/db/db.js.map +1 -1
  29. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.d.ts.map +1 -1
  30. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js +2 -4
  31. package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js.map +1 -1
  32. package/dist/data-plane/server/db/migrations/provider.d.ts +2 -1
  33. package/dist/data-plane/server/db/migrations/provider.d.ts.map +1 -1
  34. package/dist/data-plane/server/db/migrations/provider.js.map +1 -1
  35. package/dist/data-plane/server/db/pagination.d.ts +3 -2
  36. package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
  37. package/dist/data-plane/server/db/pagination.js +8 -8
  38. package/dist/data-plane/server/db/pagination.js.map +1 -1
  39. package/dist/data-plane/server/db/util.d.ts +5 -5
  40. package/dist/data-plane/server/db/util.d.ts.map +1 -1
  41. package/dist/data-plane/server/db/util.js.map +1 -1
  42. package/dist/data-plane/server/indexing/plugins/block.d.ts +9 -4
  43. package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
  44. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts +13 -4
  45. package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
  46. package/dist/data-plane/server/indexing/plugins/follow.d.ts +9 -4
  47. package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
  48. package/dist/data-plane/server/indexing/plugins/labeler.d.ts +8 -4
  49. package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
  50. package/dist/data-plane/server/indexing/plugins/like.d.ts +12 -4
  51. package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
  52. package/dist/data-plane/server/indexing/plugins/list-block.d.ts +9 -4
  53. package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
  54. package/dist/data-plane/server/indexing/plugins/list-item.d.ts +10 -4
  55. package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
  56. package/dist/data-plane/server/indexing/plugins/list.d.ts +13 -4
  57. package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
  58. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  59. package/dist/data-plane/server/indexing/plugins/post.js +4 -3
  60. package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
  61. package/dist/data-plane/server/indexing/plugins/repost.d.ts +12 -4
  62. package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
  63. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts +9 -4
  64. package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
  65. package/dist/data-plane/server/indexing/plugins/verification.d.ts +12 -4
  66. package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
  67. package/dist/data-plane/server/routes/blocks.js +22 -14
  68. package/dist/data-plane/server/routes/blocks.js.map +1 -1
  69. package/dist/data-plane/server/routes/feed-gens.js +2 -2
  70. package/dist/data-plane/server/routes/feed-gens.js.map +1 -1
  71. package/dist/data-plane/server/routes/feeds.js +18 -16
  72. package/dist/data-plane/server/routes/feeds.js.map +1 -1
  73. package/dist/data-plane/server/routes/labels.js +1 -1
  74. package/dist/data-plane/server/routes/labels.js.map +1 -1
  75. package/dist/data-plane/server/routes/mutes.js +2 -2
  76. package/dist/data-plane/server/routes/mutes.js.map +1 -1
  77. package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
  78. package/dist/data-plane/server/routes/notifs.js +10 -9
  79. package/dist/data-plane/server/routes/notifs.js.map +1 -1
  80. package/dist/data-plane/server/routes/relationships.js.map +1 -1
  81. package/dist/data-plane/server/routes/suggestions.js +2 -2
  82. package/dist/data-plane/server/routes/suggestions.js.map +1 -1
  83. package/dist/data-plane/server/util.d.ts +31 -23
  84. package/dist/data-plane/server/util.d.ts.map +1 -1
  85. package/package.json +11 -11
  86. package/src/api/app/bsky/actor/searchActors.ts +17 -6
  87. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +11 -5
  88. package/src/api/app/bsky/feed/searchPosts.ts +12 -5
  89. package/src/api/app/bsky/graph/searchStarterPacks.ts +14 -5
  90. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +9 -2
  91. package/src/api/util.ts +17 -0
  92. package/src/config.ts +9 -0
  93. package/src/data-plane/server/db/db.ts +1 -1
  94. package/src/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.ts +2 -4
  95. package/src/data-plane/server/db/migrations/provider.ts +2 -1
  96. package/src/data-plane/server/db/pagination.ts +15 -15
  97. package/src/data-plane/server/db/util.ts +8 -5
  98. package/src/data-plane/server/indexing/plugins/post.ts +5 -4
  99. package/src/data-plane/server/routes/blocks.ts +30 -24
  100. package/src/data-plane/server/routes/feed-gens.ts +2 -2
  101. package/src/data-plane/server/routes/feeds.ts +23 -19
  102. package/src/data-plane/server/routes/labels.ts +2 -2
  103. package/src/data-plane/server/routes/mutes.ts +8 -6
  104. package/src/data-plane/server/routes/notifs.ts +15 -12
  105. package/src/data-plane/server/routes/relationships.ts +4 -2
  106. package/src/data-plane/server/routes/suggestions.ts +2 -2
  107. package/tests/data-plane/subscription.test.ts +2 -2
@@ -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
 
@@ -32,17 +32,18 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
32
32
  let builder = db.db
33
33
  .selectFrom('notification as notif')
34
34
  .where('notif.did', '=', actorDid)
35
- .where((clause) =>
36
- clause
37
- .where('reasonSubject', 'is', null)
38
- .orWhereExists(
35
+ .where((eb) =>
36
+ eb.or([
37
+ eb('reasonSubject', 'is', null),
38
+ eb.exists(
39
39
  db.db
40
40
  .selectFrom('record as subject')
41
41
  .selectAll()
42
42
  .whereRef('subject.uri', '=', ref('notif.reasonSubject')),
43
43
  ),
44
+ ]),
44
45
  )
45
- .if(priority, (qb) => qb.whereExists(priorityFollowQb))
46
+ .$if(priority, (qb) => qb.where(({ exists }) => exists(priorityFollowQb)))
46
47
  .select([
47
48
  'notif.author as authorDid',
48
49
  'notif.recordUri as uri',
@@ -117,13 +118,15 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
117
118
  // Ensure to hit notification_did_sortat_idx, handling case where lastSeenNotifs is null.
118
119
  .where('notification.did', '=', actorDid)
119
120
  .where('notification.sortAt', '>', lastSeen ?? '')
120
- .if(priority, (qb) =>
121
- qb.whereExists(
122
- db.db
123
- .selectFrom('follow')
124
- .select(sql<boolean>`${true}`.as('val'))
125
- .where('creator', '=', actorDid)
126
- .whereRef('subjectDid', '=', ref('notification.author')),
121
+ .$if(priority, (qb) =>
122
+ qb.where(({ exists }) =>
123
+ exists(
124
+ db.db
125
+ .selectFrom('follow')
126
+ .select(sql<boolean>`${true}`.as('val'))
127
+ .where('creator', '=', actorDid)
128
+ .whereRef('subjectDid', '=', ref('notification.author')),
129
+ ),
127
130
  ),
128
131
  )
129
132
  .executeTakeFirst()
@@ -95,9 +95,11 @@ export default (db: Database): Partial<ServiceImpl<typeof Service>> => ({
95
95
  const { ref } = db.db.dynamic
96
96
  const sourceRef = ref('pair.source')
97
97
  const targetRef = ref('pair.target')
98
- const values = valuesList(pairs.map((p) => sql`${p.a}, ${p.b}`))
98
+ const values = valuesList<{ source: string; target: string }>(
99
+ pairs.map((p) => sql`${p.a}, ${p.b}`),
100
+ )
99
101
  const res = await db.db
100
- .selectFrom(values.as(sql`pair (source, target)`))
102
+ .selectFrom(values.as<'pair'>(sql`pair (source, target)`))
101
103
  .select([
102
104
  sql<string>`${sourceRef}`.as('source'),
103
105
  sql<string>`${targetRef}`.as('target'),
@@ -41,7 +41,7 @@ const getFollowSuggestionsGlobal = async (
41
41
  const suggestions = await db.db
42
42
  .selectFrom('suggested_follow')
43
43
  .innerJoin('actor', 'actor.did', 'suggested_follow.did')
44
- .if(alreadyIncluded.length > 0, (qb) =>
44
+ .$if(alreadyIncluded.length > 0, (qb) =>
45
45
  qb.where('suggested_follow.order', 'not in', alreadyIncluded),
46
46
  )
47
47
  .selectAll()
@@ -116,7 +116,7 @@ const getFollowSuggestionsRelativeTo = async (
116
116
  .where('follow.creator', '=', input.actorDid)
117
117
  .where('follow.subjectDid', '!=', input.relativeToDid)
118
118
  .where('follow.subjectDid', 'not in', actorsViewerFollows)
119
- .if(resultDids.length > 0, (qb) =>
119
+ .$if(resultDids.length > 0, (qb) =>
120
120
  qb.where(
121
121
  'subjectDid',
122
122
  'not in',
@@ -118,8 +118,8 @@ async function dumpTable<T extends keyof DatabaseSchemaType>(
118
118
  tableName: T,
119
119
  pkeys: (keyof DatabaseSchemaType[T] & string)[],
120
120
  ) {
121
- const { ref } = db.db.dynamic
122
- let builder = db.db.selectFrom(tableName).selectAll()
121
+ const { ref, table } = db.db.dynamic
122
+ let builder = db.db.selectFrom(table(tableName).as('t')).selectAll()
123
123
  pkeys.forEach((key) => {
124
124
  builder = builder.orderBy(ref(key))
125
125
  })