@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.
- package/CHANGELOG.md +3424 -0
- package/LICENSE.txt +7 -0
- package/README.md +39 -0
- package/bin.js +7 -0
- package/dist/bin-multi-pds.d.ts +2 -0
- package/dist/bin-multi-pds.d.ts.map +1 -0
- package/dist/bin-multi-pds.js +130 -0
- package/dist/bin-multi-pds.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +56 -0
- package/dist/bin.js.map +1 -0
- package/dist/bsky.d.ts +27 -0
- package/dist/bsky.d.ts.map +1 -0
- package/dist/bsky.js +165 -0
- package/dist/bsky.js.map +1 -0
- package/dist/bsync.d.ts +22 -0
- package/dist/bsync.d.ts.map +1 -0
- package/dist/bsync.js +54 -0
- package/dist/bsync.js.map +1 -0
- package/dist/const.d.ts +4 -0
- package/dist/const.d.ts.map +1 -0
- package/dist/const.js +4 -0
- package/dist/const.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/feed-gen.d.ts +15 -0
- package/dist/feed-gen.d.ts.map +1 -0
- package/dist/feed-gen.js +73 -0
- package/dist/feed-gen.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +22 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +65 -0
- package/dist/introspect.js.map +1 -0
- package/dist/mock/data.d.ts +3 -0
- package/dist/mock/data.d.ts.map +1 -0
- package/dist/mock/data.js +46 -0
- package/dist/mock/data.js.map +1 -0
- package/dist/mock/img/blur-hash-avatar-b64.d.ts +3 -0
- package/dist/mock/img/blur-hash-avatar-b64.d.ts.map +1 -0
- package/dist/mock/img/blur-hash-avatar-b64.js +2 -0
- package/dist/mock/img/blur-hash-avatar-b64.js.map +1 -0
- package/dist/mock/img/labeled-img-b64.d.ts +3 -0
- package/dist/mock/img/labeled-img-b64.d.ts.map +1 -0
- package/dist/mock/img/labeled-img-b64.js +2 -0
- package/dist/mock/img/labeled-img-b64.js.map +1 -0
- package/dist/mock/index.d.ts +3 -0
- package/dist/mock/index.d.ts.map +1 -0
- package/dist/mock/index.js +574 -0
- package/dist/mock/index.js.map +1 -0
- package/dist/moderator-client.d.ts +58 -0
- package/dist/moderator-client.d.ts.map +1 -0
- package/dist/moderator-client.js +110 -0
- package/dist/moderator-client.js.map +1 -0
- package/dist/network-no-appview.d.ts +21 -0
- package/dist/network-no-appview.d.ts.map +1 -0
- package/dist/network-no-appview.js +74 -0
- package/dist/network-no-appview.js.map +1 -0
- package/dist/network.d.ts +32 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +190 -0
- package/dist/network.js.map +1 -0
- package/dist/ozone.d.ts +31 -0
- package/dist/ozone.d.ts.map +1 -0
- package/dist/ozone.js +254 -0
- package/dist/ozone.js.map +1 -0
- package/dist/pds.d.ts +23 -0
- package/dist/pds.d.ts.map +1 -0
- package/dist/pds.js +97 -0
- package/dist/pds.js.map +1 -0
- package/dist/plc.d.ts +14 -0
- package/dist/plc.d.ts.map +1 -0
- package/dist/plc.js +28 -0
- package/dist/plc.js.map +1 -0
- package/dist/seed/author-feed.d.ts +4 -0
- package/dist/seed/author-feed.d.ts.map +1 -0
- package/dist/seed/author-feed.js +50 -0
- package/dist/seed/author-feed.js.map +1 -0
- package/dist/seed/basic.d.ts +16 -0
- package/dist/seed/basic.d.ts.map +1 -0
- package/dist/seed/basic.js +113 -0
- package/dist/seed/basic.js.map +1 -0
- package/dist/seed/client.d.ts +151 -0
- package/dist/seed/client.d.ts.map +1 -0
- package/dist/seed/client.js +365 -0
- package/dist/seed/client.js.map +1 -0
- package/dist/seed/follows.d.ts +4 -0
- package/dist/seed/follows.d.ts.map +1 -0
- package/dist/seed/follows.js +55 -0
- package/dist/seed/follows.js.map +1 -0
- package/dist/seed/index.d.ts +11 -0
- package/dist/seed/index.d.ts.map +1 -0
- package/dist/seed/index.js +11 -0
- package/dist/seed/index.js.map +1 -0
- package/dist/seed/likes.d.ts +4 -0
- package/dist/seed/likes.d.ts.map +1 -0
- package/dist/seed/likes.js +37 -0
- package/dist/seed/likes.js.map +1 -0
- package/dist/seed/quotes.d.ts +4 -0
- package/dist/seed/quotes.d.ts.map +1 -0
- package/dist/seed/quotes.js +21 -0
- package/dist/seed/quotes.js.map +1 -0
- package/dist/seed/reposts.d.ts +4 -0
- package/dist/seed/reposts.d.ts.map +1 -0
- package/dist/seed/reposts.js +17 -0
- package/dist/seed/reposts.js.map +1 -0
- package/dist/seed/thread-v2.d.ts +227 -0
- package/dist/seed/thread-v2.d.ts.map +1 -0
- package/dist/seed/thread-v2.js +755 -0
- package/dist/seed/thread-v2.js.map +1 -0
- package/dist/seed/users-bulk.d.ts +3 -0
- package/dist/seed/users-bulk.d.ts.map +1 -0
- package/dist/seed/users-bulk.js +224 -0
- package/dist/seed/users-bulk.js.map +1 -0
- package/dist/seed/users.d.ts +3 -0
- package/dist/seed/users.d.ts.map +1 -0
- package/dist/seed/users.js +45 -0
- package/dist/seed/users.js.map +1 -0
- package/dist/seed/verifications.d.ts +5 -0
- package/dist/seed/verifications.d.ts.map +1 -0
- package/dist/seed/verifications.js +164 -0
- package/dist/seed/verifications.js.map +1 -0
- package/dist/service-profile-lexicon.d.ts +11 -0
- package/dist/service-profile-lexicon.d.ts.map +1 -0
- package/dist/service-profile-lexicon.js +115 -0
- package/dist/service-profile-lexicon.js.map +1 -0
- package/dist/service-profile-ozone.d.ts +18 -0
- package/dist/service-profile-ozone.d.ts.map +1 -0
- package/dist/service-profile-ozone.js +333 -0
- package/dist/service-profile-ozone.js.map +1 -0
- package/dist/service-profile.d.ts +24 -0
- package/dist/service-profile.d.ts.map +1 -0
- package/dist/service-profile.js +61 -0
- package/dist/service-profile.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +14 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +86 -0
- package/dist/util.js.map +1 -0
- package/package.json +69 -0
- package/src/bin-multi-pds.ts +166 -0
- package/src/bin.ts +64 -0
- package/src/bsky.ts +198 -0
- package/src/bsync.ts +66 -0
- package/src/const.ts +3 -0
- package/src/env.ts +9 -0
- package/src/feed-gen.ts +96 -0
- package/src/index.ts +17 -0
- package/src/introspect.ts +91 -0
- package/src/mock/data.ts +46 -0
- package/src/mock/img/blur-hash-avatar-b64.ts +1 -0
- package/src/mock/img/labeled-img-b64.ts +1 -0
- package/src/mock/index.ts +702 -0
- package/src/moderator-client.ts +267 -0
- package/src/network-no-appview.ts +89 -0
- package/src/network.ts +243 -0
- package/src/ozone.ts +287 -0
- package/src/pds.ts +118 -0
- package/src/plc.ts +33 -0
- package/src/seed/author-feed.ts +98 -0
- package/src/seed/basic.ts +189 -0
- package/src/seed/client.ts +676 -0
- package/src/seed/follows.ts +57 -0
- package/src/seed/index.ts +11 -0
- package/src/seed/likes.ts +43 -0
- package/src/seed/quotes.ts +53 -0
- package/src/seed/reposts.ts +18 -0
- package/src/seed/thread-v2.ts +925 -0
- package/src/seed/users-bulk.ts +229 -0
- package/src/seed/users.ts +64 -0
- package/src/seed/verifications.ts +254 -0
- package/src/service-profile-lexicon.ts +127 -0
- package/src/service-profile-ozone.ts +375 -0
- package/src/service-profile.ts +95 -0
- package/src/types.ts +68 -0
- package/src/util.ts +118 -0
- package/tsconfig.build.json +25 -0
- package/tsconfig.json +4 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { INVALID_HANDLE } from '@atproto/syntax';
|
|
2
|
+
export default async (sc) => {
|
|
3
|
+
const labelerDid = sc.network.bsky.ctx.cfg.modServiceDid;
|
|
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
|
+
await sc.createAccount('eve', users.eve);
|
|
9
|
+
await sc.createAccount('frank', users.frank);
|
|
10
|
+
await sc.createAccount('gus', users.gus);
|
|
11
|
+
// This user should be set a label 'impersonation` in the tests.
|
|
12
|
+
await sc.createAccount('impersonator', users.impersonator);
|
|
13
|
+
await sc.createAccount('nonverifier', users.nonverifier);
|
|
14
|
+
// These users should be set as verifiers via DB in the test,
|
|
15
|
+
// so their verifications are trusted by the app.
|
|
16
|
+
await sc.createAccount('verifier1', users.verifier1);
|
|
17
|
+
await sc.createAccount('verifier2', users.verifier2);
|
|
18
|
+
// This user should be set a label 'impersonation` in the tests.
|
|
19
|
+
await sc.createAccount('verifier3', users.verifier3);
|
|
20
|
+
await sc.createAccount('handleinvalid', users.handleinvalid);
|
|
21
|
+
await sc.createAccount('handleempty', users.handleempty);
|
|
22
|
+
for (const name in sc.dids) {
|
|
23
|
+
await sc.createProfile(sc.dids[name], `display-${name}`, `descript-${name}`);
|
|
24
|
+
}
|
|
25
|
+
// alice: the viewer, has no verifications at all.
|
|
26
|
+
// NOOP
|
|
27
|
+
// bob: has verifications by multiple verifiers.
|
|
28
|
+
await sc.verify(sc.dids.verifier1, sc.dids.bob, sc.accounts[sc.dids.bob].handle, sc.profiles[sc.dids.bob].displayName);
|
|
29
|
+
await sc.verify(sc.dids.verifier2, sc.dids.bob, sc.accounts[sc.dids.bob].handle, sc.profiles[sc.dids.bob].displayName);
|
|
30
|
+
// carol: has non-broken and broken verifications by verifiers.
|
|
31
|
+
await sc.verify(sc.dids.verifier1, sc.dids.carol, sc.accounts[sc.dids.carol].handle, sc.profiles[sc.dids.carol].displayName);
|
|
32
|
+
await sc.verify(sc.dids.verifier2, sc.dids.carol, 'carol.old.handle', // Broken: this was the handle during verification and it changed later.
|
|
33
|
+
sc.profiles[sc.dids.carol].displayName);
|
|
34
|
+
// dan: has verifications by verifiers and non verifiers.
|
|
35
|
+
await sc.verify(sc.dids.verifier1, sc.dids.dan, sc.accounts[sc.dids.dan].handle, sc.profiles[sc.dids.dan].displayName);
|
|
36
|
+
await sc.verify(sc.dids.nonverifier, sc.dids.dan, sc.accounts[sc.dids.dan].handle, sc.profiles[sc.dids.dan].displayName);
|
|
37
|
+
// eve: has no verifications at all.
|
|
38
|
+
// NOOP
|
|
39
|
+
// frank: has only broken verifications by verifiers.
|
|
40
|
+
await sc.verify(sc.dids.verifier2, sc.dids.frank, sc.accounts[sc.dids.frank].handle, 'frank-old-name');
|
|
41
|
+
// gus: has only verifications by non verifiers.
|
|
42
|
+
await sc.verify(sc.dids.nonverifier, sc.dids.gus, sc.accounts[sc.dids.gus].handle, sc.profiles[sc.dids.gus].displayName);
|
|
43
|
+
// impersonator: has verification by verifier but should get the impersonator label during tests.
|
|
44
|
+
await sc.verify(sc.dids.verifier1, sc.dids.impersonator, sc.accounts[sc.dids.impersonator].handle, sc.profiles[sc.dids.impersonator].displayName);
|
|
45
|
+
// verifier1: is verifier and has verification by other verifier. Should show as a verifier, not just as verified.
|
|
46
|
+
await sc.verify(sc.dids.verifier2, sc.dids.verifier1, sc.accounts[sc.dids.verifier1].handle, sc.profiles[sc.dids.verifier1].displayName);
|
|
47
|
+
// verifier2: is verifier and has no verification by other verifier.
|
|
48
|
+
// NOOP
|
|
49
|
+
// handleinvalid: has verification but handle is set to invalid.
|
|
50
|
+
await sc.verify(sc.dids.verifier1, sc.dids.handleinvalid, sc.accounts[sc.dids.handleinvalid].handle, sc.profiles[sc.dids.handleinvalid].displayName);
|
|
51
|
+
// Process all events to sync actors to appview before modifying the DB
|
|
52
|
+
await sc.network.processAll();
|
|
53
|
+
// Do DB updates to change actors as needed for each case.
|
|
54
|
+
await createLabel(sc, labelerDid, {
|
|
55
|
+
src: labelerDid,
|
|
56
|
+
uri: sc.dids.impersonator,
|
|
57
|
+
cid: '',
|
|
58
|
+
val: 'impersonation',
|
|
59
|
+
});
|
|
60
|
+
await createLabel(sc, labelerDid, {
|
|
61
|
+
src: labelerDid,
|
|
62
|
+
uri: sc.dids.verifier3,
|
|
63
|
+
cid: '',
|
|
64
|
+
val: 'impersonation',
|
|
65
|
+
});
|
|
66
|
+
await sc.network.bsky.db.db
|
|
67
|
+
.updateTable('actor')
|
|
68
|
+
.set({ handle: INVALID_HANDLE })
|
|
69
|
+
.where('did', '=', sc.dids.handleinvalid)
|
|
70
|
+
.execute();
|
|
71
|
+
await sc.network.bsky.db.db
|
|
72
|
+
.updateTable('actor')
|
|
73
|
+
.set({ handle: null })
|
|
74
|
+
.where('did', '=', sc.dids.handleempty)
|
|
75
|
+
.execute();
|
|
76
|
+
return sc;
|
|
77
|
+
};
|
|
78
|
+
const users = {
|
|
79
|
+
alice: {
|
|
80
|
+
email: 'alice@test.com',
|
|
81
|
+
handle: 'alice.test',
|
|
82
|
+
password: 'alice-pass',
|
|
83
|
+
},
|
|
84
|
+
bob: {
|
|
85
|
+
email: 'bob@test.com',
|
|
86
|
+
handle: 'bob.test',
|
|
87
|
+
password: 'bob-pass',
|
|
88
|
+
},
|
|
89
|
+
carol: {
|
|
90
|
+
email: 'carol@test.com',
|
|
91
|
+
handle: 'carol.test',
|
|
92
|
+
password: 'carol-pass',
|
|
93
|
+
},
|
|
94
|
+
dan: {
|
|
95
|
+
email: 'dan@test.com',
|
|
96
|
+
handle: 'dan.test',
|
|
97
|
+
password: 'dan-pass',
|
|
98
|
+
},
|
|
99
|
+
eve: {
|
|
100
|
+
email: 'eve@test.com',
|
|
101
|
+
handle: 'eve.test',
|
|
102
|
+
password: 'eve-pass',
|
|
103
|
+
},
|
|
104
|
+
frank: {
|
|
105
|
+
email: 'frank@test.com',
|
|
106
|
+
handle: 'frank.test',
|
|
107
|
+
password: 'frank-pass',
|
|
108
|
+
},
|
|
109
|
+
gus: {
|
|
110
|
+
email: 'gus@test.com',
|
|
111
|
+
handle: 'gus.test',
|
|
112
|
+
password: 'gus-pass',
|
|
113
|
+
},
|
|
114
|
+
impersonator: {
|
|
115
|
+
email: 'impersonator@test.com',
|
|
116
|
+
handle: 'impersonator.test',
|
|
117
|
+
password: 'impersonator-pass',
|
|
118
|
+
},
|
|
119
|
+
verifier1: {
|
|
120
|
+
email: 'verifier1@test.com',
|
|
121
|
+
handle: 'verifier1.test',
|
|
122
|
+
password: 'verifier1-pass',
|
|
123
|
+
},
|
|
124
|
+
verifier2: {
|
|
125
|
+
email: 'verifier2@test.com',
|
|
126
|
+
handle: 'verifier2.test',
|
|
127
|
+
password: 'verifier2-pass',
|
|
128
|
+
},
|
|
129
|
+
verifier3: {
|
|
130
|
+
email: 'verifier3@test.com',
|
|
131
|
+
handle: 'verifier3.test',
|
|
132
|
+
password: 'verifier3-pass',
|
|
133
|
+
},
|
|
134
|
+
nonverifier: {
|
|
135
|
+
email: 'nonverifier@test.com',
|
|
136
|
+
handle: 'nonverifier.test',
|
|
137
|
+
password: 'nonverifier-pass',
|
|
138
|
+
},
|
|
139
|
+
handleinvalid: {
|
|
140
|
+
email: 'handleinvalid@test.com',
|
|
141
|
+
handle: 'handleinvalid.test',
|
|
142
|
+
password: 'handleinvalid-pass',
|
|
143
|
+
},
|
|
144
|
+
handleempty: {
|
|
145
|
+
email: 'handleempty@test.com',
|
|
146
|
+
handle: 'handleempty.test',
|
|
147
|
+
password: 'handleempty-pass',
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
const createLabel = async (sc, labelerDid, opts) => {
|
|
151
|
+
await sc.network.bsky.db.db
|
|
152
|
+
.insertInto('label')
|
|
153
|
+
.values({
|
|
154
|
+
uri: opts.uri,
|
|
155
|
+
cid: opts.cid,
|
|
156
|
+
val: opts.val,
|
|
157
|
+
cts: new Date().toISOString(),
|
|
158
|
+
exp: opts.exp ?? null,
|
|
159
|
+
neg: false,
|
|
160
|
+
src: opts.src ?? labelerDid,
|
|
161
|
+
})
|
|
162
|
+
.execute();
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=verifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifications.js","sourceRoot":"","sources":["../../src/seed/verifications.ts"],"names":[],"mappings":"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","sourcesContent":["import { INVALID_HANDLE } from '@atproto/syntax'\nimport type { TestNetwork } from '../network.js'\nimport type { SeedClient } from './client.js'\n\nexport default async (sc: SeedClient<TestNetwork>) => {\n const labelerDid = sc.network.bsky.ctx.cfg.modServiceDid\n\n await sc.createAccount('alice', users.alice)\n await sc.createAccount('bob', users.bob)\n await sc.createAccount('carol', users.carol)\n await sc.createAccount('dan', users.dan)\n await sc.createAccount('eve', users.eve)\n await sc.createAccount('frank', users.frank)\n await sc.createAccount('gus', users.gus)\n\n // This user should be set a label 'impersonation` in the tests.\n await sc.createAccount('impersonator', users.impersonator)\n\n await sc.createAccount('nonverifier', users.nonverifier)\n\n // These users should be set as verifiers via DB in the test,\n // so their verifications are trusted by the app.\n await sc.createAccount('verifier1', users.verifier1)\n await sc.createAccount('verifier2', users.verifier2)\n // This user should be set a label 'impersonation` in the tests.\n await sc.createAccount('verifier3', users.verifier3)\n\n await sc.createAccount('handleinvalid', users.handleinvalid)\n await sc.createAccount('handleempty', users.handleempty)\n\n for (const name in sc.dids) {\n await sc.createProfile(sc.dids[name], `display-${name}`, `descript-${name}`)\n }\n\n // alice: the viewer, has no verifications at all.\n // NOOP\n\n // bob: has verifications by multiple verifiers.\n await sc.verify(\n sc.dids.verifier1,\n sc.dids.bob,\n sc.accounts[sc.dids.bob].handle,\n sc.profiles[sc.dids.bob].displayName,\n )\n await sc.verify(\n sc.dids.verifier2,\n sc.dids.bob,\n sc.accounts[sc.dids.bob].handle,\n sc.profiles[sc.dids.bob].displayName,\n )\n\n // carol: has non-broken and broken verifications by verifiers.\n await sc.verify(\n sc.dids.verifier1,\n sc.dids.carol,\n sc.accounts[sc.dids.carol].handle,\n sc.profiles[sc.dids.carol].displayName,\n )\n await sc.verify(\n sc.dids.verifier2,\n sc.dids.carol,\n 'carol.old.handle', // Broken: this was the handle during verification and it changed later.\n sc.profiles[sc.dids.carol].displayName,\n )\n\n // dan: has verifications by verifiers and non verifiers.\n await sc.verify(\n sc.dids.verifier1,\n sc.dids.dan,\n sc.accounts[sc.dids.dan].handle,\n sc.profiles[sc.dids.dan].displayName,\n )\n await sc.verify(\n sc.dids.nonverifier,\n sc.dids.dan,\n sc.accounts[sc.dids.dan].handle,\n sc.profiles[sc.dids.dan].displayName,\n )\n\n // eve: has no verifications at all.\n // NOOP\n\n // frank: has only broken verifications by verifiers.\n await sc.verify(\n sc.dids.verifier2,\n sc.dids.frank,\n sc.accounts[sc.dids.frank].handle,\n 'frank-old-name', // Broken: this was the name during verification and it changed later.\n )\n\n // gus: has only verifications by non verifiers.\n await sc.verify(\n sc.dids.nonverifier,\n sc.dids.gus,\n sc.accounts[sc.dids.gus].handle,\n sc.profiles[sc.dids.gus].displayName,\n )\n\n // impersonator: has verification by verifier but should get the impersonator label during tests.\n await sc.verify(\n sc.dids.verifier1,\n sc.dids.impersonator,\n sc.accounts[sc.dids.impersonator].handle,\n sc.profiles[sc.dids.impersonator].displayName,\n )\n\n // verifier1: is verifier and has verification by other verifier. Should show as a verifier, not just as verified.\n await sc.verify(\n sc.dids.verifier2,\n sc.dids.verifier1,\n sc.accounts[sc.dids.verifier1].handle,\n sc.profiles[sc.dids.verifier1].displayName,\n )\n\n // verifier2: is verifier and has no verification by other verifier.\n // NOOP\n\n // handleinvalid: has verification but handle is set to invalid.\n await sc.verify(\n sc.dids.verifier1,\n sc.dids.handleinvalid,\n sc.accounts[sc.dids.handleinvalid].handle,\n sc.profiles[sc.dids.handleinvalid].displayName,\n )\n\n // Process all events to sync actors to appview before modifying the DB\n await sc.network.processAll()\n\n // Do DB updates to change actors as needed for each case.\n await createLabel(sc, labelerDid, {\n src: labelerDid,\n uri: sc.dids.impersonator,\n cid: '',\n val: 'impersonation',\n })\n\n await createLabel(sc, labelerDid, {\n src: labelerDid,\n uri: sc.dids.verifier3,\n cid: '',\n val: 'impersonation',\n })\n\n await sc.network.bsky.db.db\n .updateTable('actor')\n .set({ handle: INVALID_HANDLE })\n .where('did', '=', sc.dids.handleinvalid)\n .execute()\n await sc.network.bsky.db.db\n .updateTable('actor')\n .set({ handle: null })\n .where('did', '=', sc.dids.handleempty)\n .execute()\n\n return sc\n}\n\nconst users = {\n alice: {\n email: 'alice@test.com',\n handle: 'alice.test',\n password: 'alice-pass',\n },\n bob: {\n email: 'bob@test.com',\n handle: 'bob.test',\n password: 'bob-pass',\n },\n carol: {\n email: 'carol@test.com',\n handle: 'carol.test',\n password: 'carol-pass',\n },\n dan: {\n email: 'dan@test.com',\n handle: 'dan.test',\n password: 'dan-pass',\n },\n eve: {\n email: 'eve@test.com',\n handle: 'eve.test',\n password: 'eve-pass',\n },\n frank: {\n email: 'frank@test.com',\n handle: 'frank.test',\n password: 'frank-pass',\n },\n gus: {\n email: 'gus@test.com',\n handle: 'gus.test',\n password: 'gus-pass',\n },\n impersonator: {\n email: 'impersonator@test.com',\n handle: 'impersonator.test',\n password: 'impersonator-pass',\n },\n verifier1: {\n email: 'verifier1@test.com',\n handle: 'verifier1.test',\n password: 'verifier1-pass',\n },\n verifier2: {\n email: 'verifier2@test.com',\n handle: 'verifier2.test',\n password: 'verifier2-pass',\n },\n verifier3: {\n email: 'verifier3@test.com',\n handle: 'verifier3.test',\n password: 'verifier3-pass',\n },\n nonverifier: {\n email: 'nonverifier@test.com',\n handle: 'nonverifier.test',\n password: 'nonverifier-pass',\n },\n handleinvalid: {\n email: 'handleinvalid@test.com',\n handle: 'handleinvalid.test',\n password: 'handleinvalid-pass',\n },\n handleempty: {\n email: 'handleempty@test.com',\n handle: 'handleempty.test',\n password: 'handleempty-pass',\n },\n} as const\n\nconst createLabel = async (\n sc: SeedClient<TestNetwork>,\n labelerDid: string,\n opts: {\n src?: string\n uri: string\n cid: string\n val: string\n exp?: string\n },\n) => {\n await sc.network.bsky.db.db\n .insertInto('label')\n .values({\n uri: opts.uri,\n cid: opts.cid,\n val: opts.val,\n cts: new Date().toISOString(),\n exp: opts.exp ?? null,\n neg: false,\n src: opts.src ?? labelerDid,\n })\n .execute()\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TestPds } from './pds.js';
|
|
2
|
+
import { ServiceProfile } from './service-profile.js';
|
|
3
|
+
export declare class LexiconAuthorityProfile extends ServiceProfile {
|
|
4
|
+
static create(pds: TestPds, userDetails?: {
|
|
5
|
+
email: string;
|
|
6
|
+
handle: string;
|
|
7
|
+
password: string;
|
|
8
|
+
}): Promise<LexiconAuthorityProfile>;
|
|
9
|
+
createRecords(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=service-profile-lexicon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-profile-lexicon.d.ts","sourceRoot":"","sources":["../src/service-profile-lexicon.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AA2FrD,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,OAAoB,MAAM,CACxB,GAAG,EAAE,OAAO,EACZ,WAAW;QACT,KAAK;QACL,MAAM;QACN,QAAQ;KACT,oCAMF;IAEK,aAAa,kBAiBlB;CACF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ServiceProfile } from './service-profile.js';
|
|
2
|
+
const LEXICONS = [
|
|
3
|
+
{
|
|
4
|
+
lexicon: 1,
|
|
5
|
+
id: 'com.atproto.moderation.basePermissions',
|
|
6
|
+
defs: {
|
|
7
|
+
main: {
|
|
8
|
+
type: 'permission-set',
|
|
9
|
+
title: 'Moderation',
|
|
10
|
+
'title:lang': { fr: 'Modération' },
|
|
11
|
+
detail: 'Create moderation reports',
|
|
12
|
+
'detail:lang': {
|
|
13
|
+
'fr-FR': 'Créer des rapports de modération',
|
|
14
|
+
},
|
|
15
|
+
permissions: [
|
|
16
|
+
{
|
|
17
|
+
type: 'permission',
|
|
18
|
+
resource: 'rpc',
|
|
19
|
+
aud: '*',
|
|
20
|
+
lxm: ['com.atproto.moderation.createReport'],
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
lexicon: 1,
|
|
28
|
+
id: 'com.example.calendar.basePermissions',
|
|
29
|
+
defs: {
|
|
30
|
+
main: {
|
|
31
|
+
type: 'permission-set',
|
|
32
|
+
title: 'Calendar',
|
|
33
|
+
'title:lang': { fr: 'Calendrier' },
|
|
34
|
+
detail: 'Manage your events and RSVPs',
|
|
35
|
+
'detail:lang': {
|
|
36
|
+
'fr-BE': 'Gérer vos événements et réponses',
|
|
37
|
+
},
|
|
38
|
+
permissions: [
|
|
39
|
+
{
|
|
40
|
+
type: 'permission',
|
|
41
|
+
resource: 'rpc',
|
|
42
|
+
inheritAud: true,
|
|
43
|
+
lxm: [
|
|
44
|
+
'com.example.calendar.listEvents',
|
|
45
|
+
'com.example.calendar.getEventDetails',
|
|
46
|
+
'com.example.calendar.getEventRsvps',
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: 'permission',
|
|
51
|
+
resource: 'repo',
|
|
52
|
+
collection: [
|
|
53
|
+
'com.example.calendar.event',
|
|
54
|
+
'com.example.calendar.rsvp',
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'permission',
|
|
59
|
+
resource: 'blob',
|
|
60
|
+
accept: ['image/*', 'video/*'],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
// A `space` declaration. The OAuth provider resolves this at token issuance to
|
|
67
|
+
// expand a bare `space:com.example.group` grant into the space type's declared
|
|
68
|
+
// collections, so a test that grants a bare space scope needs the doc to be
|
|
69
|
+
// resolvable.
|
|
70
|
+
//
|
|
71
|
+
// @NOTE this does *not* make space record validation real: the PDS validates
|
|
72
|
+
// records against a hardcoded schema map (see `repo/prepare.ts`), which has a
|
|
73
|
+
// TODO for dynamic lexicon resolution. Records in a space collection still
|
|
74
|
+
// report `validationStatus: 'unknown'`.
|
|
75
|
+
{
|
|
76
|
+
lexicon: 1,
|
|
77
|
+
id: 'com.example.group',
|
|
78
|
+
defs: {
|
|
79
|
+
main: {
|
|
80
|
+
type: 'space',
|
|
81
|
+
key: 'any',
|
|
82
|
+
name: 'Example Group',
|
|
83
|
+
description: 'A permissioned group space, for dev and tests',
|
|
84
|
+
'name:lang': { fr: 'Groupe Exemple' },
|
|
85
|
+
collections: ['com.example.groupPost', 'com.example.groupNote'],
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
export class LexiconAuthorityProfile extends ServiceProfile {
|
|
91
|
+
static async create(pds, userDetails = {
|
|
92
|
+
email: 'lex-authority@test.com',
|
|
93
|
+
handle: 'lex-authority.test',
|
|
94
|
+
password: 'hunter2',
|
|
95
|
+
}) {
|
|
96
|
+
const agent = pds.getAgent();
|
|
97
|
+
await agent.createAccount(userDetails);
|
|
98
|
+
return new LexiconAuthorityProfile(pds, agent, userDetails);
|
|
99
|
+
}
|
|
100
|
+
async createRecords() {
|
|
101
|
+
await this.agent.app.bsky.actor.profile.create({ repo: this.did }, {
|
|
102
|
+
displayName: 'Lexicon Authority',
|
|
103
|
+
description: `the repo containing all the lexicons that can be resolved in dev`,
|
|
104
|
+
});
|
|
105
|
+
for (const doc of LEXICONS) {
|
|
106
|
+
await this.agent.com.atproto.repo.createRecord({
|
|
107
|
+
repo: this.did,
|
|
108
|
+
collection: 'com.atproto.lexicon.schema',
|
|
109
|
+
rkey: doc.id,
|
|
110
|
+
record: doc,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=service-profile-lexicon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-profile-lexicon.js","sourceRoot":"","sources":["../src/service-profile-lexicon.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LexiconDoc } from '@atproto/lexicon'\nimport type { TestPds } from './pds.js'\nimport { ServiceProfile } from './service-profile.js'\n\nconst LEXICONS: readonly LexiconDoc[] = [\n {\n lexicon: 1,\n id: 'com.atproto.moderation.basePermissions',\n defs: {\n main: {\n type: 'permission-set',\n title: 'Moderation',\n 'title:lang': { fr: 'Modération' },\n detail: 'Create moderation reports',\n 'detail:lang': {\n 'fr-FR': 'Créer des rapports de modération',\n },\n permissions: [\n {\n type: 'permission',\n resource: 'rpc',\n aud: '*',\n lxm: ['com.atproto.moderation.createReport'],\n },\n ],\n },\n },\n },\n {\n lexicon: 1,\n id: 'com.example.calendar.basePermissions',\n defs: {\n main: {\n type: 'permission-set',\n title: 'Calendar',\n 'title:lang': { fr: 'Calendrier' },\n detail: 'Manage your events and RSVPs',\n 'detail:lang': {\n 'fr-BE': 'Gérer vos événements et réponses',\n },\n permissions: [\n {\n type: 'permission',\n resource: 'rpc',\n inheritAud: true,\n lxm: [\n 'com.example.calendar.listEvents',\n 'com.example.calendar.getEventDetails',\n 'com.example.calendar.getEventRsvps',\n ],\n },\n {\n type: 'permission',\n resource: 'repo',\n collection: [\n 'com.example.calendar.event',\n 'com.example.calendar.rsvp',\n ],\n },\n {\n type: 'permission',\n resource: 'blob',\n accept: ['image/*', 'video/*'],\n },\n ],\n },\n },\n },\n // A `space` declaration. The OAuth provider resolves this at token issuance to\n // expand a bare `space:com.example.group` grant into the space type's declared\n // collections, so a test that grants a bare space scope needs the doc to be\n // resolvable.\n //\n // @NOTE this does *not* make space record validation real: the PDS validates\n // records against a hardcoded schema map (see `repo/prepare.ts`), which has a\n // TODO for dynamic lexicon resolution. Records in a space collection still\n // report `validationStatus: 'unknown'`.\n {\n lexicon: 1,\n id: 'com.example.group',\n defs: {\n main: {\n type: 'space',\n key: 'any',\n name: 'Example Group',\n description: 'A permissioned group space, for dev and tests',\n 'name:lang': { fr: 'Groupe Exemple' },\n collections: ['com.example.groupPost', 'com.example.groupNote'],\n },\n },\n },\n]\n\nexport class LexiconAuthorityProfile extends ServiceProfile {\n public static async create(\n pds: TestPds,\n userDetails = {\n email: 'lex-authority@test.com',\n handle: 'lex-authority.test',\n password: 'hunter2',\n },\n ) {\n const agent = pds.getAgent()\n await agent.createAccount(userDetails)\n\n return new LexiconAuthorityProfile(pds, agent, userDetails)\n }\n\n async createRecords() {\n await this.agent.app.bsky.actor.profile.create(\n { repo: this.did },\n {\n displayName: 'Lexicon Authority',\n description: `the repo containing all the lexicons that can be resolved in dev`,\n },\n )\n\n for (const doc of LEXICONS) {\n await this.agent.com.atproto.repo.createRecord({\n repo: this.did,\n collection: 'com.atproto.lexicon.schema',\n rkey: doc.id,\n record: doc,\n })\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AtpAgent } from '@atproto/api';
|
|
2
|
+
import { Secp256k1Keypair } from '@atproto/crypto';
|
|
3
|
+
import type { TestPds } from './pds.js';
|
|
4
|
+
import { type ServiceMigrationOptions, ServiceProfile, type ServiceUserDetails } from './service-profile.js';
|
|
5
|
+
export declare class OzoneServiceProfile extends ServiceProfile {
|
|
6
|
+
readonly ozoneUrl: string;
|
|
7
|
+
readonly key: Secp256k1Keypair;
|
|
8
|
+
static create(pds: TestPds, ozoneUrl: string, userDetails?: {
|
|
9
|
+
email: string;
|
|
10
|
+
handle: string;
|
|
11
|
+
password: string;
|
|
12
|
+
}): Promise<OzoneServiceProfile>;
|
|
13
|
+
protected constructor(pds: TestPds, agent: AtpAgent, userDetails: ServiceUserDetails, ozoneUrl: string, key: Secp256k1Keypair);
|
|
14
|
+
createAppPasswordForVerification(): Promise<string>;
|
|
15
|
+
migrateTo(pds: TestPds, options?: ServiceMigrationOptions): Promise<void>;
|
|
16
|
+
createRecords(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=service-profile-ozone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-profile-ozone.d.ts","sourceRoot":"","sources":["../src/service-profile-ozone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EACL,KAAK,uBAAuB,EAC5B,cAAc,EACd,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAA;AAE7B,qBAAa,mBAAoB,SAAQ,cAAc;IAsBnD,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,GAAG,EAAE,gBAAgB;IAtBhC,OAAa,MAAM,CACjB,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW;QACT,KAAK;QACL,MAAM;QACN,QAAQ;KACT,gCAQF;IAED,SAAS,aACP,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,kBAAkB,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,gBAAgB,EAG/B;IAEK,gCAAgC,oBAKrC;IAEK,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,uBAA4B,iBAelE;IAEK,aAAa,kBAwTlB;CACF"}
|