@atproto/bsky 0.0.60 → 0.0.61

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 (67) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/api/app/bsky/graph/getKnownFollowers.d.ts +4 -0
  3. package/dist/api/app/bsky/graph/getKnownFollowers.d.ts.map +1 -0
  4. package/dist/api/app/bsky/graph/getKnownFollowers.js +71 -0
  5. package/dist/api/app/bsky/graph/getKnownFollowers.js.map +1 -0
  6. package/dist/api/index.d.ts.map +1 -1
  7. package/dist/api/index.js +2 -0
  8. package/dist/api/index.js.map +1 -1
  9. package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
  10. package/dist/data-plane/server/routes/follows.js +34 -2
  11. package/dist/data-plane/server/routes/follows.js.map +1 -1
  12. package/dist/hydration/actor.d.ts +6 -0
  13. package/dist/hydration/actor.d.ts.map +1 -1
  14. package/dist/hydration/actor.js +17 -0
  15. package/dist/hydration/actor.js.map +1 -1
  16. package/dist/hydration/hydrator.d.ts +2 -1
  17. package/dist/hydration/hydrator.d.ts.map +1 -1
  18. package/dist/hydration/hydrator.js +15 -1
  19. package/dist/hydration/hydrator.js.map +1 -1
  20. package/dist/lexicon/index.d.ts +2 -0
  21. package/dist/lexicon/index.d.ts.map +1 -1
  22. package/dist/lexicon/index.js +4 -0
  23. package/dist/lexicon/index.js.map +1 -1
  24. package/dist/lexicon/lexicons.d.ts +76 -0
  25. package/dist/lexicon/lexicons.d.ts.map +1 -1
  26. package/dist/lexicon/lexicons.js +76 -0
  27. package/dist/lexicon/lexicons.js.map +1 -1
  28. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +9 -0
  29. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  30. package/dist/lexicon/types/app/bsky/actor/defs.js +11 -1
  31. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  32. package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.d.ts +40 -0
  33. package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.d.ts.map +1 -0
  34. package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.js +3 -0
  35. package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.js.map +1 -0
  36. package/dist/logger.d.ts +1 -0
  37. package/dist/logger.d.ts.map +1 -1
  38. package/dist/logger.js +2 -1
  39. package/dist/logger.js.map +1 -1
  40. package/dist/proto/bsky_pb.d.ts +25 -4
  41. package/dist/proto/bsky_pb.d.ts.map +1 -1
  42. package/dist/proto/bsky_pb.js +83 -10
  43. package/dist/proto/bsky_pb.js.map +1 -1
  44. package/dist/views/index.d.ts +5 -0
  45. package/dist/views/index.d.ts.map +1 -1
  46. package/dist/views/index.js +19 -0
  47. package/dist/views/index.js.map +1 -1
  48. package/package.json +5 -5
  49. package/proto/bsky.proto +6 -2
  50. package/src/api/app/bsky/graph/getKnownFollowers.ts +119 -0
  51. package/src/api/index.ts +2 -0
  52. package/src/data-plane/server/routes/follows.ts +45 -2
  53. package/src/hydration/actor.ts +30 -0
  54. package/src/hydration/hydrator.ts +22 -1
  55. package/src/lexicon/index.ts +12 -0
  56. package/src/lexicon/lexicons.ts +77 -0
  57. package/src/lexicon/types/app/bsky/actor/defs.ts +20 -0
  58. package/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts +50 -0
  59. package/src/logger.ts +2 -0
  60. package/src/proto/bsky_pb.ts +75 -8
  61. package/src/views/index.ts +24 -0
  62. package/tests/data-plane/__snapshots__/indexing.test.ts.snap +46 -28
  63. package/tests/label-hydration.test.ts +0 -2
  64. package/tests/query-labels.test.ts +0 -3
  65. package/tests/views/__snapshots__/profile.test.ts.snap +230 -10
  66. package/tests/views/blocks.test.ts +13 -0
  67. package/tests/views/profile.test.ts +35 -0
@@ -21,14 +21,14 @@ Array [
21
21
  "cid": "cids(1)",
22
22
  "cts": "1970-01-01T00:00:00.000Z",
23
23
  "src": "user(0)",
24
- "uri": "record(2)",
24
+ "uri": "record(3)",
25
25
  "val": "self-label-a",
26
26
  },
27
27
  Object {
28
28
  "cid": "cids(1)",
29
29
  "cts": "1970-01-01T00:00:00.000Z",
30
30
  "src": "user(0)",
31
- "uri": "record(2)",
31
+ "uri": "record(3)",
32
32
  "val": "self-label-b",
33
33
  },
34
34
  ],
@@ -37,6 +37,21 @@ Array [
37
37
  "blockedBy": false,
38
38
  "followedBy": "record(1)",
39
39
  "following": "record(0)",
40
+ "knownFollowers": Object {
41
+ "count": 1,
42
+ "followers": Array [
43
+ Object {
44
+ "did": "user(2)",
45
+ "handle": "carol.test",
46
+ "labels": Array [],
47
+ "viewer": Object {
48
+ "blockedBy": false,
49
+ "following": "record(2)",
50
+ "muted": false,
51
+ },
52
+ },
53
+ ],
54
+ },
40
55
  "muted": false,
41
56
  },
42
57
  },
@@ -46,9 +61,9 @@ Array [
46
61
  "labeler": false,
47
62
  "lists": 0,
48
63
  },
49
- "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(0)@jpeg",
64
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(4)/cids(0)@jpeg",
50
65
  "description": "hi im bob label_me",
51
- "did": "user(2)",
66
+ "did": "user(3)",
52
67
  "displayName": "bobby",
53
68
  "followersCount": 2,
54
69
  "followsCount": 2,
@@ -58,6 +73,39 @@ Array [
58
73
  "postsCount": 3,
59
74
  "viewer": Object {
60
75
  "blockedBy": false,
76
+ "knownFollowers": Object {
77
+ "count": 1,
78
+ "followers": Array [
79
+ Object {
80
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
81
+ "did": "user(0)",
82
+ "displayName": "ali",
83
+ "handle": "alice.test",
84
+ "labels": Array [
85
+ Object {
86
+ "cid": "cids(1)",
87
+ "cts": "1970-01-01T00:00:00.000Z",
88
+ "src": "user(0)",
89
+ "uri": "record(3)",
90
+ "val": "self-label-a",
91
+ },
92
+ Object {
93
+ "cid": "cids(1)",
94
+ "cts": "1970-01-01T00:00:00.000Z",
95
+ "src": "user(0)",
96
+ "uri": "record(3)",
97
+ "val": "self-label-b",
98
+ },
99
+ ],
100
+ "viewer": Object {
101
+ "blockedBy": false,
102
+ "followedBy": "record(1)",
103
+ "following": "record(0)",
104
+ "muted": false,
105
+ },
106
+ },
107
+ ],
108
+ },
61
109
  "muted": false,
62
110
  },
63
111
  },
@@ -67,7 +115,7 @@ Array [
67
115
  "labeler": false,
68
116
  "lists": 0,
69
117
  },
70
- "did": "user(4)",
118
+ "did": "user(2)",
71
119
  "followersCount": 2,
72
120
  "followsCount": 1,
73
121
  "handle": "carol.test",
@@ -75,7 +123,40 @@ Array [
75
123
  "postsCount": 2,
76
124
  "viewer": Object {
77
125
  "blockedBy": false,
78
- "following": "record(3)",
126
+ "following": "record(2)",
127
+ "knownFollowers": Object {
128
+ "count": 1,
129
+ "followers": Array [
130
+ Object {
131
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
132
+ "did": "user(0)",
133
+ "displayName": "ali",
134
+ "handle": "alice.test",
135
+ "labels": Array [
136
+ Object {
137
+ "cid": "cids(1)",
138
+ "cts": "1970-01-01T00:00:00.000Z",
139
+ "src": "user(0)",
140
+ "uri": "record(3)",
141
+ "val": "self-label-a",
142
+ },
143
+ Object {
144
+ "cid": "cids(1)",
145
+ "cts": "1970-01-01T00:00:00.000Z",
146
+ "src": "user(0)",
147
+ "uri": "record(3)",
148
+ "val": "self-label-b",
149
+ },
150
+ ],
151
+ "viewer": Object {
152
+ "blockedBy": false,
153
+ "followedBy": "record(1)",
154
+ "following": "record(0)",
155
+ "muted": false,
156
+ },
157
+ },
158
+ ],
159
+ },
79
160
  "muted": false,
80
161
  },
81
162
  },
@@ -97,6 +178,39 @@ Array [
97
178
  "viewer": Object {
98
179
  "blockedBy": false,
99
180
  "followedBy": "record(4)",
181
+ "knownFollowers": Object {
182
+ "count": 1,
183
+ "followers": Array [
184
+ Object {
185
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
186
+ "did": "user(0)",
187
+ "displayName": "ali",
188
+ "handle": "alice.test",
189
+ "labels": Array [
190
+ Object {
191
+ "cid": "cids(1)",
192
+ "cts": "1970-01-01T00:00:00.000Z",
193
+ "src": "user(0)",
194
+ "uri": "record(3)",
195
+ "val": "self-label-a",
196
+ },
197
+ Object {
198
+ "cid": "cids(1)",
199
+ "cts": "1970-01-01T00:00:00.000Z",
200
+ "src": "user(0)",
201
+ "uri": "record(3)",
202
+ "val": "self-label-b",
203
+ },
204
+ ],
205
+ "viewer": Object {
206
+ "blockedBy": false,
207
+ "followedBy": "record(1)",
208
+ "following": "record(0)",
209
+ "muted": false,
210
+ },
211
+ },
212
+ ],
213
+ },
100
214
  "muted": false,
101
215
  },
102
216
  },
@@ -123,14 +237,14 @@ Object {
123
237
  "cid": "cids(1)",
124
238
  "cts": "1970-01-01T00:00:00.000Z",
125
239
  "src": "user(0)",
126
- "uri": "record(2)",
240
+ "uri": "record(3)",
127
241
  "val": "self-label-a",
128
242
  },
129
243
  Object {
130
244
  "cid": "cids(1)",
131
245
  "cts": "1970-01-01T00:00:00.000Z",
132
246
  "src": "user(0)",
133
- "uri": "record(2)",
247
+ "uri": "record(3)",
134
248
  "val": "self-label-b",
135
249
  },
136
250
  ],
@@ -139,6 +253,21 @@ Object {
139
253
  "blockedBy": false,
140
254
  "followedBy": "record(1)",
141
255
  "following": "record(0)",
256
+ "knownFollowers": Object {
257
+ "count": 1,
258
+ "followers": Array [
259
+ Object {
260
+ "did": "user(2)",
261
+ "handle": "carol.test",
262
+ "labels": Array [],
263
+ "viewer": Object {
264
+ "blockedBy": false,
265
+ "following": "record(2)",
266
+ "muted": false,
267
+ },
268
+ },
269
+ ],
270
+ },
142
271
  "muted": false,
143
272
  },
144
273
  }
@@ -163,6 +292,39 @@ Object {
163
292
  "viewer": Object {
164
293
  "blockedBy": false,
165
294
  "followedBy": "record(0)",
295
+ "knownFollowers": Object {
296
+ "count": 1,
297
+ "followers": Array [
298
+ Object {
299
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(0)@jpeg",
300
+ "did": "user(1)",
301
+ "displayName": "ali",
302
+ "handle": "alice.test",
303
+ "labels": Array [
304
+ Object {
305
+ "cid": "cids(1)",
306
+ "cts": "1970-01-01T00:00:00.000Z",
307
+ "src": "user(1)",
308
+ "uri": "record(3)",
309
+ "val": "self-label-a",
310
+ },
311
+ Object {
312
+ "cid": "cids(1)",
313
+ "cts": "1970-01-01T00:00:00.000Z",
314
+ "src": "user(1)",
315
+ "uri": "record(3)",
316
+ "val": "self-label-b",
317
+ },
318
+ ],
319
+ "viewer": Object {
320
+ "blockedBy": false,
321
+ "followedBy": "record(2)",
322
+ "following": "record(1)",
323
+ "muted": false,
324
+ },
325
+ },
326
+ ],
327
+ },
166
328
  "muted": false,
167
329
  },
168
330
  }
@@ -188,20 +350,49 @@ Object {
188
350
  "cid": "cids(1)",
189
351
  "cts": "1970-01-01T00:00:00.000Z",
190
352
  "src": "user(0)",
191
- "uri": "record(0)",
353
+ "uri": "record(4)",
192
354
  "val": "self-label-a",
193
355
  },
194
356
  Object {
195
357
  "cid": "cids(1)",
196
358
  "cts": "1970-01-01T00:00:00.000Z",
197
359
  "src": "user(0)",
198
- "uri": "record(0)",
360
+ "uri": "record(4)",
199
361
  "val": "self-label-b",
200
362
  },
201
363
  ],
202
364
  "postsCount": 4,
203
365
  "viewer": Object {
204
366
  "blockedBy": false,
367
+ "knownFollowers": Object {
368
+ "count": 2,
369
+ "followers": Array [
370
+ Object {
371
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(0)@jpeg",
372
+ "did": "user(2)",
373
+ "displayName": "bobby",
374
+ "handle": "bob.test",
375
+ "labels": Array [],
376
+ "viewer": Object {
377
+ "blockedBy": false,
378
+ "followedBy": "record(1)",
379
+ "following": "record(0)",
380
+ "muted": false,
381
+ },
382
+ },
383
+ Object {
384
+ "did": "user(4)",
385
+ "handle": "carol.test",
386
+ "labels": Array [],
387
+ "viewer": Object {
388
+ "blockedBy": false,
389
+ "followedBy": "record(3)",
390
+ "following": "record(2)",
391
+ "muted": false,
392
+ },
393
+ },
394
+ ],
395
+ },
205
396
  "muted": false,
206
397
  },
207
398
  }
@@ -227,6 +418,35 @@ Object {
227
418
  "postsCount": 4,
228
419
  "viewer": Object {
229
420
  "blockedBy": false,
421
+ "knownFollowers": Object {
422
+ "count": 2,
423
+ "followers": Array [
424
+ Object {
425
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(0)@jpeg",
426
+ "did": "user(2)",
427
+ "displayName": "bobby",
428
+ "handle": "bob.test",
429
+ "labels": Array [],
430
+ "viewer": Object {
431
+ "blockedBy": false,
432
+ "followedBy": "record(1)",
433
+ "following": "record(0)",
434
+ "muted": false,
435
+ },
436
+ },
437
+ Object {
438
+ "did": "user(4)",
439
+ "handle": "carol.test",
440
+ "labels": Array [],
441
+ "viewer": Object {
442
+ "blockedBy": false,
443
+ "followedBy": "record(3)",
444
+ "following": "record(2)",
445
+ "muted": false,
446
+ },
447
+ },
448
+ ],
449
+ },
230
450
  "muted": false,
231
451
  },
232
452
  }
@@ -13,6 +13,7 @@ describe('pds views with blocking', () => {
13
13
  let carolReplyToDan: { ref: RecordRef }
14
14
 
15
15
  let alice: string
16
+ let bob: string
16
17
  let carol: string
17
18
  let dan: string
18
19
  let danBlockUri: string
@@ -26,6 +27,7 @@ describe('pds views with blocking', () => {
26
27
  sc = network.getSeedClient()
27
28
  await basicSeed(sc)
28
29
  alice = sc.dids.alice
30
+ bob = sc.dids.bob
29
31
  carol = sc.dids.carol
30
32
  dan = sc.dids.dan
31
33
  // add follows to ensure blocks work even w follows
@@ -595,4 +597,15 @@ describe('pds views with blocking', () => {
595
597
  const combined = [...first.data.blocks, ...second.data.blocks]
596
598
  expect(combined).toEqual(full.data.blocks)
597
599
  })
600
+
601
+ it('returns knownFollowers with blocks filtered', async () => {
602
+ const carolForAlice = await agent.api.app.bsky.actor.getProfile(
603
+ { actor: bob },
604
+ { headers: await network.serviceHeaders(alice) },
605
+ )
606
+
607
+ const knownFollowers = carolForAlice.data.viewer?.knownFollowers
608
+ expect(knownFollowers?.count).toBe(1)
609
+ expect(knownFollowers?.followers).toHaveLength(0)
610
+ })
598
611
  })
@@ -14,6 +14,7 @@ describe('pds profile views', () => {
14
14
  let alice: string
15
15
  let bob: string
16
16
  let dan: string
17
+ let carol: string
17
18
 
18
19
  beforeAll(async () => {
19
20
  network = await TestNetwork.create({
@@ -27,6 +28,7 @@ describe('pds profile views', () => {
27
28
  alice = sc.dids.alice
28
29
  bob = sc.dids.bob
29
30
  dan = sc.dids.dan
31
+ carol = sc.dids.carol
30
32
  })
31
33
 
32
34
  afterAll(async () => {
@@ -76,6 +78,39 @@ describe('pds profile views', () => {
76
78
  expect(forSnapshot(danForBob.data)).toMatchSnapshot()
77
79
  })
78
80
 
81
+ it('returns knownFollowers viewer data', async () => {
82
+ const carolForAlice = await agent.api.app.bsky.actor.getProfile(
83
+ { actor: carol },
84
+ { headers: await network.serviceHeaders(alice) },
85
+ )
86
+
87
+ const knownFollowers = carolForAlice.data.viewer?.knownFollowers
88
+ expect(knownFollowers?.count).toBe(1)
89
+ expect(knownFollowers?.followers).toHaveLength(1)
90
+ expect(knownFollowers?.followers[0].handle).toBe('bob.test')
91
+ })
92
+
93
+ it('does not return knownFollowers for basic profile views', async () => {
94
+ const { data } = await agent.api.app.bsky.graph.getFollows(
95
+ { actor: carol },
96
+ { headers: await network.serviceHeaders(alice) },
97
+ )
98
+ const follow = data.follows[0]
99
+
100
+ expect(follow.viewer?.knownFollowers).toBeFalsy()
101
+ })
102
+
103
+ it('getKnownFollowers works', async () => {
104
+ const { data } = await agent.api.app.bsky.graph.getKnownFollowers(
105
+ { actor: carol },
106
+ { headers: await network.serviceHeaders(alice) },
107
+ )
108
+
109
+ expect(data.subject.did).toBe(carol)
110
+ expect(data.followers.length).toBe(1)
111
+ expect(data.followers[0].handle).toBe('bob.test')
112
+ })
113
+
79
114
  it('fetches multiple profiles', async () => {
80
115
  const {
81
116
  data: { profiles },