@atproto/api 0.20.23 → 0.20.26

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 (74) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/agent.d.ts +4 -0
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +17 -0
  5. package/dist/agent.js.map +1 -1
  6. package/dist/client/lexicons.d.ts +8 -0
  7. package/dist/client/lexicons.d.ts.map +1 -1
  8. package/dist/client/lexicons.js +4 -0
  9. package/dist/client/lexicons.js.map +1 -1
  10. package/dist/client/types/app/bsky/actor/defs.d.ts +2 -0
  11. package/dist/client/types/app/bsky/actor/defs.d.ts.map +1 -1
  12. package/dist/client/types/app/bsky/actor/defs.js.map +1 -1
  13. package/dist/rich-text/detection.d.ts.map +1 -1
  14. package/dist/rich-text/detection.js +4 -1
  15. package/dist/rich-text/detection.js.map +1 -1
  16. package/dist/types.d.ts +1 -0
  17. package/dist/types.d.ts.map +1 -1
  18. package/dist/types.js.map +1 -1
  19. package/package.json +22 -16
  20. package/definitions/labels.json +0 -170
  21. package/docs/moderation.md +0 -260
  22. package/jest.config.cjs +0 -23
  23. package/jest.d.ts +0 -20
  24. package/jest.setup.ts +0 -97
  25. package/scripts/code/labels.mjs +0 -77
  26. package/scripts/generate-code.mjs +0 -4
  27. package/src/age-assurance.test.ts +0 -218
  28. package/src/age-assurance.ts +0 -137
  29. package/src/agent.ts +0 -1645
  30. package/src/atp-agent.ts +0 -570
  31. package/src/bsky-agent.ts +0 -14
  32. package/src/const.ts +0 -1
  33. package/src/index.ts +0 -44
  34. package/src/mocker.ts +0 -220
  35. package/src/moderation/decision.ts +0 -389
  36. package/src/moderation/index.ts +0 -69
  37. package/src/moderation/mutewords.ts +0 -170
  38. package/src/moderation/subjects/account.ts +0 -44
  39. package/src/moderation/subjects/feed-generator.ts +0 -24
  40. package/src/moderation/subjects/notification.ts +0 -25
  41. package/src/moderation/subjects/post.ts +0 -433
  42. package/src/moderation/subjects/profile.ts +0 -26
  43. package/src/moderation/subjects/status.ts +0 -27
  44. package/src/moderation/subjects/user-list.ts +0 -48
  45. package/src/moderation/types.ts +0 -191
  46. package/src/moderation/ui.ts +0 -21
  47. package/src/moderation/util.ts +0 -111
  48. package/src/predicate.ts +0 -52
  49. package/src/rich-text/detection.ts +0 -146
  50. package/src/rich-text/rich-text.ts +0 -418
  51. package/src/rich-text/sanitization.ts +0 -42
  52. package/src/rich-text/unicode.ts +0 -47
  53. package/src/rich-text/util.ts +0 -15
  54. package/src/session-manager.ts +0 -5
  55. package/src/types.ts +0 -165
  56. package/src/util.ts +0 -96
  57. package/tests/atp-agent.test.ts +0 -3863
  58. package/tests/dispatcher.test.ts +0 -527
  59. package/tests/errors.test.ts +0 -29
  60. package/tests/moderation-behaviors.test.ts +0 -951
  61. package/tests/moderation-custom-labels.test.ts +0 -334
  62. package/tests/moderation-mutewords.test.ts +0 -1299
  63. package/tests/moderation-prefs.test.ts +0 -402
  64. package/tests/moderation-quoteposts.test.ts +0 -277
  65. package/tests/moderation.test.ts +0 -739
  66. package/tests/rich-text-detection.test.ts +0 -456
  67. package/tests/rich-text-sanitization.test.ts +0 -216
  68. package/tests/rich-text.test.ts +0 -705
  69. package/tests/util/echo-server.ts +0 -37
  70. package/tests/util/moderation-behavior.ts +0 -268
  71. package/tsconfig.build.json +0 -9
  72. package/tsconfig.build.tsbuildinfo +0 -1
  73. package/tsconfig.json +0 -7
  74. package/tsconfig.tests.json +0 -10
@@ -1,739 +0,0 @@
1
- import {
2
- ModerationOpts,
3
- interpretLabelValueDefinition,
4
- mock,
5
- moderatePost,
6
- moderateProfile,
7
- } from '../src/index.js'
8
- import './util/moderation-behavior.js'
9
-
10
- describe('Moderation', () => {
11
- it('Applies self-labels on profiles according to the global preferences', () => {
12
- // porn (hide)
13
- const res1 = moderateProfile(
14
- mock.profileViewBasic({
15
- handle: 'bob.test',
16
- displayName: 'Bob',
17
- labels: [
18
- {
19
- src: 'did:web:bob.test',
20
- uri: 'at://did:web:bob.test/app.bsky.actor.profile/self',
21
- val: 'porn',
22
- cts: new Date().toISOString(),
23
- },
24
- ],
25
- }),
26
- {
27
- userDid: 'did:web:alice.test',
28
- prefs: {
29
- adultContentEnabled: true,
30
- labels: {
31
- porn: 'hide',
32
- },
33
- labelers: [],
34
- hiddenPosts: [],
35
- mutedWords: [],
36
- },
37
- },
38
- )
39
- expect(res1.ui('avatar')).toBeModerationResult(
40
- ['blur'],
41
- 'post avatar',
42
- JSON.stringify(res1, null, 2),
43
- true,
44
- )
45
-
46
- // porn (ignore)
47
- const res2 = moderateProfile(
48
- mock.profileViewBasic({
49
- handle: 'bob.test',
50
- displayName: 'Bob',
51
- labels: [
52
- {
53
- src: 'did:web:bob.test',
54
- uri: 'at://did:web:bob.test/app.bsky.actor.profile/self',
55
- val: 'porn',
56
- cts: new Date().toISOString(),
57
- },
58
- ],
59
- }),
60
- {
61
- userDid: 'did:web:alice.test',
62
- prefs: {
63
- adultContentEnabled: true,
64
- labels: {
65
- porn: 'ignore',
66
- },
67
- labelers: [],
68
- hiddenPosts: [],
69
- mutedWords: [],
70
- },
71
- },
72
- )
73
- expect(res2.ui('avatar')).toBeModerationResult(
74
- [],
75
- 'post avatar',
76
- JSON.stringify(res1, null, 2),
77
- true,
78
- )
79
- })
80
-
81
- it('Ignores labels from unsubscribed moderators or ignored labels for a moderator', () => {
82
- // porn (moderator disabled)
83
- const res1 = moderateProfile(
84
- mock.profileViewBasic({
85
- handle: 'bob.test',
86
- displayName: 'Bob',
87
- labels: [
88
- {
89
- src: 'did:web:labeler.test',
90
- uri: 'at://did:web:bob.test/app.bsky.actor.profile/self',
91
- val: 'porn',
92
- cts: new Date().toISOString(),
93
- },
94
- ],
95
- }),
96
- {
97
- userDid: 'did:web:alice.test',
98
- prefs: {
99
- adultContentEnabled: true,
100
- labels: {
101
- porn: 'hide',
102
- },
103
- labelers: [],
104
- hiddenPosts: [],
105
- mutedWords: [],
106
- },
107
- },
108
- )
109
- for (const k of [
110
- 'profileList',
111
- 'profileView',
112
- 'avatar',
113
- 'banner',
114
- 'displayName',
115
- 'contentList',
116
- 'contentView',
117
- 'contentMedia',
118
- ] as const) {
119
- expect(res1.ui(k)).toBeModerationResult(
120
- [],
121
- k,
122
- JSON.stringify(res1, null, 2),
123
- )
124
- }
125
-
126
- // porn (label group disabled)
127
- const res2 = moderateProfile(
128
- mock.profileViewBasic({
129
- handle: 'bob.test',
130
- displayName: 'Bob',
131
- labels: [
132
- {
133
- src: 'did:web:labeler.test',
134
- uri: 'at://did:web:bob.test/app.bsky.actor.profile/self',
135
- val: 'porn',
136
- cts: new Date().toISOString(),
137
- },
138
- ],
139
- }),
140
- {
141
- userDid: 'did:web:alice.test',
142
- prefs: {
143
- adultContentEnabled: true,
144
- labels: {
145
- porn: 'ignore',
146
- },
147
- labelers: [
148
- {
149
- did: 'did:web:labeler.test',
150
- labels: { porn: 'ignore' },
151
- },
152
- ],
153
- hiddenPosts: [],
154
- mutedWords: [],
155
- },
156
- },
157
- )
158
- for (const k of [
159
- 'profileList',
160
- 'profileView',
161
- 'avatar',
162
- 'banner',
163
- 'displayName',
164
- 'contentList',
165
- 'contentView',
166
- 'contentMedia',
167
- ] as const) {
168
- expect(res2.ui(k)).toBeModerationResult(
169
- [],
170
- k,
171
- JSON.stringify(res2, null, 2),
172
- )
173
- }
174
- })
175
-
176
- it('Can manually apply hiding', () => {
177
- const res1 = moderatePost(
178
- mock.postView({
179
- record: {
180
- $type: 'app.bsky.feed.post',
181
- text: 'Hello',
182
- createdAt: new Date().toISOString(),
183
- },
184
- author: mock.profileViewBasic({
185
- handle: 'bob.test',
186
- displayName: 'Bob',
187
- }),
188
- labels: [],
189
- }),
190
- {
191
- userDid: 'did:web:alice.test',
192
- prefs: {
193
- adultContentEnabled: true,
194
- labels: {},
195
- labelers: [
196
- {
197
- did: 'did:web:labeler.test',
198
- labels: {},
199
- },
200
- ],
201
- hiddenPosts: [],
202
- mutedWords: [],
203
- },
204
- },
205
- )
206
- res1.addHidden(true)
207
- expect(res1.ui('contentList')).toBeModerationResult(
208
- ['filter', 'blur'],
209
- 'contentList',
210
- )
211
- expect(res1.ui('contentView')).toBeModerationResult(['blur'], 'contentView')
212
- })
213
-
214
- it('Prioritizes filters and blurs correctly on merge', () => {
215
- const res1 = moderatePost(
216
- mock.postView({
217
- record: {
218
- $type: 'app.bsky.feed.post',
219
- text: 'Hello',
220
- createdAt: new Date().toISOString(),
221
- },
222
- author: mock.profileViewBasic({
223
- handle: 'bob.test',
224
- displayName: 'Bob',
225
- }),
226
- labels: [
227
- {
228
- src: 'did:web:labeler.test',
229
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
230
- val: 'porn',
231
- cts: new Date().toISOString(),
232
- },
233
- {
234
- src: 'did:web:labeler.test',
235
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
236
- val: '!hide',
237
- cts: new Date().toISOString(),
238
- },
239
- ],
240
- }),
241
- {
242
- userDid: 'did:web:alice.test',
243
- prefs: {
244
- adultContentEnabled: true,
245
- labels: {
246
- porn: 'hide',
247
- },
248
- labelers: [
249
- {
250
- did: 'did:web:labeler.test',
251
- labels: {},
252
- },
253
- ],
254
- hiddenPosts: [],
255
- mutedWords: [],
256
- },
257
- },
258
- )
259
- expect((res1.ui('contentList').filters[0] as any).label.val).toBe('!hide')
260
- expect((res1.ui('contentList').filters[1] as any).label.val).toBe('porn')
261
- expect((res1.ui('contentList').blurs[0] as any).label.val).toBe('!hide')
262
- expect((res1.ui('contentMedia').blurs[0] as any).label.val).toBe('porn')
263
- })
264
-
265
- it('Prioritizes custom label definitions', () => {
266
- const modOpts: ModerationOpts = {
267
- userDid: 'did:web:alice.test',
268
- prefs: {
269
- adultContentEnabled: true,
270
- labels: { porn: 'warn' },
271
- labelers: [
272
- {
273
- did: 'did:web:labeler.test',
274
- labels: { porn: 'warn' },
275
- },
276
- ],
277
- hiddenPosts: [],
278
- mutedWords: [],
279
- },
280
- labelDefs: {
281
- 'did:web:labeler.test': [
282
- interpretLabelValueDefinition(
283
- {
284
- identifier: 'porn',
285
- blurs: 'none',
286
- severity: 'inform',
287
- locales: [],
288
- defaultSetting: 'warn',
289
- },
290
- 'did:web:labeler.test',
291
- ),
292
- ],
293
- },
294
- }
295
- const res = moderatePost(
296
- mock.postView({
297
- record: {
298
- $type: 'app.bsky.feed.post',
299
- text: 'Hello',
300
- createdAt: new Date().toISOString(),
301
- },
302
- author: mock.profileViewBasic({
303
- handle: 'bob.test',
304
- displayName: 'Bob',
305
- }),
306
- labels: [
307
- {
308
- src: 'did:web:labeler.test',
309
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
310
- val: 'porn',
311
- cts: new Date().toISOString(),
312
- },
313
- ],
314
- }),
315
- modOpts,
316
- )
317
- expect(res.ui('profileList')).toBeModerationResult([])
318
- expect(res.ui('profileView')).toBeModerationResult([])
319
- expect(res.ui('avatar')).toBeModerationResult([])
320
- expect(res.ui('banner')).toBeModerationResult([])
321
- expect(res.ui('displayName')).toBeModerationResult([])
322
- expect(res.ui('contentList')).toBeModerationResult(['inform'])
323
- expect(res.ui('contentView')).toBeModerationResult(['inform'])
324
- expect(res.ui('contentMedia')).toBeModerationResult([])
325
- })
326
-
327
- it('Doesnt allow custom behaviors to override imperative labels', () => {
328
- const modOpts: ModerationOpts = {
329
- userDid: 'did:web:alice.test',
330
- prefs: {
331
- adultContentEnabled: true,
332
- labels: {},
333
- labelers: [
334
- {
335
- did: 'did:web:labeler.test',
336
- labels: {},
337
- },
338
- ],
339
- hiddenPosts: [],
340
- mutedWords: [],
341
- },
342
- labelDefs: {
343
- 'did:web:labeler.test': [
344
- interpretLabelValueDefinition(
345
- {
346
- identifier: '!hide',
347
- blurs: 'none',
348
- severity: 'inform',
349
- locales: [],
350
- defaultSetting: 'warn',
351
- },
352
- 'did:web:labeler.test',
353
- ),
354
- ],
355
- },
356
- }
357
- const res = moderatePost(
358
- mock.postView({
359
- record: {
360
- $type: 'app.bsky.feed.post',
361
- text: 'Hello',
362
- createdAt: new Date().toISOString(),
363
- },
364
- author: mock.profileViewBasic({
365
- handle: 'bob.test',
366
- displayName: 'Bob',
367
- }),
368
- labels: [
369
- {
370
- src: 'did:web:labeler.test',
371
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
372
- val: '!hide',
373
- cts: new Date().toISOString(),
374
- },
375
- ],
376
- }),
377
- modOpts,
378
- )
379
-
380
- expect(res.ui('profileList')).toBeModerationResult([])
381
- expect(res.ui('profileView')).toBeModerationResult([])
382
- expect(res.ui('avatar')).toBeModerationResult([])
383
- expect(res.ui('banner')).toBeModerationResult([])
384
- expect(res.ui('displayName')).toBeModerationResult([])
385
- expect(res.ui('contentList')).toBeModerationResult([
386
- 'filter',
387
- 'blur',
388
- 'noOverride',
389
- ])
390
- expect(res.ui('contentView')).toBeModerationResult(['blur', 'noOverride'])
391
- expect(res.ui('contentMedia')).toBeModerationResult([])
392
- })
393
-
394
- it('Ignores invalid label value names', () => {
395
- const modOpts: ModerationOpts = {
396
- userDid: 'did:web:alice.test',
397
- prefs: {
398
- adultContentEnabled: true,
399
- labels: {},
400
- labelers: [
401
- {
402
- did: 'did:web:labeler.test',
403
- labels: { BadLabel: 'hide', 'bad/label': 'hide' },
404
- },
405
- ],
406
- hiddenPosts: [],
407
- mutedWords: [],
408
- },
409
- labelDefs: {
410
- 'did:web:labeler.test': [
411
- interpretLabelValueDefinition(
412
- {
413
- identifier: 'BadLabel',
414
- blurs: 'content',
415
- severity: 'inform',
416
- locales: [],
417
- defaultSetting: 'warn',
418
- },
419
- 'did:web:labeler.test',
420
- ),
421
- interpretLabelValueDefinition(
422
- {
423
- identifier: 'bad/label',
424
- blurs: 'content',
425
- severity: 'inform',
426
- locales: [],
427
- defaultSetting: 'warn',
428
- },
429
- 'did:web:labeler.test',
430
- ),
431
- ],
432
- },
433
- }
434
- const res = moderatePost(
435
- mock.postView({
436
- record: {
437
- $type: 'app.bsky.feed.post',
438
- text: 'Hello',
439
- createdAt: new Date().toISOString(),
440
- },
441
- author: mock.profileViewBasic({
442
- handle: 'bob.test',
443
- displayName: 'Bob',
444
- }),
445
- labels: [
446
- {
447
- src: 'did:web:labeler.test',
448
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
449
- val: 'BadLabel',
450
- cts: new Date().toISOString(),
451
- },
452
- {
453
- src: 'did:web:labeler.test',
454
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
455
- val: 'bad/label',
456
- cts: new Date().toISOString(),
457
- },
458
- ],
459
- }),
460
- modOpts,
461
- )
462
-
463
- expect(res.ui('profileList')).toBeModerationResult([])
464
- expect(res.ui('profileView')).toBeModerationResult([])
465
- expect(res.ui('avatar')).toBeModerationResult([])
466
- expect(res.ui('banner')).toBeModerationResult([])
467
- expect(res.ui('displayName')).toBeModerationResult([])
468
- expect(res.ui('contentList')).toBeModerationResult([])
469
- expect(res.ui('contentView')).toBeModerationResult([])
470
- expect(res.ui('contentMedia')).toBeModerationResult([])
471
- })
472
-
473
- it('Custom labels can set the default setting', () => {
474
- const modOpts: ModerationOpts = {
475
- userDid: 'did:web:alice.test',
476
- prefs: {
477
- adultContentEnabled: true,
478
- labels: {},
479
- labelers: [
480
- {
481
- did: 'did:web:labeler.test',
482
- labels: {},
483
- },
484
- ],
485
- hiddenPosts: [],
486
- mutedWords: [],
487
- },
488
- labelDefs: {
489
- 'did:web:labeler.test': [
490
- interpretLabelValueDefinition(
491
- {
492
- identifier: 'default-hide',
493
- blurs: 'content',
494
- severity: 'inform',
495
- defaultSetting: 'hide',
496
- locales: [],
497
- },
498
- 'did:web:labeler.test',
499
- ),
500
- interpretLabelValueDefinition(
501
- {
502
- identifier: 'default-warn',
503
- blurs: 'content',
504
- severity: 'inform',
505
- defaultSetting: 'warn',
506
- locales: [],
507
- },
508
- 'did:web:labeler.test',
509
- ),
510
- interpretLabelValueDefinition(
511
- {
512
- identifier: 'default-ignore',
513
- blurs: 'content',
514
- severity: 'inform',
515
- defaultSetting: 'ignore',
516
- locales: [],
517
- },
518
- 'did:web:labeler.test',
519
- ),
520
- ],
521
- },
522
- }
523
- const res1 = moderatePost(
524
- mock.postView({
525
- record: {
526
- $type: 'app.bsky.feed.post',
527
- text: 'Hello',
528
- createdAt: new Date().toISOString(),
529
- },
530
- author: mock.profileViewBasic({
531
- handle: 'bob.test',
532
- displayName: 'Bob',
533
- }),
534
- labels: [
535
- {
536
- src: 'did:web:labeler.test',
537
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
538
- val: 'default-hide',
539
- cts: new Date().toISOString(),
540
- },
541
- ],
542
- }),
543
- modOpts,
544
- )
545
-
546
- expect(res1.ui('profileList')).toBeModerationResult([])
547
- expect(res1.ui('profileView')).toBeModerationResult([])
548
- expect(res1.ui('avatar')).toBeModerationResult([])
549
- expect(res1.ui('banner')).toBeModerationResult([])
550
- expect(res1.ui('displayName')).toBeModerationResult([])
551
- expect(res1.ui('contentList')).toBeModerationResult(['filter', 'blur'])
552
- expect(res1.ui('contentView')).toBeModerationResult(['inform'])
553
- expect(res1.ui('contentMedia')).toBeModerationResult([])
554
-
555
- const res2 = moderatePost(
556
- mock.postView({
557
- record: {
558
- $type: 'app.bsky.feed.post',
559
- text: 'Hello',
560
- createdAt: new Date().toISOString(),
561
- },
562
- author: mock.profileViewBasic({
563
- handle: 'bob.test',
564
- displayName: 'Bob',
565
- }),
566
- labels: [
567
- {
568
- src: 'did:web:labeler.test',
569
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
570
- val: 'default-warn',
571
- cts: new Date().toISOString(),
572
- },
573
- ],
574
- }),
575
- modOpts,
576
- )
577
-
578
- expect(res2.ui('profileList')).toBeModerationResult([])
579
- expect(res2.ui('profileView')).toBeModerationResult([])
580
- expect(res2.ui('avatar')).toBeModerationResult([])
581
- expect(res2.ui('banner')).toBeModerationResult([])
582
- expect(res2.ui('displayName')).toBeModerationResult([])
583
- expect(res2.ui('contentList')).toBeModerationResult(['blur'])
584
- expect(res2.ui('contentView')).toBeModerationResult(['inform'])
585
- expect(res2.ui('contentMedia')).toBeModerationResult([])
586
-
587
- const res3 = moderatePost(
588
- mock.postView({
589
- record: {
590
- $type: 'app.bsky.feed.post',
591
- text: 'Hello',
592
- createdAt: new Date().toISOString(),
593
- },
594
- author: mock.profileViewBasic({
595
- handle: 'bob.test',
596
- displayName: 'Bob',
597
- }),
598
- labels: [
599
- {
600
- src: 'did:web:labeler.test',
601
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
602
- val: 'default-ignore',
603
- cts: new Date().toISOString(),
604
- },
605
- ],
606
- }),
607
- modOpts,
608
- )
609
-
610
- expect(res3.ui('profileList')).toBeModerationResult([])
611
- expect(res3.ui('profileView')).toBeModerationResult([])
612
- expect(res3.ui('avatar')).toBeModerationResult([])
613
- expect(res3.ui('banner')).toBeModerationResult([])
614
- expect(res3.ui('displayName')).toBeModerationResult([])
615
- expect(res3.ui('contentList')).toBeModerationResult([])
616
- expect(res3.ui('contentView')).toBeModerationResult([])
617
- expect(res3.ui('contentMedia')).toBeModerationResult([])
618
- })
619
-
620
- it('Custom labels can require adult content to be enabled', () => {
621
- const modOpts: ModerationOpts = {
622
- userDid: 'did:web:alice.test',
623
- prefs: {
624
- adultContentEnabled: false,
625
- labels: { adult: 'ignore' },
626
- labelers: [
627
- {
628
- did: 'did:web:labeler.test',
629
- labels: {
630
- adult: 'ignore',
631
- },
632
- },
633
- ],
634
- hiddenPosts: [],
635
- mutedWords: [],
636
- },
637
- labelDefs: {
638
- 'did:web:labeler.test': [
639
- interpretLabelValueDefinition(
640
- {
641
- identifier: 'adult',
642
- blurs: 'content',
643
- severity: 'inform',
644
- defaultSetting: 'hide',
645
- adultOnly: true,
646
- locales: [],
647
- },
648
- 'did:web:labeler.test',
649
- ),
650
- ],
651
- },
652
- }
653
- const res = moderatePost(
654
- mock.postView({
655
- record: {
656
- $type: 'app.bsky.feed.post',
657
- text: 'Hello',
658
- createdAt: new Date().toISOString(),
659
- },
660
- author: mock.profileViewBasic({
661
- handle: 'bob.test',
662
- displayName: 'Bob',
663
- }),
664
- labels: [
665
- {
666
- src: 'did:web:labeler.test',
667
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
668
- val: 'adult',
669
- cts: new Date().toISOString(),
670
- },
671
- ],
672
- }),
673
- modOpts,
674
- )
675
-
676
- expect(res.ui('profileList')).toBeModerationResult([])
677
- expect(res.ui('profileView')).toBeModerationResult([])
678
- expect(res.ui('avatar')).toBeModerationResult([])
679
- expect(res.ui('banner')).toBeModerationResult([])
680
- expect(res.ui('displayName')).toBeModerationResult([])
681
- expect(res.ui('contentList')).toBeModerationResult([
682
- 'filter',
683
- 'blur',
684
- 'noOverride',
685
- ])
686
- expect(res.ui('contentView')).toBeModerationResult(['blur', 'noOverride'])
687
- expect(res.ui('contentMedia')).toBeModerationResult([])
688
- })
689
-
690
- it('Adult content disabled forces the preference to hide', () => {
691
- const modOpts: ModerationOpts = {
692
- userDid: 'did:web:alice.test',
693
- prefs: {
694
- adultContentEnabled: false,
695
- labels: { porn: 'ignore' },
696
- labelers: [
697
- {
698
- did: 'did:web:labeler.test',
699
- labels: {},
700
- },
701
- ],
702
- hiddenPosts: [],
703
- mutedWords: [],
704
- },
705
- labelDefs: {},
706
- }
707
- const res = moderatePost(
708
- mock.postView({
709
- record: {
710
- $type: 'app.bsky.feed.post',
711
- text: 'Hello',
712
- createdAt: new Date().toISOString(),
713
- },
714
- author: mock.profileViewBasic({
715
- handle: 'bob.test',
716
- displayName: 'Bob',
717
- }),
718
- labels: [
719
- {
720
- src: 'did:web:labeler.test',
721
- uri: 'at://did:web:bob.test/app.bsky.post/fake',
722
- val: 'porn',
723
- cts: new Date().toISOString(),
724
- },
725
- ],
726
- }),
727
- modOpts,
728
- )
729
-
730
- expect(res.ui('profileList')).toBeModerationResult([])
731
- expect(res.ui('profileView')).toBeModerationResult([])
732
- expect(res.ui('avatar')).toBeModerationResult([])
733
- expect(res.ui('banner')).toBeModerationResult([])
734
- expect(res.ui('displayName')).toBeModerationResult([])
735
- expect(res.ui('contentList')).toBeModerationResult(['filter'])
736
- expect(res.ui('contentView')).toBeModerationResult([])
737
- expect(res.ui('contentMedia')).toBeModerationResult(['blur', 'noOverride'])
738
- })
739
- })