@atproto/dev-env 0.0.0-spaces-alpha-20260818163953

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 (187) hide show
  1. package/CHANGELOG.md +3424 -0
  2. package/LICENSE.txt +7 -0
  3. package/README.md +39 -0
  4. package/bin.js +7 -0
  5. package/dist/bin-multi-pds.d.ts +2 -0
  6. package/dist/bin-multi-pds.d.ts.map +1 -0
  7. package/dist/bin-multi-pds.js +130 -0
  8. package/dist/bin-multi-pds.js.map +1 -0
  9. package/dist/bin.d.ts +2 -0
  10. package/dist/bin.d.ts.map +1 -0
  11. package/dist/bin.js +56 -0
  12. package/dist/bin.js.map +1 -0
  13. package/dist/bsky.d.ts +27 -0
  14. package/dist/bsky.d.ts.map +1 -0
  15. package/dist/bsky.js +165 -0
  16. package/dist/bsky.js.map +1 -0
  17. package/dist/bsync.d.ts +22 -0
  18. package/dist/bsync.d.ts.map +1 -0
  19. package/dist/bsync.js +54 -0
  20. package/dist/bsync.js.map +1 -0
  21. package/dist/const.d.ts +4 -0
  22. package/dist/const.d.ts.map +1 -0
  23. package/dist/const.js +4 -0
  24. package/dist/const.js.map +1 -0
  25. package/dist/env.d.ts +2 -0
  26. package/dist/env.d.ts.map +1 -0
  27. package/dist/env.js +10 -0
  28. package/dist/env.js.map +1 -0
  29. package/dist/feed-gen.d.ts +15 -0
  30. package/dist/feed-gen.d.ts.map +1 -0
  31. package/dist/feed-gen.js +73 -0
  32. package/dist/feed-gen.js.map +1 -0
  33. package/dist/index.d.ts +17 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +17 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/introspect.d.ts +22 -0
  38. package/dist/introspect.d.ts.map +1 -0
  39. package/dist/introspect.js +65 -0
  40. package/dist/introspect.js.map +1 -0
  41. package/dist/mock/data.d.ts +3 -0
  42. package/dist/mock/data.d.ts.map +1 -0
  43. package/dist/mock/data.js +46 -0
  44. package/dist/mock/data.js.map +1 -0
  45. package/dist/mock/img/blur-hash-avatar-b64.d.ts +3 -0
  46. package/dist/mock/img/blur-hash-avatar-b64.d.ts.map +1 -0
  47. package/dist/mock/img/blur-hash-avatar-b64.js +2 -0
  48. package/dist/mock/img/blur-hash-avatar-b64.js.map +1 -0
  49. package/dist/mock/img/labeled-img-b64.d.ts +3 -0
  50. package/dist/mock/img/labeled-img-b64.d.ts.map +1 -0
  51. package/dist/mock/img/labeled-img-b64.js +2 -0
  52. package/dist/mock/img/labeled-img-b64.js.map +1 -0
  53. package/dist/mock/index.d.ts +3 -0
  54. package/dist/mock/index.d.ts.map +1 -0
  55. package/dist/mock/index.js +574 -0
  56. package/dist/mock/index.js.map +1 -0
  57. package/dist/moderator-client.d.ts +58 -0
  58. package/dist/moderator-client.d.ts.map +1 -0
  59. package/dist/moderator-client.js +110 -0
  60. package/dist/moderator-client.js.map +1 -0
  61. package/dist/network-no-appview.d.ts +21 -0
  62. package/dist/network-no-appview.d.ts.map +1 -0
  63. package/dist/network-no-appview.js +74 -0
  64. package/dist/network-no-appview.js.map +1 -0
  65. package/dist/network.d.ts +32 -0
  66. package/dist/network.d.ts.map +1 -0
  67. package/dist/network.js +190 -0
  68. package/dist/network.js.map +1 -0
  69. package/dist/ozone.d.ts +31 -0
  70. package/dist/ozone.d.ts.map +1 -0
  71. package/dist/ozone.js +254 -0
  72. package/dist/ozone.js.map +1 -0
  73. package/dist/pds.d.ts +23 -0
  74. package/dist/pds.d.ts.map +1 -0
  75. package/dist/pds.js +97 -0
  76. package/dist/pds.js.map +1 -0
  77. package/dist/plc.d.ts +14 -0
  78. package/dist/plc.d.ts.map +1 -0
  79. package/dist/plc.js +28 -0
  80. package/dist/plc.js.map +1 -0
  81. package/dist/seed/author-feed.d.ts +4 -0
  82. package/dist/seed/author-feed.d.ts.map +1 -0
  83. package/dist/seed/author-feed.js +50 -0
  84. package/dist/seed/author-feed.js.map +1 -0
  85. package/dist/seed/basic.d.ts +16 -0
  86. package/dist/seed/basic.d.ts.map +1 -0
  87. package/dist/seed/basic.js +113 -0
  88. package/dist/seed/basic.js.map +1 -0
  89. package/dist/seed/client.d.ts +151 -0
  90. package/dist/seed/client.d.ts.map +1 -0
  91. package/dist/seed/client.js +365 -0
  92. package/dist/seed/client.js.map +1 -0
  93. package/dist/seed/follows.d.ts +4 -0
  94. package/dist/seed/follows.d.ts.map +1 -0
  95. package/dist/seed/follows.js +55 -0
  96. package/dist/seed/follows.js.map +1 -0
  97. package/dist/seed/index.d.ts +11 -0
  98. package/dist/seed/index.d.ts.map +1 -0
  99. package/dist/seed/index.js +11 -0
  100. package/dist/seed/index.js.map +1 -0
  101. package/dist/seed/likes.d.ts +4 -0
  102. package/dist/seed/likes.d.ts.map +1 -0
  103. package/dist/seed/likes.js +37 -0
  104. package/dist/seed/likes.js.map +1 -0
  105. package/dist/seed/quotes.d.ts +4 -0
  106. package/dist/seed/quotes.d.ts.map +1 -0
  107. package/dist/seed/quotes.js +21 -0
  108. package/dist/seed/quotes.js.map +1 -0
  109. package/dist/seed/reposts.d.ts +4 -0
  110. package/dist/seed/reposts.d.ts.map +1 -0
  111. package/dist/seed/reposts.js +17 -0
  112. package/dist/seed/reposts.js.map +1 -0
  113. package/dist/seed/thread-v2.d.ts +227 -0
  114. package/dist/seed/thread-v2.d.ts.map +1 -0
  115. package/dist/seed/thread-v2.js +755 -0
  116. package/dist/seed/thread-v2.js.map +1 -0
  117. package/dist/seed/users-bulk.d.ts +3 -0
  118. package/dist/seed/users-bulk.d.ts.map +1 -0
  119. package/dist/seed/users-bulk.js +224 -0
  120. package/dist/seed/users-bulk.js.map +1 -0
  121. package/dist/seed/users.d.ts +3 -0
  122. package/dist/seed/users.d.ts.map +1 -0
  123. package/dist/seed/users.js +45 -0
  124. package/dist/seed/users.js.map +1 -0
  125. package/dist/seed/verifications.d.ts +5 -0
  126. package/dist/seed/verifications.d.ts.map +1 -0
  127. package/dist/seed/verifications.js +164 -0
  128. package/dist/seed/verifications.js.map +1 -0
  129. package/dist/service-profile-lexicon.d.ts +11 -0
  130. package/dist/service-profile-lexicon.d.ts.map +1 -0
  131. package/dist/service-profile-lexicon.js +115 -0
  132. package/dist/service-profile-lexicon.js.map +1 -0
  133. package/dist/service-profile-ozone.d.ts +18 -0
  134. package/dist/service-profile-ozone.d.ts.map +1 -0
  135. package/dist/service-profile-ozone.js +333 -0
  136. package/dist/service-profile-ozone.js.map +1 -0
  137. package/dist/service-profile.d.ts +24 -0
  138. package/dist/service-profile.d.ts.map +1 -0
  139. package/dist/service-profile.js +61 -0
  140. package/dist/service-profile.js.map +1 -0
  141. package/dist/types.d.ts +61 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +2 -0
  144. package/dist/types.js.map +1 -0
  145. package/dist/util.d.ts +14 -0
  146. package/dist/util.d.ts.map +1 -0
  147. package/dist/util.js +86 -0
  148. package/dist/util.js.map +1 -0
  149. package/package.json +69 -0
  150. package/src/bin-multi-pds.ts +166 -0
  151. package/src/bin.ts +64 -0
  152. package/src/bsky.ts +198 -0
  153. package/src/bsync.ts +66 -0
  154. package/src/const.ts +3 -0
  155. package/src/env.ts +9 -0
  156. package/src/feed-gen.ts +96 -0
  157. package/src/index.ts +17 -0
  158. package/src/introspect.ts +91 -0
  159. package/src/mock/data.ts +46 -0
  160. package/src/mock/img/blur-hash-avatar-b64.ts +1 -0
  161. package/src/mock/img/labeled-img-b64.ts +1 -0
  162. package/src/mock/index.ts +702 -0
  163. package/src/moderator-client.ts +267 -0
  164. package/src/network-no-appview.ts +89 -0
  165. package/src/network.ts +243 -0
  166. package/src/ozone.ts +287 -0
  167. package/src/pds.ts +118 -0
  168. package/src/plc.ts +33 -0
  169. package/src/seed/author-feed.ts +98 -0
  170. package/src/seed/basic.ts +189 -0
  171. package/src/seed/client.ts +676 -0
  172. package/src/seed/follows.ts +57 -0
  173. package/src/seed/index.ts +11 -0
  174. package/src/seed/likes.ts +43 -0
  175. package/src/seed/quotes.ts +53 -0
  176. package/src/seed/reposts.ts +18 -0
  177. package/src/seed/thread-v2.ts +925 -0
  178. package/src/seed/users-bulk.ts +229 -0
  179. package/src/seed/users.ts +64 -0
  180. package/src/seed/verifications.ts +254 -0
  181. package/src/service-profile-lexicon.ts +127 -0
  182. package/src/service-profile-ozone.ts +375 -0
  183. package/src/service-profile.ts +95 -0
  184. package/src/types.ts +68 -0
  185. package/src/util.ts +118 -0
  186. package/tsconfig.build.json +25 -0
  187. package/tsconfig.json +4 -0
@@ -0,0 +1,755 @@
1
+ function createUserStub(name) {
2
+ return {
3
+ id: name,
4
+ // @ts-ignore overwritten during seeding
5
+ did: undefined,
6
+ email: `${name}@test.com`,
7
+ handle: `${name}.test`,
8
+ password: `${name}-pass`,
9
+ displayName: name,
10
+ description: `hi im ${name} label_me`,
11
+ selfLabels: undefined,
12
+ };
13
+ }
14
+ async function createUsers(seedClient, prefix, handles) {
15
+ const stubs = handles.reduce((acc, handle) => {
16
+ acc[handle] = createUserStub(`${prefix}-${handle}`);
17
+ return acc;
18
+ }, {});
19
+ const users = await Promise.all(handles
20
+ .map((h) => prefix + '-' + h)
21
+ .map(async (handle) => {
22
+ const user = createUserStub(handle);
23
+ await seedClient.createAccount(handle, user);
24
+ user.did = seedClient.dids[handle];
25
+ return user;
26
+ }));
27
+ return users.reduce((acc, user) => {
28
+ const id = user.id.split('-')[1];
29
+ acc[id].did = user.did;
30
+ return acc;
31
+ }, stubs);
32
+ }
33
+ export const TAG_BUMP_DOWN = 'down';
34
+ export const TAG_HIDE = 'hide';
35
+ const rootReplyFnBuilder = (sc, root, parent, prevBreadcrumbs, posts) => {
36
+ let index = 0;
37
+ return async (replyAuthor, overridesOrCb, maybeReplyCb) => {
38
+ let overrides;
39
+ let replyCb;
40
+ if (overridesOrCb && typeof overridesOrCb === 'function') {
41
+ replyCb = overridesOrCb;
42
+ }
43
+ else {
44
+ overrides = overridesOrCb;
45
+ replyCb = maybeReplyCb;
46
+ }
47
+ const breadcrumbs = prevBreadcrumbs
48
+ ? `${prevBreadcrumbs}.${index++}`
49
+ : `${index++}`;
50
+ const text = breadcrumbs;
51
+ const reply = await sc.reply(replyAuthor.did, root, parent, text, undefined, undefined, overrides);
52
+ posts[breadcrumbs] = reply;
53
+ // Await for this post to be processed before replying to it.
54
+ if (replyCb) {
55
+ await sc.network.processAll();
56
+ await replyCb(rootReplyFnBuilder(sc, root, reply.ref, breadcrumbs, posts));
57
+ }
58
+ };
59
+ };
60
+ const createThread = async (sc, rootAuthor, overridesOrCb, maybeReplyCb) => {
61
+ let overrides;
62
+ let replyCb;
63
+ if (overridesOrCb && typeof overridesOrCb === 'function') {
64
+ replyCb = overridesOrCb;
65
+ }
66
+ else {
67
+ overrides = overridesOrCb;
68
+ replyCb = maybeReplyCb;
69
+ }
70
+ const replies = {};
71
+ const breadcrumbs = '';
72
+ const text = 'root';
73
+ const root = await sc.post(rootAuthor.did, text, undefined, undefined, undefined, overrides);
74
+ // Await for this post to be processed before replying to it.
75
+ if (replyCb) {
76
+ await sc.network.processAll();
77
+ await replyCb(rootReplyFnBuilder(sc, root.ref, root.ref, breadcrumbs, replies));
78
+ }
79
+ return { root, replies };
80
+ };
81
+ export async function simple(sc, prefix = 'simple') {
82
+ const users = await createUsers(sc, prefix, [
83
+ 'op',
84
+ 'alice',
85
+ 'bob',
86
+ 'carol',
87
+ ]);
88
+ const { op, alice, bob, carol } = users;
89
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
90
+ await r(op, async (r) => {
91
+ await r(op);
92
+ });
93
+ await r(alice);
94
+ await r(bob, async (r) => {
95
+ await r(alice);
96
+ });
97
+ await r(carol);
98
+ });
99
+ return {
100
+ seedClient: sc,
101
+ users,
102
+ root,
103
+ r,
104
+ };
105
+ }
106
+ export async function long(sc) {
107
+ const users = await createUsers(sc, 'long', [
108
+ 'op',
109
+ 'alice',
110
+ 'bob',
111
+ 'carol',
112
+ 'dan',
113
+ ]);
114
+ const { op, alice, bob, carol, dan } = users;
115
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
116
+ await r(op, async (r) => {
117
+ await r(op, async (r) => {
118
+ await r(op, async (r) => {
119
+ await r(op, async (r) => {
120
+ await r(op);
121
+ });
122
+ });
123
+ await r(op);
124
+ });
125
+ });
126
+ await r(alice);
127
+ await r(bob);
128
+ await r(carol);
129
+ await r(op, async (r) => {
130
+ await r(op, async (r) => {
131
+ await r(alice, async (r) => {
132
+ await r(op, async (r) => {
133
+ await r(op);
134
+ });
135
+ });
136
+ });
137
+ });
138
+ await r(alice);
139
+ await r(bob);
140
+ await r(carol);
141
+ });
142
+ await sc.like(op.did, r['5'].ref);
143
+ await sc.like(bob.did, r['5'].ref);
144
+ await sc.like(carol.did, r['5'].ref);
145
+ await sc.like(dan.did, r['5'].ref);
146
+ await sc.like(op.did, r['6'].ref);
147
+ await sc.like(alice.did, r['6'].ref);
148
+ await sc.like(carol.did, r['6'].ref);
149
+ await sc.like(op.did, r['7'].ref);
150
+ await sc.like(bob.did, r['7'].ref);
151
+ return {
152
+ seedClient: sc,
153
+ users,
154
+ root,
155
+ r,
156
+ };
157
+ }
158
+ export async function deep(sc) {
159
+ const users = await createUsers(sc, 'deep', ['op']);
160
+ const { op } = users;
161
+ let counter = 0;
162
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
163
+ const recursiveReply = async (rFn) => {
164
+ if (counter < 18) {
165
+ counter++;
166
+ await rFn(op, async (r) => recursiveReply(r));
167
+ }
168
+ };
169
+ await recursiveReply(r);
170
+ });
171
+ return {
172
+ seedClient: sc,
173
+ users,
174
+ root,
175
+ r,
176
+ };
177
+ }
178
+ export async function branchingFactor(sc) {
179
+ const users = await createUsers(sc, 'bf', ['op', 'bob']);
180
+ const { op, bob } = users;
181
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
182
+ await r(bob, async (r) => {
183
+ await r(bob, async (r) => {
184
+ await r(bob);
185
+ await r(bob);
186
+ await r(bob);
187
+ await r(bob);
188
+ });
189
+ await r(bob, async (r) => {
190
+ await r(bob);
191
+ await r(bob);
192
+ await r(bob);
193
+ await r(bob);
194
+ });
195
+ await r(bob, async (r) => {
196
+ await r(bob);
197
+ await r(bob);
198
+ await r(bob);
199
+ await r(bob);
200
+ });
201
+ await r(bob, async (r) => {
202
+ await r(bob);
203
+ await r(bob);
204
+ await r(bob);
205
+ await r(bob);
206
+ });
207
+ });
208
+ await r(bob, async (r) => {
209
+ await r(bob, async (r) => {
210
+ // This is the only case in this seed where a reply has 1 reply instead of 4,
211
+ // to have cases of different lengths in the same tree.
212
+ await r(bob);
213
+ });
214
+ await r(bob, async (r) => {
215
+ await r(bob);
216
+ await r(bob);
217
+ await r(bob);
218
+ await r(bob);
219
+ });
220
+ await r(bob, async (r) => {
221
+ await r(bob);
222
+ await r(bob);
223
+ await r(bob);
224
+ await r(bob);
225
+ });
226
+ await r(bob, async (r) => {
227
+ await r(bob);
228
+ await r(bob);
229
+ await r(bob);
230
+ await r(bob);
231
+ });
232
+ });
233
+ await r(bob, async (r) => {
234
+ await r(bob, async (r) => {
235
+ await r(bob);
236
+ await r(bob);
237
+ await r(bob);
238
+ await r(bob);
239
+ });
240
+ await r(bob, async (r) => {
241
+ await r(bob);
242
+ await r(bob);
243
+ await r(bob);
244
+ await r(bob);
245
+ });
246
+ await r(bob, async (r) => {
247
+ await r(bob);
248
+ await r(bob);
249
+ await r(bob);
250
+ await r(bob);
251
+ });
252
+ await r(bob, async (r) => {
253
+ await r(bob);
254
+ await r(bob);
255
+ await r(bob);
256
+ await r(bob);
257
+ });
258
+ });
259
+ await r(bob, async (r) => {
260
+ await r(bob, async (r) => {
261
+ await r(bob);
262
+ await r(bob);
263
+ await r(bob);
264
+ await r(bob);
265
+ // This is the only case in this seed where a reply has 5 replies instead of 4,
266
+ // to have cases of different lengths in the same tree.
267
+ await r(bob);
268
+ });
269
+ await r(bob, async (r) => {
270
+ await r(bob);
271
+ await r(bob);
272
+ await r(bob);
273
+ await r(bob);
274
+ });
275
+ await r(bob, async (r) => {
276
+ await r(bob);
277
+ await r(bob);
278
+ await r(bob);
279
+ await r(bob);
280
+ });
281
+ await r(bob, async (r) => {
282
+ await r(bob);
283
+ await r(bob);
284
+ await r(bob);
285
+ await r(bob);
286
+ });
287
+ });
288
+ });
289
+ return {
290
+ seedClient: sc,
291
+ users,
292
+ root,
293
+ r,
294
+ };
295
+ }
296
+ export async function annotateMoreReplies(sc) {
297
+ const users = await createUsers(sc, 'mr', ['op', 'alice']);
298
+ const { op, alice } = users;
299
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
300
+ await r(alice, async (r) => {
301
+ await r(alice, async (r) => {
302
+ await r(alice, async (r) => {
303
+ await r(alice, async (r) => {
304
+ // more replies... (below = 4)
305
+ await r(alice, async (r) => {
306
+ await r(alice);
307
+ });
308
+ await r(alice);
309
+ await r(alice, async (r) => {
310
+ await r(alice, async (r) => {
311
+ await r(alice);
312
+ });
313
+ });
314
+ await r(alice);
315
+ await r(alice);
316
+ });
317
+ });
318
+ });
319
+ await r(alice, async (r) => {
320
+ await r(alice, async (r) => {
321
+ await r(alice);
322
+ });
323
+ });
324
+ });
325
+ await r(alice, async (r) => {
326
+ await r(alice, async (r) => {
327
+ await r(alice);
328
+ await r(alice);
329
+ // more replies... (branchingFactor = 2)
330
+ await r(alice);
331
+ await r(alice);
332
+ await r(alice);
333
+ });
334
+ await r(alice, async (r) => {
335
+ await r(alice);
336
+ await r(alice);
337
+ });
338
+ // more replies... (branchingFactor = 2)
339
+ await r(alice);
340
+ });
341
+ await r(alice); // anchor reply not limited by branchingFactor
342
+ });
343
+ return {
344
+ seedClient: sc,
345
+ users,
346
+ root,
347
+ r,
348
+ };
349
+ }
350
+ export async function annotateOP(sc) {
351
+ const users = await createUsers(sc, 'op', ['op', 'alice', 'bob']);
352
+ const { op, alice, bob } = users;
353
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
354
+ await r(op, async (r) => {
355
+ await r(op, async (r) => {
356
+ await r(op);
357
+ });
358
+ });
359
+ await r(alice, async (r) => {
360
+ await r(alice);
361
+ });
362
+ await r(op, async (r) => {
363
+ await r(bob, async (r) => {
364
+ await r(op);
365
+ });
366
+ });
367
+ });
368
+ return {
369
+ seedClient: sc,
370
+ users,
371
+ root,
372
+ r,
373
+ };
374
+ }
375
+ export async function sort(sc) {
376
+ const users = await createUsers(sc, 'sort', [
377
+ 'op',
378
+ 'alice',
379
+ 'bob',
380
+ 'carol',
381
+ ]);
382
+ const { op, alice, bob, carol } = users;
383
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
384
+ // 0 likes
385
+ await r(alice, async (r) => {
386
+ await r(carol); // 0 likes
387
+ await r(alice); // 2 likes
388
+ await r(bob); // 1 like
389
+ });
390
+ // 3 likes
391
+ await r(carol, async (r) => {
392
+ await r(bob); // 1 like
393
+ await r(carol); // 2 likes
394
+ await r(alice); // 0 likes
395
+ });
396
+ // 2 likes
397
+ await r(bob, async (r) => {
398
+ await r(bob); // 2 likes
399
+ await r(alice); // 1 like
400
+ await r(carol); // 0 likes
401
+ });
402
+ });
403
+ // likes depth 1
404
+ await sc.like(alice.did, r['2'].ref);
405
+ await sc.like(carol.did, r['2'].ref);
406
+ await sc.like(op.did, r['1'].ref); // op like
407
+ await sc.like(bob.did, r['1'].ref);
408
+ await sc.like(carol.did, r['1'].ref);
409
+ // likes depth 2
410
+ await sc.like(bob.did, r['0.1'].ref);
411
+ await sc.like(carol.did, r['0.1'].ref);
412
+ await sc.like(op.did, r['0.2'].ref); // op like
413
+ await sc.like(bob.did, r['1.1'].ref);
414
+ await sc.like(carol.did, r['1.1'].ref);
415
+ await sc.like(bob.did, r['1.0'].ref);
416
+ await sc.like(bob.did, r['2.0'].ref);
417
+ await sc.like(carol.did, r['2.0'].ref);
418
+ await sc.like(bob.did, r['2.1'].ref);
419
+ return {
420
+ seedClient: sc,
421
+ users,
422
+ root,
423
+ r,
424
+ };
425
+ }
426
+ export async function bumpOpAndViewer(sc) {
427
+ const users = await createUsers(sc, 'bumpOV', [
428
+ 'op',
429
+ 'viewer',
430
+ 'alice',
431
+ 'bob',
432
+ 'carol',
433
+ ]);
434
+ const { op, viewer, alice, bob, carol } = users;
435
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
436
+ // 1 like
437
+ await r(alice, async (r) => {
438
+ await r(carol); // 0 likes
439
+ await r(alice); // 2 likes
440
+ await r(bob); // 1 like
441
+ await r(viewer); // 0 likes
442
+ await r(op); // 0 likes
443
+ });
444
+ // 3 likes
445
+ await r(carol, async (r) => {
446
+ await r(bob); // 1 like
447
+ await r(carol); // 2 likes
448
+ await r(op); // 0 likes
449
+ await r(viewer); // 1 like
450
+ await r(alice); // 0 likes
451
+ });
452
+ // 2 likes
453
+ await r(bob, async (r) => {
454
+ await r(viewer); // 0 likes
455
+ await r(bob); // 4 likes
456
+ await r(op); // 0 likes
457
+ await r(alice); // 1 like
458
+ await r(carol); // 1 like
459
+ });
460
+ // 0 likes
461
+ await r(op, async (r) => {
462
+ await r(viewer); // 0 likes
463
+ await r(bob); // 0 likes
464
+ await r(op); // 0 likes
465
+ await r(alice); // 0 likes
466
+ await r(carol); // 0 likes
467
+ });
468
+ // 0 likes
469
+ await r(viewer, async (r) => {
470
+ await r(bob); // 1 like
471
+ await r(carol); // 1 like
472
+ await r(op); // 0 likes
473
+ await r(viewer); // 0 likes
474
+ await r(alice); // 0 likes
475
+ });
476
+ });
477
+ // likes depth 1
478
+ await sc.like(alice.did, r['2'].ref);
479
+ await sc.like(carol.did, r['2'].ref);
480
+ await sc.like(viewer.did, r['0'].ref);
481
+ await sc.like(op.did, r['1'].ref); // op like
482
+ await sc.like(bob.did, r['1'].ref);
483
+ await sc.like(carol.did, r['1'].ref);
484
+ // likes depth 2
485
+ await sc.like(bob.did, r['0.1'].ref);
486
+ await sc.like(carol.did, r['0.1'].ref);
487
+ await sc.like(op.did, r['0.2'].ref); // op like
488
+ await sc.like(bob.did, r['1.1'].ref);
489
+ await sc.like(carol.did, r['1.1'].ref);
490
+ await sc.like(bob.did, r['1.0'].ref);
491
+ await sc.like(alice.did, r['2.1'].ref);
492
+ await sc.like(bob.did, r['2.1'].ref);
493
+ await sc.like(carol.did, r['2.1'].ref);
494
+ await sc.like(viewer.did, r['2.1'].ref);
495
+ await sc.like(bob.did, r['1.3'].ref);
496
+ await sc.like(bob.did, r['2.3'].ref);
497
+ await sc.like(viewer.did, r['2.4'].ref);
498
+ await sc.like(viewer.did, r['4.0'].ref);
499
+ await sc.like(alice.did, r['4.1'].ref);
500
+ return {
501
+ seedClient: sc,
502
+ users,
503
+ root,
504
+ r,
505
+ };
506
+ }
507
+ export async function bumpGroupSorting(sc) {
508
+ const users = await createUsers(sc, 'bumpGS', [
509
+ 'op',
510
+ 'viewer',
511
+ 'alice',
512
+ ]);
513
+ const { op, viewer, alice } = users;
514
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
515
+ await r(viewer);
516
+ await r(op);
517
+ await r(alice);
518
+ await r(op);
519
+ await r(viewer);
520
+ await r(op);
521
+ await r(alice);
522
+ await r(viewer);
523
+ });
524
+ return {
525
+ seedClient: sc,
526
+ users,
527
+ root,
528
+ r,
529
+ };
530
+ }
531
+ export async function bumpFollows(sc) {
532
+ const users = await createUsers(sc, 'bumpF', [
533
+ 'op',
534
+ 'viewerF',
535
+ 'viewerNoF',
536
+ 'alice',
537
+ 'bob',
538
+ 'carol',
539
+ ]);
540
+ const { op, viewerF, viewerNoF, alice, bob, carol } = users;
541
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
542
+ await r(alice);
543
+ await r(bob);
544
+ await r(carol);
545
+ await r(op);
546
+ await r(viewerF);
547
+ await r(viewerNoF);
548
+ });
549
+ await sc.follow(viewerF.did, alice.did);
550
+ await sc.follow(viewerF.did, bob.did);
551
+ // Does not follow carol.
552
+ return {
553
+ seedClient: sc,
554
+ users,
555
+ root,
556
+ r,
557
+ };
558
+ }
559
+ export async function blockDeletionAuth(sc, labelerDid) {
560
+ const users = await createUsers(sc, 'bda', [
561
+ 'op',
562
+ 'opBlocked',
563
+ 'alice',
564
+ 'auth',
565
+ 'blocker',
566
+ 'blocked',
567
+ ]);
568
+ const { op, opBlocked, alice, auth, blocker, blocked } = users;
569
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
570
+ // 1p block, hidden for `blocked`.
571
+ await r(blocker, async (r) => {
572
+ await r(alice);
573
+ });
574
+ // 3p block, hidden for all.
575
+ await r(opBlocked, async (r) => {
576
+ await r(op);
577
+ await r(alice);
578
+ });
579
+ // Deleted, hidden for all.
580
+ await r(alice, async (r) => {
581
+ await r(alice);
582
+ });
583
+ // User configured to only be seen by authenticated users.
584
+ // Requires the test sets a `!no-unauthenticated` label for this user.
585
+ await r(auth, async (r) => {
586
+ // Another auth-only to show that the parent chain is preserved in the thread.
587
+ await r(auth, async (r) => {
588
+ await r(alice);
589
+ });
590
+ });
591
+ });
592
+ await sc.deletePost(alice.did, r['2'].ref.uri);
593
+ await sc.block(blocker.did, blocked.did);
594
+ await sc.block(op.did, opBlocked.did);
595
+ const db = sc.network.bsky.db.db;
596
+ await createLabel(db, {
597
+ src: labelerDid,
598
+ uri: auth.did,
599
+ cid: '',
600
+ val: '!no-unauthenticated',
601
+ });
602
+ return {
603
+ seedClient: sc,
604
+ users,
605
+ root,
606
+ r,
607
+ };
608
+ }
609
+ export async function mutes(sc) {
610
+ const users = await createUsers(sc, 'mutes', [
611
+ 'op',
612
+ 'opMuted',
613
+ 'alice',
614
+ 'muted',
615
+ 'muter',
616
+ ]);
617
+ const { op, opMuted, alice, muted, muter } = users;
618
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
619
+ await r(opMuted, async (r) => {
620
+ await r(alice);
621
+ await r(muted);
622
+ });
623
+ await r(muted, async (r) => {
624
+ await r(opMuted);
625
+ await r(alice);
626
+ });
627
+ });
628
+ await sc.mute(op.did, opMuted.did);
629
+ await sc.mute(muter.did, muted.did);
630
+ return {
631
+ seedClient: sc,
632
+ users,
633
+ root,
634
+ r,
635
+ };
636
+ }
637
+ export async function threadgated(sc) {
638
+ const users = await createUsers(sc, 'tg', [
639
+ 'op',
640
+ 'opMuted',
641
+ 'viewer',
642
+ 'alice',
643
+ 'bob',
644
+ ]);
645
+ const { op, opMuted, alice, bob } = users;
646
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
647
+ // Muted moves down below threadgated.
648
+ await r(opMuted);
649
+ // Threadgated moves down.
650
+ await r(alice, async (r) => {
651
+ await r(alice);
652
+ await r(bob);
653
+ await r(op); // OP moves up.
654
+ });
655
+ await r(bob, async (r) => {
656
+ await r(alice);
657
+ await r(bob); // Threadgated is omitted if fetched from the root.
658
+ await r(op); // OP moves down.
659
+ });
660
+ });
661
+ await sc.agent.app.bsky.feed.threadgate.create({
662
+ repo: op.did,
663
+ rkey: root.ref.uri.rkey,
664
+ }, {
665
+ post: root.ref.uriStr,
666
+ createdAt: new Date().toISOString(),
667
+ hiddenReplies: [r['1'].ref.uriStr, r['2.1'].ref.uriStr],
668
+ }, sc.getHeaders(op.did));
669
+ // Just throw a mute there to test the prioritization between muted and threadgated.
670
+ await sc.mute(op.did, opMuted.did);
671
+ return {
672
+ seedClient: sc,
673
+ users,
674
+ root,
675
+ r,
676
+ };
677
+ }
678
+ export async function tags(sc) {
679
+ const users = await createUsers(sc, 'tags', [
680
+ 'op',
681
+ 'alice',
682
+ 'down',
683
+ 'following',
684
+ 'hide',
685
+ 'viewer',
686
+ ]);
687
+ const { op, alice, down, following, hide, viewer } = users;
688
+ const { root, replies: r } = await createThread(sc, op, async (r) => {
689
+ await r(alice, async (r) => {
690
+ await r(alice);
691
+ await r(down);
692
+ await r(hide);
693
+ });
694
+ await r(down, async (r) => {
695
+ await r(alice);
696
+ await r(down);
697
+ await r(hide);
698
+ });
699
+ await r(hide, async (r) => {
700
+ await r(alice);
701
+ await r(down);
702
+ await r(hide);
703
+ });
704
+ await r(op);
705
+ await r(viewer);
706
+ await r(following);
707
+ });
708
+ await sc.network.processAll();
709
+ await sc.follow(viewer.did, following.did);
710
+ const db = sc.network.bsky.db.db;
711
+ await createTag(db, { uri: r['1'].ref.uriStr, val: TAG_BUMP_DOWN });
712
+ await createTag(db, { uri: r['0.1'].ref.uriStr, val: TAG_BUMP_DOWN });
713
+ await createTag(db, { uri: r['1.1'].ref.uriStr, val: TAG_BUMP_DOWN });
714
+ await createTag(db, { uri: r['2.1'].ref.uriStr, val: TAG_BUMP_DOWN });
715
+ await createTag(db, { uri: r['2'].ref.uriStr, val: TAG_HIDE });
716
+ await createTag(db, { uri: r['0.2'].ref.uriStr, val: TAG_HIDE });
717
+ await createTag(db, { uri: r['1.2'].ref.uriStr, val: TAG_HIDE });
718
+ await createTag(db, { uri: r['2.2'].ref.uriStr, val: TAG_HIDE });
719
+ // Neither tag affect op, viewer.
720
+ await createTag(db, { uri: r['3'].ref.uriStr, val: TAG_BUMP_DOWN });
721
+ await createTag(db, { uri: r['4'].ref.uriStr, val: TAG_HIDE });
722
+ // Tags affect following depending on the config to prioritize following.
723
+ await createTag(db, { uri: r['5'].ref.uriStr, val: TAG_HIDE });
724
+ return {
725
+ seedClient: sc,
726
+ users,
727
+ root,
728
+ r,
729
+ };
730
+ }
731
+ const createLabel = async (db, opts) => {
732
+ await db
733
+ .insertInto('label')
734
+ .values({
735
+ uri: opts.uri,
736
+ cid: opts.cid,
737
+ val: opts.val,
738
+ cts: new Date().toISOString(),
739
+ exp: opts.exp ?? null,
740
+ neg: false,
741
+ src: opts.src,
742
+ })
743
+ .execute();
744
+ };
745
+ const createTag = async (db, opts) => {
746
+ await db
747
+ .updateTable('record')
748
+ .set({
749
+ tags: JSON.stringify([opts.val]),
750
+ })
751
+ .where('uri', '=', opts.uri)
752
+ .returningAll()
753
+ .execute();
754
+ };
755
+ //# sourceMappingURL=thread-v2.js.map