@interop/was-conformance-suite 0.1.0

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 (91) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +264 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +69 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/cli/main.d.ts +64 -0
  8. package/dist/cli/main.d.ts.map +1 -0
  9. package/dist/cli/main.js +294 -0
  10. package/dist/cli/main.js.map +1 -0
  11. package/dist/cli/reporters/json.d.ts +32 -0
  12. package/dist/cli/reporters/json.d.ts.map +1 -0
  13. package/dist/cli/reporters/json.js +30 -0
  14. package/dist/cli/reporters/json.js.map +1 -0
  15. package/dist/cli/reporters/pretty.d.ts +21 -0
  16. package/dist/cli/reporters/pretty.d.ts.map +1 -0
  17. package/dist/cli/reporters/pretty.js +152 -0
  18. package/dist/cli/reporters/pretty.js.map +1 -0
  19. package/dist/harness/assert.d.ts +13 -0
  20. package/dist/harness/assert.d.ts.map +1 -0
  21. package/dist/harness/assert.js +13 -0
  22. package/dist/harness/assert.js.map +1 -0
  23. package/dist/harness/runner.d.ts +25 -0
  24. package/dist/harness/runner.d.ts.map +1 -0
  25. package/dist/harness/runner.js +240 -0
  26. package/dist/harness/runner.js.map +1 -0
  27. package/dist/harness/types.d.ts +199 -0
  28. package/dist/harness/types.d.ts.map +1 -0
  29. package/dist/harness/types.js +2 -0
  30. package/dist/harness/types.js.map +1 -0
  31. package/dist/helpers.d.ts +103 -0
  32. package/dist/helpers.d.ts.map +1 -0
  33. package/dist/helpers.js +195 -0
  34. package/dist/helpers.js.map +1 -0
  35. package/dist/index.d.ts +28 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +35 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/suites/changes-query-api.d.ts +9 -0
  40. package/dist/suites/changes-query-api.d.ts.map +1 -0
  41. package/dist/suites/changes-query-api.js +115 -0
  42. package/dist/suites/changes-query-api.js.map +1 -0
  43. package/dist/suites/client-backends.d.ts +11 -0
  44. package/dist/suites/client-backends.d.ts.map +1 -0
  45. package/dist/suites/client-backends.js +198 -0
  46. package/dist/suites/client-backends.js.map +1 -0
  47. package/dist/suites/client-delegation.d.ts +21 -0
  48. package/dist/suites/client-delegation.d.ts.map +1 -0
  49. package/dist/suites/client-delegation.js +94 -0
  50. package/dist/suites/client-delegation.js.map +1 -0
  51. package/dist/suites/client-export-import.d.ts +19 -0
  52. package/dist/suites/client-export-import.d.ts.map +1 -0
  53. package/dist/suites/client-export-import.js +74 -0
  54. package/dist/suites/client-export-import.js.map +1 -0
  55. package/dist/suites/client-resources.d.ts +11 -0
  56. package/dist/suites/client-resources.d.ts.map +1 -0
  57. package/dist/suites/client-resources.js +193 -0
  58. package/dist/suites/client-resources.js.map +1 -0
  59. package/dist/suites/client-spaces.d.ts +11 -0
  60. package/dist/suites/client-spaces.d.ts.map +1 -0
  61. package/dist/suites/client-spaces.js +347 -0
  62. package/dist/suites/client-spaces.js.map +1 -0
  63. package/dist/suites/collection-api.d.ts +7 -0
  64. package/dist/suites/collection-api.d.ts.map +1 -0
  65. package/dist/suites/collection-api.js +266 -0
  66. package/dist/suites/collection-api.js.map +1 -0
  67. package/dist/suites/encryption-marker-api.d.ts +9 -0
  68. package/dist/suites/encryption-marker-api.d.ts.map +1 -0
  69. package/dist/suites/encryption-marker-api.js +266 -0
  70. package/dist/suites/encryption-marker-api.js.map +1 -0
  71. package/dist/suites/index.d.ts +23 -0
  72. package/dist/suites/index.d.ts.map +1 -0
  73. package/dist/suites/index.js +32 -0
  74. package/dist/suites/index.js.map +1 -0
  75. package/dist/suites/policy-api.d.ts +12 -0
  76. package/dist/suites/policy-api.d.ts.map +1 -0
  77. package/dist/suites/policy-api.js +187 -0
  78. package/dist/suites/policy-api.js.map +1 -0
  79. package/dist/suites/resource-api.d.ts +8 -0
  80. package/dist/suites/resource-api.d.ts.map +1 -0
  81. package/dist/suites/resource-api.js +393 -0
  82. package/dist/suites/resource-api.js.map +1 -0
  83. package/dist/suites/server.d.ts +3 -0
  84. package/dist/suites/server.d.ts.map +1 -0
  85. package/dist/suites/server.js +25 -0
  86. package/dist/suites/server.js.map +1 -0
  87. package/dist/suites/spaces-api.d.ts +11 -0
  88. package/dist/suites/spaces-api.d.ts.map +1 -0
  89. package/dist/suites/spaces-api.js +411 -0
  90. package/dist/suites/spaces-api.js.map +1 -0
  91. package/package.json +93 -0
@@ -0,0 +1,393 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- Resource API.
6
+ */
7
+ import assert from '../harness/assert.js';
8
+ export const resourceApi = {
9
+ id: 'resource-api',
10
+ name: 'Resource API',
11
+ setup: async (ctx) => {
12
+ const alice = { ...ctx.actors.alice };
13
+ const bob = { ...ctx.actors.bob };
14
+ alice.space1 = { id: ctx.generateId() };
15
+ await ctx.createSpace({
16
+ spaceDescription: {
17
+ id: alice.space1.id,
18
+ name: "Alice's Space #1",
19
+ controller: alice.did
20
+ },
21
+ rootClient: alice.rootClient
22
+ });
23
+ // Pre-create the credentials collection so resource tests can POST/PUT into it
24
+ await alice.rootClient.request({
25
+ url: new URL(`/space/${alice.space1.id}/`, ctx.serverUrl).toString(),
26
+ method: 'POST',
27
+ json: { id: 'credentials', name: 'Verifiable Credentials' }
28
+ });
29
+ return { alice, bob };
30
+ },
31
+ teardown: async (ctx, state) => {
32
+ const { alice } = state;
33
+ try {
34
+ await alice.rootClient.request({
35
+ url: new URL(`/space/${alice.space1.id}`, ctx.serverUrl).toString(),
36
+ method: 'DELETE'
37
+ });
38
+ }
39
+ catch {
40
+ /* best-effort cleanup */
41
+ }
42
+ },
43
+ tests: [
44
+ {
45
+ id: 'resource.anonymous-read-404',
46
+ name: 'GET a resource with no auth headers falls through to policy and 404s (no public policy)',
47
+ run: async (ctx) => {
48
+ const { serverUrl } = ctx;
49
+ // Reads no longer 401 at the hook: an anonymous read is allowed to attempt,
50
+ // and is denied as 404 (no-leak) when no access-control policy grants it.
51
+ const response = await fetch(new URL('/space/any-space-id/any-collection/any-resource', serverUrl), { method: 'GET' });
52
+ assert.equal(response.status, 404);
53
+ assert.match(response.headers.get('content-type'), /application\/problem\+json/);
54
+ }
55
+ },
56
+ {
57
+ id: 'resource.read-missing-404',
58
+ name: 'GET /space/:spaceId/:collectionId/:resourceId should 404 error on not found space id',
59
+ run: async (ctx, state) => {
60
+ const { serverUrl } = ctx;
61
+ const { alice } = state;
62
+ const url = new URL('/space/space-id-that-does-not-exist/unknown-collection/unknown-resource', serverUrl).toString();
63
+ let expectedError;
64
+ try {
65
+ await alice.rootClient.request({ url, method: 'GET' });
66
+ }
67
+ catch (err) {
68
+ expectedError = err;
69
+ }
70
+ assert.equal(expectedError.response.status, 404);
71
+ assert.match(expectedError.response.headers.get('content-type'), /application\/problem\+json/);
72
+ }
73
+ },
74
+ {
75
+ id: 'resource.post-get',
76
+ name: '[root] POST and GET Resource with proper authorization',
77
+ run: async (ctx, state) => {
78
+ const { serverUrl } = ctx;
79
+ const { alice } = state;
80
+ const body = {
81
+ id: 'sample-resource',
82
+ name: 'Sample Verifiable Credential'
83
+ };
84
+ const response = await alice.rootClient.request({
85
+ url: new URL(`/space/${alice.space1.id}/credentials/`, serverUrl).toString(),
86
+ method: 'POST',
87
+ action: 'POST',
88
+ json: body
89
+ });
90
+ assert.equal(response.status, 201);
91
+ assert.equal(response.data['content-type'], 'application/json');
92
+ assert.match(response.headers.get('content-type'), /application\/json/);
93
+ const resourceUrl = response.headers.get('location');
94
+ assert.ok(resourceUrl.startsWith(`${serverUrl}/space/${alice.space1.id}/credentials/`));
95
+ const fetchResourceResponse = await alice.rootClient.request({
96
+ url: resourceUrl,
97
+ method: 'GET'
98
+ });
99
+ assert.equal(fetchResourceResponse.status, 200);
100
+ assert.match(fetchResourceResponse.headers.get('content-type'), /application\/json/);
101
+ assert.equal(fetchResourceResponse.data.name, 'Sample Verifiable Credential');
102
+ }
103
+ },
104
+ {
105
+ id: 'resource.post-get-non-json',
106
+ name: '[root] POST and GET a non-JSON resource',
107
+ run: async (ctx, state) => {
108
+ const { serverUrl } = ctx;
109
+ const { alice } = state;
110
+ const body = new Blob(['line 1\nline2\n'], { type: 'text/plain' });
111
+ const response = await alice.rootClient.request({
112
+ url: new URL(`/space/${alice.space1.id}/credentials/`, serverUrl).toString(),
113
+ method: 'POST',
114
+ body
115
+ });
116
+ assert.equal(response.status, 201);
117
+ const createdUrl = response.headers.get('location');
118
+ const fetchResourceResponse = await alice.rootClient.request({
119
+ url: createdUrl,
120
+ method: 'GET'
121
+ });
122
+ assert.equal(fetchResourceResponse.status, 200);
123
+ const responseBody = await fetchResourceResponse.text();
124
+ assert.equal(responseBody, 'line 1\nline2\n');
125
+ }
126
+ },
127
+ {
128
+ id: 'resource.put-get',
129
+ name: '[root] PUT and GET Resource',
130
+ run: async (ctx, state) => {
131
+ const { serverUrl } = ctx;
132
+ const { alice } = state;
133
+ const resourceId = 'put-resource';
134
+ const resourceUrl = new URL(`/space/${alice.space1.id}/credentials/${resourceId}`, serverUrl).toString();
135
+ const body = { id: resourceId, name: 'PUT Resource Test' };
136
+ const putResponse = await alice.rootClient.request({
137
+ url: resourceUrl,
138
+ method: 'PUT',
139
+ json: body
140
+ });
141
+ assert.equal(putResponse.status, 204);
142
+ const getResponse = await alice.rootClient.request({
143
+ url: resourceUrl,
144
+ method: 'GET'
145
+ });
146
+ assert.equal(getResponse.status, 200);
147
+ assert.equal(getResponse.data.name, 'PUT Resource Test');
148
+ }
149
+ },
150
+ {
151
+ id: 'resource.put-missing-collection-404',
152
+ name: '[root] PUT Resource to non-existent collection should 404',
153
+ run: async (ctx, state) => {
154
+ const { serverUrl } = ctx;
155
+ const { alice } = state;
156
+ const resourceUrl = new URL(`/space/${alice.space1.id}/collection-does-not-exist/some-resource`, serverUrl).toString();
157
+ let expectedError;
158
+ try {
159
+ await alice.rootClient.request({
160
+ url: resourceUrl,
161
+ method: 'PUT',
162
+ json: { name: 'test' }
163
+ });
164
+ }
165
+ catch (err) {
166
+ expectedError = err;
167
+ }
168
+ assert.equal(expectedError.response.status, 404);
169
+ assert.match(expectedError.response.headers.get('content-type'), /application\/problem\+json/);
170
+ }
171
+ },
172
+ {
173
+ id: 'resource.put-upsert',
174
+ name: '[root] PUT Resource should update existing resource (upsert)',
175
+ run: async (ctx, state) => {
176
+ const { serverUrl } = ctx;
177
+ const { alice } = state;
178
+ const resourceId = 'upsert-resource';
179
+ const resourceUrl = new URL(`/space/${alice.space1.id}/credentials/${resourceId}`, serverUrl).toString();
180
+ await alice.rootClient.request({
181
+ url: resourceUrl,
182
+ method: 'PUT',
183
+ json: { id: resourceId, name: 'Original Name' }
184
+ });
185
+ const secondPut = await alice.rootClient.request({
186
+ url: resourceUrl,
187
+ method: 'PUT',
188
+ json: { id: resourceId, name: 'Updated Name' }
189
+ });
190
+ assert.equal(secondPut.status, 204);
191
+ const getResponse = await alice.rootClient.request({
192
+ url: resourceUrl,
193
+ method: 'GET'
194
+ });
195
+ assert.equal(getResponse.status, 200);
196
+ assert.equal(getResponse.data.name, 'Updated Name');
197
+ }
198
+ },
199
+ {
200
+ id: 'resource.cross-user-read-404',
201
+ name: "[root] Bob should not be able to GET Alice's resources",
202
+ run: async (ctx, state) => {
203
+ const { serverUrl } = ctx;
204
+ const { alice, bob } = state;
205
+ const body = {
206
+ id: 'alice-private-resource',
207
+ name: 'Alice Private Resource'
208
+ };
209
+ const postResponse = await alice.rootClient.request({
210
+ url: new URL(`/space/${alice.space1.id}/credentials/`, serverUrl).toString(),
211
+ method: 'POST',
212
+ json: body
213
+ });
214
+ assert.equal(postResponse.status, 201);
215
+ const resourceUrl = postResponse.headers.get('location');
216
+ let expectedError;
217
+ try {
218
+ await bob.rootClient.request({ url: resourceUrl, method: 'GET' });
219
+ }
220
+ catch (err) {
221
+ expectedError = err;
222
+ }
223
+ // Bob gets a 404, not a 403, to avoid revealing the resource's existence
224
+ assert.equal(expectedError.response.status, 404);
225
+ assert.match(expectedError.response.headers.get('content-type'), /application\/problem\+json/);
226
+ await alice.rootClient.request({ url: resourceUrl, method: 'DELETE' });
227
+ }
228
+ },
229
+ {
230
+ id: 'resource.meta-get-or-skip',
231
+ name: '[root] GET Resource Metadata (/meta), or skip if unimplemented',
232
+ run: async (ctx, state) => {
233
+ const { serverUrl, generateId } = ctx;
234
+ const { alice } = state;
235
+ // Resource Metadata is OPTIONAL: a server that does not implement it
236
+ // responds 501 `unsupported-operation`, which this test treats as a skip.
237
+ const resourceId = generateId();
238
+ const resourceUrl = new URL(`/space/${alice.space1.id}/credentials/${resourceId}`, serverUrl).toString();
239
+ await alice.rootClient.request({
240
+ url: resourceUrl,
241
+ method: 'PUT',
242
+ json: { id: resourceId, name: 'Metadata Resource' }
243
+ });
244
+ const metaUrl = `${resourceUrl}/meta`;
245
+ let response;
246
+ try {
247
+ response = await alice.rootClient.request({
248
+ url: metaUrl,
249
+ method: 'GET'
250
+ });
251
+ }
252
+ catch (err) {
253
+ if (err.response?.status === 501) {
254
+ // Optional endpoint not implemented -- pass with skip.
255
+ ctx.skip('Resource Metadata (/meta) not implemented (501)');
256
+ }
257
+ throw err;
258
+ }
259
+ assert.equal(response.status, 200);
260
+ assert.match(response.headers.get('content-type'), /application\/json/);
261
+ assert.equal(response.data.contentType, 'application/json');
262
+ assert.ok(Number.isInteger(response.data.size) && response.data.size > 0, 'size should be a positive integer');
263
+ // An anonymous (unsigned) meta read must not leak existence: 404 problem+json.
264
+ const anonResponse = await fetch(new URL(metaUrl));
265
+ assert.equal(anonResponse.status, 404);
266
+ assert.match(anonResponse.headers.get('content-type'), /application\/problem\+json/);
267
+ }
268
+ },
269
+ {
270
+ id: 'head.binary-resource',
271
+ name: '[root] HEAD a binary resource returns its content-type + content-length, no body',
272
+ group: 'HEAD Resource',
273
+ run: async (ctx, state) => {
274
+ const { serverUrl } = ctx;
275
+ const { alice } = state;
276
+ // 'line 1\nline2\n' is exactly 13 bytes.
277
+ const body = new Blob(['line 1\nline2\n'], { type: 'text/plain' });
278
+ const postResponse = await alice.rootClient.request({
279
+ url: new URL(`/space/${alice.space1.id}/credentials/`, serverUrl).toString(),
280
+ method: 'POST',
281
+ body
282
+ });
283
+ assert.equal(postResponse.status, 201);
284
+ const resourceUrl = postResponse.headers.get('location');
285
+ const headResponse = await alice.rootClient.request({
286
+ url: resourceUrl,
287
+ method: 'HEAD'
288
+ });
289
+ assert.equal(headResponse.status, 200);
290
+ assert.match(headResponse.headers.get('content-type'), /text\/plain/);
291
+ assert.equal(headResponse.headers.get('content-length'), '13');
292
+ // HEAD carries no body.
293
+ assert.equal(await headResponse.text(), '');
294
+ }
295
+ },
296
+ {
297
+ id: 'head.private-denied-404',
298
+ name: 'anonymous HEAD of a private resource is denied (404, no leak)',
299
+ group: 'HEAD Resource',
300
+ run: async (ctx, state) => {
301
+ const { serverUrl, generateId } = ctx;
302
+ const { alice } = state;
303
+ const resourceId = generateId();
304
+ const resourceUrl = new URL(`/space/${alice.space1.id}/credentials/${resourceId}`, serverUrl).toString();
305
+ await alice.rootClient.request({
306
+ url: resourceUrl,
307
+ method: 'PUT',
308
+ json: { id: resourceId, name: 'Private HEAD Resource' }
309
+ });
310
+ const response = await fetch(new URL(resourceUrl), { method: 'HEAD' });
311
+ assert.equal(response.status, 404);
312
+ }
313
+ },
314
+ {
315
+ id: 'head.public-matches-get',
316
+ name: 'anonymous HEAD of a PublicCanRead resource returns headers matching a GET',
317
+ group: 'HEAD Resource',
318
+ run: async (ctx, state) => {
319
+ const { serverUrl, generateId } = ctx;
320
+ const { alice } = state;
321
+ const resourceId = generateId();
322
+ const resourceUrl = new URL(`/space/${alice.space1.id}/credentials/${resourceId}`, serverUrl).toString();
323
+ await alice.rootClient.request({
324
+ url: resourceUrl,
325
+ method: 'PUT',
326
+ json: { id: resourceId, name: 'Public HEAD Resource' }
327
+ });
328
+ // Grant public read at the resource level.
329
+ await alice.rootClient.request({
330
+ url: `${resourceUrl}/policy`,
331
+ method: 'PUT',
332
+ json: { type: 'PublicCanRead' }
333
+ });
334
+ // The HEAD Content-Type/Content-Length must match what a GET returns
335
+ // (spec "Content Types and Representations": both correspond to the
336
+ // Metadata `contentType`/`size`).
337
+ const getResponse = await fetch(new URL(resourceUrl));
338
+ assert.equal(getResponse.status, 200);
339
+ const getBytes = await getResponse.arrayBuffer();
340
+ const headResponse = await fetch(new URL(resourceUrl), {
341
+ method: 'HEAD'
342
+ });
343
+ assert.equal(headResponse.status, 200);
344
+ assert.equal(headResponse.headers.get('content-type'), getResponse.headers.get('content-type'));
345
+ assert.equal(headResponse.headers.get('content-length'), String(getBytes.byteLength));
346
+ assert.equal(await headResponse.text(), '');
347
+ // Cleanup: revoke the resource policy.
348
+ await alice.rootClient.request({
349
+ url: `${resourceUrl}/policy`,
350
+ method: 'DELETE'
351
+ });
352
+ }
353
+ },
354
+ {
355
+ id: 'resource.post-delete',
356
+ name: '[root] POST and DELETE Resource with proper authorization',
357
+ run: async (ctx, state) => {
358
+ const { serverUrl } = ctx;
359
+ const { alice } = state;
360
+ const body = { id: 'sample-resource-to-delete', name: 'Sample Delete' };
361
+ const response = await alice.rootClient.request({
362
+ url: new URL(`/space/${alice.space1.id}/credentials/`, serverUrl).toString(),
363
+ method: 'POST',
364
+ json: body
365
+ });
366
+ assert.equal(response.status, 201);
367
+ assert.equal(response.data['content-type'], 'application/json');
368
+ assert.match(response.headers.get('content-type'), /application\/json/);
369
+ const resourceUrl = response.headers.get('location');
370
+ assert.ok(resourceUrl.startsWith(`${serverUrl}/space/${alice.space1.id}/credentials/`));
371
+ const fetchResourceResponse = await alice.rootClient.request({
372
+ url: resourceUrl,
373
+ method: 'GET'
374
+ });
375
+ assert.equal(fetchResourceResponse.status, 200);
376
+ const deleteResponse = await alice.rootClient.request({
377
+ url: resourceUrl,
378
+ method: 'DELETE'
379
+ });
380
+ assert.equal(deleteResponse.status, 204);
381
+ let checkResponse;
382
+ try {
383
+ await alice.rootClient.request({ url: resourceUrl, method: 'GET' });
384
+ }
385
+ catch (err) {
386
+ checkResponse = err.response;
387
+ }
388
+ assert.equal(checkResponse.status, 404);
389
+ }
390
+ }
391
+ ]
392
+ };
393
+ //# sourceMappingURL=resource-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-api.js","sourceRoot":"","sources":["../../src/suites/resource-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Suite } from '../harness/types.js';
2
+ export declare const server: Suite;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/suites/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,eAAO,MAAM,MAAM,EAAE,KAkBpB,CAAA"}
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- Server.
6
+ */
7
+ import assert from '../harness/assert.js';
8
+ export const server = {
9
+ id: 'server',
10
+ name: 'Server',
11
+ // GET / returning 200 is not clearly spec-mandated; an API-only server may 404 at root.
12
+ optional: true,
13
+ tests: [
14
+ {
15
+ id: 'server.get-root',
16
+ name: 'should GET /',
17
+ run: async (ctx) => {
18
+ const { serverUrl } = ctx;
19
+ const response = await fetch(serverUrl);
20
+ assert.equal(response.status, 200);
21
+ }
22
+ }
23
+ ]
24
+ };
25
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/suites/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;GAEG;AACH,OAAO,MAAM,MAAM,sBAAsB,CAAA;AAGzC,MAAM,CAAC,MAAM,MAAM,GAAU;IAC3B,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IAEd,wFAAwF;IACxF,QAAQ,EAAE,IAAI;IAEd,KAAK,EAAE;QACL;YACE,EAAE,EAAE,iBAAiB;YACrB,IAAI,EAAE,cAAc;YACpB,GAAG,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;gBACf,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAA;gBACzB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAA;gBACvC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACpC,CAAC;SACF;KACF;CACF,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { Suite } from '../harness/types.js';
2
+ interface State {
3
+ alice: any;
4
+ aliceDelegatedApp: any;
5
+ bob: any;
6
+ collectionId: string;
7
+ resourceId: string;
8
+ }
9
+ export declare const spacesApi: Suite<State>;
10
+ export {};
11
+ //# sourceMappingURL=spaces-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaces-api.d.ts","sourceRoot":"","sources":["../../src/suites/spaces-api.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,UAAU,KAAK;IACb,KAAK,EAAE,GAAG,CAAA;IACV,iBAAiB,EAAE,GAAG,CAAA;IACtB,GAAG,EAAE,GAAG,CAAA;IACR,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,KAAK,CA+clC,CAAA"}