@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,229 @@
1
+ import { chunkArray } from '@atproto/common-web'
2
+ import type { HandleString } from '@atproto/syntax'
3
+ import type { SeedClient } from './client.js'
4
+
5
+ export default async function usersBulkSeed(sc: SeedClient, max = Infinity) {
6
+ // @TODO when these are run in parallel, seem to get an intermittent
7
+ // "TypeError: fetch failed" while running the tests.
8
+ const userSubset = users.slice(0, Math.min(max, users.length))
9
+ const chunks = chunkArray(userSubset, 50)
10
+ for (const chunk of chunks) {
11
+ await Promise.all(
12
+ chunk.map(async (user) => {
13
+ const { handle, displayName } = user
14
+ await sc.createAccount(handle, {
15
+ handle,
16
+ password: 'password',
17
+ email: `${handle}@bsky.app`,
18
+ })
19
+ if (displayName !== null) {
20
+ await sc.createProfile(sc.dids[handle], displayName, '')
21
+ }
22
+ }),
23
+ )
24
+ }
25
+ return sc
26
+ }
27
+
28
+ const users: { handle: HandleString; displayName: string | null }[] = [
29
+ { handle: 'silas77.test', displayName: 'Tanya Denesik' },
30
+ { handle: 'nicolas-krajcik10.test', displayName: null },
31
+ { handle: 'lennie-strosin.test', displayName: null },
32
+ { handle: 'aliya-hodkiewicz.test', displayName: 'Carlton Abernathy IV' },
33
+ { handle: 'jeffrey-sawayn87.test', displayName: 'Patrick Sawayn' },
34
+ { handle: 'kaycee66.test', displayName: null },
35
+ { handle: 'adrienne49.test', displayName: 'Kim Streich' },
36
+ { handle: 'magnus53.test', displayName: 'Sally Funk' },
37
+ { handle: 'charles-spencer.test', displayName: null },
38
+ { handle: 'elta48.test', displayName: 'Dr. Lowell DuBuque' },
39
+ { handle: 'tressa-senger.test', displayName: null },
40
+ { handle: 'marietta-zboncak.test', displayName: null },
41
+ { handle: 'alexander-hickle.test', displayName: 'Winifred Harber' },
42
+ { handle: 'rodger-maggio24.test', displayName: 'Yolanda VonRueden' },
43
+ { handle: 'janiya48.test', displayName: 'Miss Terrell Ziemann' },
44
+ { handle: 'cayla-marquardt39.test', displayName: 'Rachel Kshlerin' },
45
+ { handle: 'jonathan-green.test', displayName: 'Erica Mertz' },
46
+ { handle: 'brycen-smith.test', displayName: null },
47
+ { handle: 'leonel-koch43.test', displayName: 'Karl Bosco IV' },
48
+ { handle: 'fidel-rath.test', displayName: null },
49
+ { handle: 'raleigh-metz.test', displayName: null },
50
+ { handle: 'kim41.test', displayName: null },
51
+ { handle: 'roderick-dibbert.test', displayName: null },
52
+ { handle: 'alec-bergnaum.test', displayName: 'Cody Berge' },
53
+ { handle: 'sven70.test', displayName: null },
54
+ { handle: 'ola-oconnell.test', displayName: null },
55
+ { handle: 'chauncey-klein.test', displayName: 'Kelvin Klein' },
56
+ { handle: 'ariel-krajcik.test', displayName: null },
57
+ { handle: 'murphy35.test', displayName: 'Mrs. Clifford Mertz' },
58
+ { handle: 'joshuah-parker11.test', displayName: null },
59
+ { handle: 'dewitt-wunsch.test', displayName: null },
60
+ { handle: 'kelton-nitzsche43.test', displayName: null },
61
+ { handle: 'dock-mann91.test', displayName: 'Miss Danielle Weber' },
62
+ { handle: 'herman-gleichner95.test', displayName: 'Kelli Schinner III' },
63
+ { handle: 'gerda-marquardt.test', displayName: 'Myron Wolf' },
64
+ { handle: 'jamil-batz.test', displayName: null },
65
+ { handle: 'hilario84.test', displayName: null },
66
+ { handle: 'kayli-bode.test', displayName: 'Miss Floyd McClure' },
67
+ { handle: 'elouise28.test', displayName: 'Alberta Fay' },
68
+ { handle: 'leann49.test', displayName: null },
69
+ { handle: 'javon24.test', displayName: null },
70
+ { handle: 'polly-shanahan45.test', displayName: null },
71
+ { handle: 'rosamond38.test', displayName: 'Karl Goyette' },
72
+ { handle: 'fredrick-mueller.test', displayName: null },
73
+ { handle: 'reina-runte33.test', displayName: 'Pablo Schmidt' },
74
+ { handle: 'bianka33.test', displayName: null },
75
+ { handle: 'carlos6.test', displayName: null },
76
+ { handle: 'jermain-smith.test', displayName: 'Eileen Stroman' },
77
+ { handle: 'gina97.test', displayName: null },
78
+ { handle: 'kiera97.test', displayName: null },
79
+ { handle: 'savannah-botsford.test', displayName: 'Darnell Kuvalis' },
80
+ { handle: 'lilliana-waters.test', displayName: null },
81
+ { handle: 'hailey-stroman.test', displayName: 'Elsa Schaden' },
82
+ { handle: 'dortha-terry.test', displayName: 'Nicole Bradtke' },
83
+ { handle: 'hank-powlowski32.test', displayName: null },
84
+ { handle: 'ervin-daugherty.test', displayName: null },
85
+ { handle: 'nannie18.test', displayName: null },
86
+ { handle: 'gilberto-watsica65.test', displayName: 'Ms. Ida Wilderman' },
87
+ { handle: 'kara-zieme58.test', displayName: 'Andres Towne' },
88
+ { handle: 'crystal-boyle.test', displayName: null },
89
+ { handle: 'tobin63.test', displayName: 'Alex Johnson' },
90
+ { handle: 'isai-kunze72.test', displayName: 'Marion Dickinson' },
91
+ { handle: 'paris-swift.test', displayName: null },
92
+ { handle: 'nestor90.test', displayName: 'Travis Hoppe' },
93
+ { handle: 'aliyah-flatley12.test', displayName: 'Loren Krajcik' },
94
+ { handle: 'maiya42.test', displayName: null },
95
+ { handle: 'dovie33.test', displayName: null },
96
+ { handle: 'kendra-ledner80.test', displayName: 'Sergio Hane' },
97
+ { handle: 'greyson-tromp3.test', displayName: null },
98
+ { handle: 'precious-fay.test', displayName: null },
99
+ { handle: 'kiana-schmitt39.test', displayName: null },
100
+ { handle: 'rhianna-stamm29.test', displayName: null },
101
+ { handle: 'tiara-mohr.test', displayName: null },
102
+ { handle: 'eleazar-balist70.test', displayName: 'Gordon Weissnat' },
103
+ { handle: 'bettie-bogisich96.test', displayName: null },
104
+ { handle: 'lura-jacobi55.test', displayName: null },
105
+ { handle: 'santa-hermann78.test', displayName: 'Melissa Johnson' },
106
+ { handle: 'dylan61.test', displayName: null },
107
+ { handle: 'ryley-kerluke.test', displayName: 'Alexander Purdy' },
108
+ { handle: 'moises-bins8.test', displayName: null },
109
+ { handle: 'angelita-schaef27.test', displayName: null },
110
+ { handle: 'natasha83.test', displayName: 'Dean Romaguera' },
111
+ { handle: 'sydni48.test', displayName: null },
112
+ { handle: 'darrion91.test', displayName: 'Jeanette Weimann' },
113
+ { handle: 'reynold-ortiz.test', displayName: null },
114
+ { handle: 'hassie-schuppe.test', displayName: 'Rita Zieme' },
115
+ { handle: 'clark-stehr8.test', displayName: 'Sammy Larkin' },
116
+ { handle: 'preston-harris.test', displayName: 'Ms. Bradford Thiel' },
117
+ { handle: 'benedict-schulist.test', displayName: 'Todd Stark' },
118
+ { handle: 'alden-wolff22.test', displayName: null },
119
+ { handle: 'joel-gulgowski.test', displayName: null },
120
+ { handle: 'joanie56.test', displayName: 'Ms. Darin Cole' },
121
+ { handle: 'israel-hermann0.test', displayName: 'Wilbur Schuster' },
122
+ { handle: 'tracy56.test', displayName: null },
123
+ { handle: 'kyle72.test', displayName: null },
124
+ { handle: 'gunnar-dare70.test', displayName: 'Mrs. Angelo Keeling' },
125
+ { handle: 'justus58.test', displayName: null },
126
+ { handle: 'brooke24.test', displayName: 'Clint Ward' },
127
+ { handle: 'angela-morissette.test', displayName: 'Jim Kertzmann' },
128
+ { handle: 'amy-bins.test', displayName: 'Angelina Hills' },
129
+ { handle: 'susanna81.test', displayName: null },
130
+ { handle: 'jailyn-hettinger50.test', displayName: 'Sheldon Ratke' },
131
+ { handle: 'wendell-hansen54.test', displayName: null },
132
+ { handle: 'jennyfer-spinka.test', displayName: 'Leticia Blick' },
133
+ { handle: 'alexandrea31.test', displayName: 'Leslie Von' },
134
+ { handle: 'hazle-davis.test', displayName: 'Ella Farrell' },
135
+ { handle: 'alta6.test', displayName: null },
136
+ { handle: 'sherwood4.test', displayName: 'Dr. Hattie Nienow I' },
137
+ { handle: 'marilie24.test', displayName: 'Gene Howell' },
138
+ { handle: 'jimmie-feeney82.test', displayName: null },
139
+ { handle: 'trisha-ohara.test', displayName: null },
140
+ { handle: 'jake-schuster33.test', displayName: 'Raymond Price' },
141
+ { handle: 'shane-torphy52.test', displayName: 'Sadie Carter' },
142
+ { handle: 'nakia-kuphal8.test', displayName: null },
143
+ { handle: 'lea-trantow.test', displayName: null },
144
+ { handle: 'joel62.test', displayName: 'Veronica Nitzsche' },
145
+ { handle: 'roosevelt33.test', displayName: 'Jay Moen' },
146
+ { handle: 'talon-okeefe85.test', displayName: null },
147
+ { handle: 'herman-dare.test', displayName: 'Eric White' },
148
+ { handle: 'flavio-fay.test', displayName: 'John Lindgren' },
149
+ { handle: 'elyse-prosacco.test', displayName: null },
150
+ { handle: 'jessyca-wiegand23.test', displayName: 'Debra Lockman' },
151
+ { handle: 'ara-spencer41.test', displayName: null },
152
+ { handle: 'frederic-fadel.test', displayName: null },
153
+ { handle: 'zora-gerlach.test', displayName: 'Noel Hansen' },
154
+ { handle: 'spencer4.test', displayName: 'Marjorie Gorczany' },
155
+ { handle: 'gage-wilkinson33.test', displayName: 'Preston Schoen V' },
156
+ { handle: 'kiley-runolfsson1.test', displayName: null },
157
+ { handle: 'ramona80.test', displayName: 'Sylvia Dietrich' },
158
+ { handle: 'rashad97.test', displayName: null },
159
+ { handle: 'kylie76.test', displayName: 'Josefina Pfeffer' },
160
+ { handle: 'alisha-zieme.test', displayName: null },
161
+ { handle: 'claud79.test', displayName: null },
162
+ { handle: 'jairo-kuvalis.test', displayName: 'Derrick Jacobson' },
163
+ { handle: 'delfina-emard.test', displayName: null },
164
+ { handle: 'waino-gutmann20.test', displayName: 'Wesley Kemmer' },
165
+ { handle: 'arvid-hermiston49.test', displayName: 'Vernon Towne PhD' },
166
+ { handle: 'hans79.test', displayName: 'Rex Hartmann' },
167
+ { handle: 'karlee-greenholt40.test', displayName: null },
168
+ { handle: 'nels-cummings.test', displayName: null },
169
+ { handle: 'andrew-maggio.test', displayName: null },
170
+ { handle: 'stephany75.test', displayName: null },
171
+ { handle: 'alba-lueilwitz.test', displayName: null },
172
+ { handle: 'fermin47.test', displayName: null },
173
+ { handle: 'milo-quitzon3.test', displayName: null },
174
+ { handle: 'eudora-dietrich4.test', displayName: 'Carol Littel' },
175
+ { handle: 'uriel-witting12.test', displayName: 'Sophia Schmidt' },
176
+ { handle: 'reuben-stracke48.test', displayName: 'Darrell Walker MD' },
177
+ { handle: 'letitia-sawayn11.test', displayName: 'Mrs. Sophie Reilly' },
178
+ { handle: 'macy-schaden.test', displayName: 'Lindsey Klein' },
179
+ { handle: 'imelda61.test', displayName: 'Shannon Beier' },
180
+ { handle: 'oswald-bailey.test', displayName: 'Angel Mann' },
181
+ { handle: 'pattie-fisher34.test', displayName: null },
182
+ { handle: 'loyce95.test', displayName: 'Claude Tromp' },
183
+ { handle: 'melyna-zboncak.test', displayName: null },
184
+ { handle: 'rowan-parisian.test', displayName: 'Mr. Veronica Feeney' },
185
+ { handle: 'lois-blanda20.test', displayName: 'Todd Rolfson' },
186
+ { handle: 'turner-bali76.test', displayName: null },
187
+ { handle: 'dee-hoppe65.test', displayName: null },
188
+ { handle: 'nikko-rosenbaum60.test', displayName: 'Joann Gutmann' },
189
+ { handle: 'cornell-rom53.test', displayName: null },
190
+ { handle: 'zack3.test', displayName: null },
191
+ { handle: 'fredrick41.test', displayName: 'Julius Kreiger' },
192
+ { handle: 'elwyn62.test', displayName: null },
193
+ { handle: 'isaias-hirthe37.test', displayName: 'Louis Cremin' },
194
+ { handle: 'ronaldo36.test', displayName: null },
195
+ { handle: 'jesse34.test', displayName: 'Bridget Schulist' },
196
+ { handle: 'darrel-mills17.test', displayName: null },
197
+ { handle: 'euna-mayert92.test', displayName: 'Grant Lang II' },
198
+ { handle: 'terrell92.test', displayName: null },
199
+ { handle: 'alyson-bogisich.test', displayName: 'Dana MacGyver' },
200
+ { handle: 'nicolas65.test', displayName: null },
201
+ { handle: 'bernita8.test', displayName: null },
202
+ { handle: 'gunner23.test', displayName: 'Maggie DuBuque' },
203
+ { handle: 'phoebe80.test', displayName: null },
204
+ { handle: 'cory-cruickshank.test', displayName: null },
205
+ { handle: 'conor-price.test', displayName: 'Ralph Daugherty III' },
206
+ { handle: 'rae91.test', displayName: null },
207
+ { handle: 'abigale-cronin.test', displayName: null },
208
+ { handle: 'aileen-reilly90.test', displayName: 'Charles Stanton' },
209
+ { handle: 'adrianna-hansen6.test', displayName: 'Elbert Langworth IV' },
210
+ { handle: 'pierre54.test', displayName: null },
211
+ { handle: 'jaida-stark62.test', displayName: 'Justin Stoltenberg MD' },
212
+ { handle: 'wade-witting.test', displayName: null },
213
+ { handle: 'yvonne-predovic5.test', displayName: 'Gregory Hamill' },
214
+ { handle: 'spencer-dubuque.test', displayName: null },
215
+ { handle: 'randi44.test', displayName: null },
216
+ { handle: 'maye-grimes.test', displayName: null },
217
+ { handle: 'margarette-effertz.test', displayName: null },
218
+ { handle: 'aimee98.test', displayName: null },
219
+ { handle: 'jaren-veum0.test', displayName: 'Dr. Omar Wolff' },
220
+ { handle: 'ariel-abbott54.test', displayName: 'Emanuel Powlowski' },
221
+ { handle: 'mercedes23.test', displayName: null },
222
+ { handle: 'jarrett-orn.test', displayName: null },
223
+ { handle: 'damion88.test', displayName: null },
224
+ { handle: 'nayeli-koss73.test', displayName: 'Johnny Lang' },
225
+ { handle: 'cara-wiegand69.test', displayName: null },
226
+ { handle: 'gideon-ohara51.test', displayName: null },
227
+ { handle: 'carolina-mcderm77.test', displayName: 'Latoya Windler' },
228
+ { handle: 'danyka90.test', displayName: 'Hope Kub' },
229
+ ]
@@ -0,0 +1,64 @@
1
+ import type { SeedClient } from './client.js'
2
+
3
+ export default async function usersSeed(sc: SeedClient) {
4
+ await sc.createAccount('alice', users.alice)
5
+ await sc.createAccount('bob', users.bob)
6
+ await sc.createAccount('carol', users.carol)
7
+ await sc.createAccount('dan', users.dan)
8
+
9
+ await sc.createProfile(
10
+ sc.dids.alice,
11
+ users.alice.displayName,
12
+ users.alice.description,
13
+ users.alice.selfLabels,
14
+ )
15
+ await sc.createProfile(
16
+ sc.dids.bob,
17
+ users.bob.displayName,
18
+ users.bob.description,
19
+ users.bob.selfLabels,
20
+ )
21
+
22
+ await sc.agent.api.chat.bsky.actor.declaration.create(
23
+ { repo: sc.dids.dan },
24
+ { allowIncoming: 'none' },
25
+ sc.getHeaders(sc.dids.dan),
26
+ )
27
+
28
+ return sc
29
+ }
30
+
31
+ const users = {
32
+ alice: {
33
+ email: 'alice@test.com',
34
+ handle: 'alice.test',
35
+ password: 'alice-pass',
36
+ displayName: 'ali',
37
+ description: 'its me!',
38
+ selfLabels: ['self-label-a', 'self-label-b'],
39
+ },
40
+ bob: {
41
+ email: 'bob@test.com',
42
+ handle: 'bob.test',
43
+ password: 'bob-pass',
44
+ displayName: 'bobby',
45
+ description: 'hi im bob label_me',
46
+ selfLabels: undefined,
47
+ },
48
+ carol: {
49
+ email: 'carol@test.com',
50
+ handle: 'carol.test',
51
+ password: 'carol-pass',
52
+ displayName: undefined,
53
+ description: undefined,
54
+ selfLabels: undefined,
55
+ },
56
+ dan: {
57
+ email: 'dan@test.com',
58
+ handle: 'dan.test',
59
+ password: 'dan-pass',
60
+ displayName: undefined,
61
+ description: undefined,
62
+ selfLabels: undefined,
63
+ },
64
+ } as const
@@ -0,0 +1,254 @@
1
+ import { INVALID_HANDLE } from '@atproto/syntax'
2
+ import type { TestNetwork } from '../network.js'
3
+ import type { SeedClient } from './client.js'
4
+
5
+ export default async (sc: SeedClient<TestNetwork>) => {
6
+ const labelerDid = sc.network.bsky.ctx.cfg.modServiceDid
7
+
8
+ await sc.createAccount('alice', users.alice)
9
+ await sc.createAccount('bob', users.bob)
10
+ await sc.createAccount('carol', users.carol)
11
+ await sc.createAccount('dan', users.dan)
12
+ await sc.createAccount('eve', users.eve)
13
+ await sc.createAccount('frank', users.frank)
14
+ await sc.createAccount('gus', users.gus)
15
+
16
+ // This user should be set a label 'impersonation` in the tests.
17
+ await sc.createAccount('impersonator', users.impersonator)
18
+
19
+ await sc.createAccount('nonverifier', users.nonverifier)
20
+
21
+ // These users should be set as verifiers via DB in the test,
22
+ // so their verifications are trusted by the app.
23
+ await sc.createAccount('verifier1', users.verifier1)
24
+ await sc.createAccount('verifier2', users.verifier2)
25
+ // This user should be set a label 'impersonation` in the tests.
26
+ await sc.createAccount('verifier3', users.verifier3)
27
+
28
+ await sc.createAccount('handleinvalid', users.handleinvalid)
29
+ await sc.createAccount('handleempty', users.handleempty)
30
+
31
+ for (const name in sc.dids) {
32
+ await sc.createProfile(sc.dids[name], `display-${name}`, `descript-${name}`)
33
+ }
34
+
35
+ // alice: the viewer, has no verifications at all.
36
+ // NOOP
37
+
38
+ // bob: has verifications by multiple verifiers.
39
+ await sc.verify(
40
+ sc.dids.verifier1,
41
+ sc.dids.bob,
42
+ sc.accounts[sc.dids.bob].handle,
43
+ sc.profiles[sc.dids.bob].displayName,
44
+ )
45
+ await sc.verify(
46
+ sc.dids.verifier2,
47
+ sc.dids.bob,
48
+ sc.accounts[sc.dids.bob].handle,
49
+ sc.profiles[sc.dids.bob].displayName,
50
+ )
51
+
52
+ // carol: has non-broken and broken verifications by verifiers.
53
+ await sc.verify(
54
+ sc.dids.verifier1,
55
+ sc.dids.carol,
56
+ sc.accounts[sc.dids.carol].handle,
57
+ sc.profiles[sc.dids.carol].displayName,
58
+ )
59
+ await sc.verify(
60
+ sc.dids.verifier2,
61
+ sc.dids.carol,
62
+ 'carol.old.handle', // Broken: this was the handle during verification and it changed later.
63
+ sc.profiles[sc.dids.carol].displayName,
64
+ )
65
+
66
+ // dan: has verifications by verifiers and non verifiers.
67
+ await sc.verify(
68
+ sc.dids.verifier1,
69
+ sc.dids.dan,
70
+ sc.accounts[sc.dids.dan].handle,
71
+ sc.profiles[sc.dids.dan].displayName,
72
+ )
73
+ await sc.verify(
74
+ sc.dids.nonverifier,
75
+ sc.dids.dan,
76
+ sc.accounts[sc.dids.dan].handle,
77
+ sc.profiles[sc.dids.dan].displayName,
78
+ )
79
+
80
+ // eve: has no verifications at all.
81
+ // NOOP
82
+
83
+ // frank: has only broken verifications by verifiers.
84
+ await sc.verify(
85
+ sc.dids.verifier2,
86
+ sc.dids.frank,
87
+ sc.accounts[sc.dids.frank].handle,
88
+ 'frank-old-name', // Broken: this was the name during verification and it changed later.
89
+ )
90
+
91
+ // gus: has only verifications by non verifiers.
92
+ await sc.verify(
93
+ sc.dids.nonverifier,
94
+ sc.dids.gus,
95
+ sc.accounts[sc.dids.gus].handle,
96
+ sc.profiles[sc.dids.gus].displayName,
97
+ )
98
+
99
+ // impersonator: has verification by verifier but should get the impersonator label during tests.
100
+ await sc.verify(
101
+ sc.dids.verifier1,
102
+ sc.dids.impersonator,
103
+ sc.accounts[sc.dids.impersonator].handle,
104
+ sc.profiles[sc.dids.impersonator].displayName,
105
+ )
106
+
107
+ // verifier1: is verifier and has verification by other verifier. Should show as a verifier, not just as verified.
108
+ await sc.verify(
109
+ sc.dids.verifier2,
110
+ sc.dids.verifier1,
111
+ sc.accounts[sc.dids.verifier1].handle,
112
+ sc.profiles[sc.dids.verifier1].displayName,
113
+ )
114
+
115
+ // verifier2: is verifier and has no verification by other verifier.
116
+ // NOOP
117
+
118
+ // handleinvalid: has verification but handle is set to invalid.
119
+ await sc.verify(
120
+ sc.dids.verifier1,
121
+ sc.dids.handleinvalid,
122
+ sc.accounts[sc.dids.handleinvalid].handle,
123
+ sc.profiles[sc.dids.handleinvalid].displayName,
124
+ )
125
+
126
+ // Process all events to sync actors to appview before modifying the DB
127
+ await sc.network.processAll()
128
+
129
+ // Do DB updates to change actors as needed for each case.
130
+ await createLabel(sc, labelerDid, {
131
+ src: labelerDid,
132
+ uri: sc.dids.impersonator,
133
+ cid: '',
134
+ val: 'impersonation',
135
+ })
136
+
137
+ await createLabel(sc, labelerDid, {
138
+ src: labelerDid,
139
+ uri: sc.dids.verifier3,
140
+ cid: '',
141
+ val: 'impersonation',
142
+ })
143
+
144
+ await sc.network.bsky.db.db
145
+ .updateTable('actor')
146
+ .set({ handle: INVALID_HANDLE })
147
+ .where('did', '=', sc.dids.handleinvalid)
148
+ .execute()
149
+ await sc.network.bsky.db.db
150
+ .updateTable('actor')
151
+ .set({ handle: null })
152
+ .where('did', '=', sc.dids.handleempty)
153
+ .execute()
154
+
155
+ return sc
156
+ }
157
+
158
+ const users = {
159
+ alice: {
160
+ email: 'alice@test.com',
161
+ handle: 'alice.test',
162
+ password: 'alice-pass',
163
+ },
164
+ bob: {
165
+ email: 'bob@test.com',
166
+ handle: 'bob.test',
167
+ password: 'bob-pass',
168
+ },
169
+ carol: {
170
+ email: 'carol@test.com',
171
+ handle: 'carol.test',
172
+ password: 'carol-pass',
173
+ },
174
+ dan: {
175
+ email: 'dan@test.com',
176
+ handle: 'dan.test',
177
+ password: 'dan-pass',
178
+ },
179
+ eve: {
180
+ email: 'eve@test.com',
181
+ handle: 'eve.test',
182
+ password: 'eve-pass',
183
+ },
184
+ frank: {
185
+ email: 'frank@test.com',
186
+ handle: 'frank.test',
187
+ password: 'frank-pass',
188
+ },
189
+ gus: {
190
+ email: 'gus@test.com',
191
+ handle: 'gus.test',
192
+ password: 'gus-pass',
193
+ },
194
+ impersonator: {
195
+ email: 'impersonator@test.com',
196
+ handle: 'impersonator.test',
197
+ password: 'impersonator-pass',
198
+ },
199
+ verifier1: {
200
+ email: 'verifier1@test.com',
201
+ handle: 'verifier1.test',
202
+ password: 'verifier1-pass',
203
+ },
204
+ verifier2: {
205
+ email: 'verifier2@test.com',
206
+ handle: 'verifier2.test',
207
+ password: 'verifier2-pass',
208
+ },
209
+ verifier3: {
210
+ email: 'verifier3@test.com',
211
+ handle: 'verifier3.test',
212
+ password: 'verifier3-pass',
213
+ },
214
+ nonverifier: {
215
+ email: 'nonverifier@test.com',
216
+ handle: 'nonverifier.test',
217
+ password: 'nonverifier-pass',
218
+ },
219
+ handleinvalid: {
220
+ email: 'handleinvalid@test.com',
221
+ handle: 'handleinvalid.test',
222
+ password: 'handleinvalid-pass',
223
+ },
224
+ handleempty: {
225
+ email: 'handleempty@test.com',
226
+ handle: 'handleempty.test',
227
+ password: 'handleempty-pass',
228
+ },
229
+ } as const
230
+
231
+ const createLabel = async (
232
+ sc: SeedClient<TestNetwork>,
233
+ labelerDid: string,
234
+ opts: {
235
+ src?: string
236
+ uri: string
237
+ cid: string
238
+ val: string
239
+ exp?: string
240
+ },
241
+ ) => {
242
+ await sc.network.bsky.db.db
243
+ .insertInto('label')
244
+ .values({
245
+ uri: opts.uri,
246
+ cid: opts.cid,
247
+ val: opts.val,
248
+ cts: new Date().toISOString(),
249
+ exp: opts.exp ?? null,
250
+ neg: false,
251
+ src: opts.src ?? labelerDid,
252
+ })
253
+ .execute()
254
+ }
@@ -0,0 +1,127 @@
1
+ import type { LexiconDoc } from '@atproto/lexicon'
2
+ import type { TestPds } from './pds.js'
3
+ import { ServiceProfile } from './service-profile.js'
4
+
5
+ const LEXICONS: readonly LexiconDoc[] = [
6
+ {
7
+ lexicon: 1,
8
+ id: 'com.atproto.moderation.basePermissions',
9
+ defs: {
10
+ main: {
11
+ type: 'permission-set',
12
+ title: 'Moderation',
13
+ 'title:lang': { fr: 'Modération' },
14
+ detail: 'Create moderation reports',
15
+ 'detail:lang': {
16
+ 'fr-FR': 'Créer des rapports de modération',
17
+ },
18
+ permissions: [
19
+ {
20
+ type: 'permission',
21
+ resource: 'rpc',
22
+ aud: '*',
23
+ lxm: ['com.atproto.moderation.createReport'],
24
+ },
25
+ ],
26
+ },
27
+ },
28
+ },
29
+ {
30
+ lexicon: 1,
31
+ id: 'com.example.calendar.basePermissions',
32
+ defs: {
33
+ main: {
34
+ type: 'permission-set',
35
+ title: 'Calendar',
36
+ 'title:lang': { fr: 'Calendrier' },
37
+ detail: 'Manage your events and RSVPs',
38
+ 'detail:lang': {
39
+ 'fr-BE': 'Gérer vos événements et réponses',
40
+ },
41
+ permissions: [
42
+ {
43
+ type: 'permission',
44
+ resource: 'rpc',
45
+ inheritAud: true,
46
+ lxm: [
47
+ 'com.example.calendar.listEvents',
48
+ 'com.example.calendar.getEventDetails',
49
+ 'com.example.calendar.getEventRsvps',
50
+ ],
51
+ },
52
+ {
53
+ type: 'permission',
54
+ resource: 'repo',
55
+ collection: [
56
+ 'com.example.calendar.event',
57
+ 'com.example.calendar.rsvp',
58
+ ],
59
+ },
60
+ {
61
+ type: 'permission',
62
+ resource: 'blob',
63
+ accept: ['image/*', 'video/*'],
64
+ },
65
+ ],
66
+ },
67
+ },
68
+ },
69
+ // A `space` declaration. The OAuth provider resolves this at token issuance to
70
+ // expand a bare `space:com.example.group` grant into the space type's declared
71
+ // collections, so a test that grants a bare space scope needs the doc to be
72
+ // resolvable.
73
+ //
74
+ // @NOTE this does *not* make space record validation real: the PDS validates
75
+ // records against a hardcoded schema map (see `repo/prepare.ts`), which has a
76
+ // TODO for dynamic lexicon resolution. Records in a space collection still
77
+ // report `validationStatus: 'unknown'`.
78
+ {
79
+ lexicon: 1,
80
+ id: 'com.example.group',
81
+ defs: {
82
+ main: {
83
+ type: 'space',
84
+ key: 'any',
85
+ name: 'Example Group',
86
+ description: 'A permissioned group space, for dev and tests',
87
+ 'name:lang': { fr: 'Groupe Exemple' },
88
+ collections: ['com.example.groupPost', 'com.example.groupNote'],
89
+ },
90
+ },
91
+ },
92
+ ]
93
+
94
+ export class LexiconAuthorityProfile extends ServiceProfile {
95
+ public static async create(
96
+ pds: TestPds,
97
+ userDetails = {
98
+ email: 'lex-authority@test.com',
99
+ handle: 'lex-authority.test',
100
+ password: 'hunter2',
101
+ },
102
+ ) {
103
+ const agent = pds.getAgent()
104
+ await agent.createAccount(userDetails)
105
+
106
+ return new LexiconAuthorityProfile(pds, agent, userDetails)
107
+ }
108
+
109
+ async createRecords() {
110
+ await this.agent.app.bsky.actor.profile.create(
111
+ { repo: this.did },
112
+ {
113
+ displayName: 'Lexicon Authority',
114
+ description: `the repo containing all the lexicons that can be resolved in dev`,
115
+ },
116
+ )
117
+
118
+ for (const doc of LEXICONS) {
119
+ await this.agent.com.atproto.repo.createRecord({
120
+ repo: this.did,
121
+ collection: 'com.atproto.lexicon.schema',
122
+ rkey: doc.id,
123
+ record: doc,
124
+ })
125
+ }
126
+ }
127
+ }