@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,411 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- Spaces Repository and Space API.
6
+ */
7
+ import assert from '../harness/assert.js';
8
+ export const spacesApi = {
9
+ id: 'spaces-api',
10
+ name: 'Spaces',
11
+ setup: async (ctx) => {
12
+ // Shallow-clone the shared actors so per-suite scratch fields (space ids)
13
+ // do not leak into other suites.
14
+ const alice = { ...ctx.actors.alice };
15
+ const aliceDelegatedApp = { ...ctx.actors.aliceDelegatedApp };
16
+ const bob = { ...ctx.actors.bob };
17
+ alice.space1 = { id: ctx.generateId() };
18
+ alice.space2 = { id: ctx.generateId() };
19
+ alice.space3 = { id: ctx.generateId() };
20
+ // Pre-create alice.space1 so tests that need an existing space are not
21
+ // implicitly coupled to the creation test's ordering
22
+ await ctx.createSpace({
23
+ spaceDescription: {
24
+ id: alice.space1.id,
25
+ name: "Alice's Space #1 (Home)",
26
+ controller: alice.did
27
+ },
28
+ rootClient: alice.rootClient
29
+ });
30
+ return { alice, aliceDelegatedApp, bob, collectionId: '', resourceId: '' };
31
+ },
32
+ teardown: async (ctx, state) => {
33
+ const { alice } = state;
34
+ for (const spaceId of [alice.space1.id, alice.space2.id, alice.space3.id]) {
35
+ try {
36
+ await alice.rootClient.request({
37
+ url: new URL(`/space/${spaceId}`, ctx.serverUrl).toString(),
38
+ method: 'DELETE'
39
+ });
40
+ }
41
+ catch {
42
+ /* best-effort cleanup */
43
+ }
44
+ }
45
+ },
46
+ groups: [
47
+ {
48
+ name: 'Collections API',
49
+ setup: async (ctx, state) => {
50
+ const { alice } = state;
51
+ state.collectionId = ctx.generateId();
52
+ state.resourceId = ctx.generateId();
53
+ await ctx.createSpace({
54
+ spaceDescription: {
55
+ id: alice.space3.id,
56
+ name: "Alice's Space #3 (Collections Test)",
57
+ controller: alice.did
58
+ },
59
+ rootClient: alice.rootClient
60
+ });
61
+ await alice.rootClient.request({
62
+ url: new URL(`/space/${alice.space3.id}/${state.collectionId}`, ctx.serverUrl).toString(),
63
+ method: 'PUT',
64
+ json: { id: state.collectionId, name: 'Test Collection' }
65
+ });
66
+ await alice.rootClient.request({
67
+ url: new URL(`/space/${alice.space3.id}/${state.collectionId}/${state.resourceId}`, ctx.serverUrl).toString(),
68
+ method: 'PUT',
69
+ json: { id: state.resourceId, name: 'Test Resource' }
70
+ });
71
+ }
72
+ }
73
+ ],
74
+ tests: [
75
+ {
76
+ id: 'repository.anonymous-list-empty',
77
+ name: 'GET /spaces/ without auth headers returns the empty listing (200)',
78
+ group: 'Spaces Repository API',
79
+ run: async (ctx) => {
80
+ const { serverUrl } = ctx;
81
+ // List Spaces is the spec's exception to 404 masking: an anonymous
82
+ // request is not an error -- it is simply authorized to see no spaces.
83
+ const response = await fetch(new URL('/spaces/', serverUrl));
84
+ assert.equal(response.status, 200);
85
+ assert.match(response.headers.get('content-type'), /application\/json/);
86
+ const listing = (await response.json());
87
+ assert.equal(listing.url, '/spaces/');
88
+ assert.equal(listing.totalItems, 0);
89
+ assert.deepStrictEqual(listing.items, []);
90
+ }
91
+ },
92
+ {
93
+ id: 'repository.list-scoped-to-controller',
94
+ name: '[root] GET /spaces/ lists only spaces controlled by the requester',
95
+ group: 'Spaces Repository API',
96
+ run: async (ctx, state) => {
97
+ const { serverUrl, createSpace, generateId } = ctx;
98
+ const { alice, bob } = state;
99
+ // A persistent external server may hold any number of spaces for Alice
100
+ // from earlier runs, so assert containment / exclusion, not contents.
101
+ const bobSpaceId = generateId();
102
+ await createSpace({
103
+ spaceDescription: {
104
+ id: bobSpaceId,
105
+ name: "Bob's Listing Space",
106
+ controller: bob.did
107
+ },
108
+ rootClient: bob.rootClient
109
+ });
110
+ try {
111
+ const response = await alice.rootClient.request({
112
+ url: new URL('/spaces/', serverUrl).toString(),
113
+ method: 'GET'
114
+ });
115
+ assert.equal(response.status, 200);
116
+ const listing = response.data;
117
+ assert.equal(listing.url, '/spaces/');
118
+ assert.equal(listing.totalItems, listing.items.length);
119
+ const aliceItem = listing.items.find((item) => item.id === alice.space1.id);
120
+ assert.ok(aliceItem, "Alice's listing includes her pre-created space");
121
+ assert.equal(aliceItem.url, `/space/${alice.space1.id}`);
122
+ assert.ok(!listing.items.some((item) => item.id === bobSpaceId), "Alice's listing must not reveal Bob's space");
123
+ }
124
+ finally {
125
+ await bob.rootClient.request({
126
+ url: new URL(`/space/${bobSpaceId}`, serverUrl).toString(),
127
+ method: 'DELETE'
128
+ });
129
+ }
130
+ }
131
+ },
132
+ {
133
+ id: 'repository.create-unauthorized-401',
134
+ name: 'POST /spaces/ should 401 error when no authorization headers',
135
+ group: 'Spaces Repository API',
136
+ run: async (ctx) => {
137
+ const { serverUrl } = ctx;
138
+ const response = await fetch(new URL('/spaces/', serverUrl), {
139
+ method: 'POST'
140
+ });
141
+ assert.equal(response.status, 401);
142
+ assert.match(response.headers.get('content-type'), /application\/problem\+json/);
143
+ }
144
+ },
145
+ {
146
+ id: 'space.create-post',
147
+ name: '[root] create space via POST',
148
+ group: 'Space API',
149
+ run: async (ctx, state) => {
150
+ const { serverUrl, createSpace, generateId, withoutCreatedBy } = ctx;
151
+ const { alice } = state;
152
+ const freshSpaceId = generateId();
153
+ const spaceDescription = {
154
+ id: freshSpaceId,
155
+ name: 'Conformance Test Space',
156
+ controller: alice.did
157
+ };
158
+ const response = await createSpace({
159
+ spaceDescription,
160
+ rootClient: alice.rootClient
161
+ });
162
+ assert.equal(response.status, 201);
163
+ assert.deepStrictEqual(withoutCreatedBy(response.data), {
164
+ id: freshSpaceId,
165
+ name: 'Conformance Test Space',
166
+ type: ['Space'],
167
+ controller: alice.did
168
+ });
169
+ assert.match(response.headers.get('content-type'), /application\/json/);
170
+ assert.equal(response.headers.get('location'), `${serverUrl}/spaces/${freshSpaceId}`);
171
+ // Clean up the space created by this test
172
+ await alice.rootClient.request({
173
+ url: new URL(`/space/${freshSpaceId}`, serverUrl).toString(),
174
+ method: 'DELETE'
175
+ });
176
+ }
177
+ },
178
+ {
179
+ id: 'space.create-post-id-conflict-409',
180
+ name: '[root] POST /spaces/ with an existing id yields id-conflict (409)',
181
+ group: 'Space API',
182
+ specRefs: ['https://wallet.storage/spec#id-conflict'],
183
+ run: async (ctx, state) => {
184
+ const { createSpace } = ctx;
185
+ const { alice } = state;
186
+ // alice.space1 was pre-created in before(). The onboarding-token path of
187
+ // createSpace() returns the status; the zcap path throws on non-2xx --
188
+ // capture either shape.
189
+ let status, problem;
190
+ try {
191
+ const response = await createSpace({
192
+ spaceDescription: {
193
+ id: alice.space1.id,
194
+ name: 'Duplicate Space',
195
+ controller: alice.did
196
+ },
197
+ rootClient: alice.rootClient
198
+ });
199
+ status = response.status;
200
+ problem = response.data;
201
+ }
202
+ catch (err) {
203
+ status = err.response?.status;
204
+ problem = err.data;
205
+ }
206
+ assert.equal(status, 409);
207
+ assert.equal(problem.type, 'https://wallet.storage/spec#id-conflict');
208
+ }
209
+ },
210
+ {
211
+ id: 'space.create-put',
212
+ name: '[root] create space by id via PUT',
213
+ group: 'Space API',
214
+ run: async (ctx, state) => {
215
+ const { serverUrl } = ctx;
216
+ const { alice } = state;
217
+ const spaceDescription = {
218
+ id: alice.space2.id,
219
+ name: "Alice's Space #2 (School)",
220
+ controller: alice.did
221
+ };
222
+ const spaceUrl = new URL(`/space/${alice.space2.id}`, serverUrl).toString();
223
+ const response = await alice.rootClient.request({
224
+ url: spaceUrl,
225
+ method: 'PUT',
226
+ json: spaceDescription
227
+ });
228
+ assert.equal(response.headers.get('location'), spaceUrl);
229
+ const checkResponse = await alice.rootClient.request({
230
+ url: spaceUrl,
231
+ method: 'GET'
232
+ });
233
+ assert.equal(checkResponse.status, 200);
234
+ }
235
+ },
236
+ {
237
+ id: 'space.anonymous-read-404',
238
+ name: 'GET a space with no auth headers falls through to policy and 404s (no public policy)',
239
+ group: 'Space API',
240
+ run: async (ctx, state) => {
241
+ const { serverUrl } = ctx;
242
+ const { alice } = state;
243
+ // Reads no longer 401 at the hook: an anonymous read is allowed to
244
+ // attempt, and is denied as 404 (no-leak) when no policy grants it.
245
+ const spaceUrl = new URL(`/space/${alice.space1.id}`, serverUrl).toString();
246
+ const response = await fetch(spaceUrl, { method: 'GET' });
247
+ assert.equal(response.status, 404);
248
+ assert.match(response.headers.get('content-type'), /application\/problem\+json/);
249
+ }
250
+ },
251
+ {
252
+ id: 'space.read-missing-404',
253
+ name: 'GET /space/:spaceId should 404 error on not found space id',
254
+ group: 'Space API',
255
+ run: async (ctx, state) => {
256
+ const { serverUrl } = ctx;
257
+ const { alice } = state;
258
+ const spaceUrl = new URL('/space/space-id-that-does-not-exist', serverUrl).toString();
259
+ let expectedError;
260
+ try {
261
+ await alice.rootClient.request({
262
+ url: spaceUrl,
263
+ method: 'GET',
264
+ action: 'GET'
265
+ });
266
+ }
267
+ catch (err) {
268
+ expectedError = err;
269
+ }
270
+ assert.equal(expectedError.response.status, 404);
271
+ assert.match(expectedError.response.headers.get('content-type'), /application\/problem\+json/);
272
+ }
273
+ },
274
+ {
275
+ id: 'space.read-authorized',
276
+ name: '[root] read space via GET with proper authorization',
277
+ group: 'Space API',
278
+ run: async (ctx, state) => {
279
+ const { serverUrl, withoutCreatedBy } = ctx;
280
+ const { alice } = state;
281
+ const spaceUrl = new URL(`/space/${alice.space1.id}`, serverUrl).toString();
282
+ const response = await alice.rootClient.request({
283
+ url: spaceUrl,
284
+ method: 'GET',
285
+ action: 'GET'
286
+ });
287
+ assert.equal(response.status, 200);
288
+ assert.match(response.headers.get('content-type'), /application\/json/);
289
+ assert.deepStrictEqual(withoutCreatedBy(response.data), {
290
+ id: alice.space1.id,
291
+ name: "Alice's Space #1 (Home)",
292
+ type: ['Space'],
293
+ controller: alice.did,
294
+ url: `/space/${alice.space1.id}`,
295
+ linkset: `/space/${alice.space1.id}/linkset`
296
+ });
297
+ }
298
+ },
299
+ {
300
+ id: 'space.read-delegated',
301
+ name: '[delegated] authorized app should GET /space/:spaceId',
302
+ group: 'Space API',
303
+ run: async (ctx, state) => {
304
+ const { serverUrl, zcapClient, withoutCreatedBy } = ctx;
305
+ const { alice, aliceDelegatedApp } = state;
306
+ const aliceAppClient = zcapClient({ signer: aliceDelegatedApp.signer });
307
+ const spaceUrl = new URL(`/space/${alice.space1.id}`, serverUrl).toString();
308
+ const delegatedSpaceCapability = await alice.rootClient.delegate({
309
+ allowedActions: ['GET'],
310
+ invocationTarget: spaceUrl,
311
+ controller: aliceDelegatedApp.did
312
+ });
313
+ const appResponse = await aliceAppClient.request({
314
+ url: spaceUrl,
315
+ capability: delegatedSpaceCapability,
316
+ method: 'GET',
317
+ action: 'GET'
318
+ });
319
+ assert.equal(appResponse.status, 200);
320
+ assert.match(appResponse.headers.get('content-type'), /application\/json/);
321
+ assert.deepStrictEqual(withoutCreatedBy(appResponse.data), {
322
+ id: alice.space1.id,
323
+ name: "Alice's Space #1 (Home)",
324
+ type: ['Space'],
325
+ controller: alice.did,
326
+ url: `/space/${alice.space1.id}`,
327
+ linkset: `/space/${alice.space1.id}/linkset`
328
+ });
329
+ }
330
+ },
331
+ {
332
+ id: 'space.cross-user-read-404',
333
+ name: '[root] Bob should not be able to GET Alice space',
334
+ group: 'Space API',
335
+ run: async (ctx, state) => {
336
+ const { serverUrl } = ctx;
337
+ const { alice, bob } = state;
338
+ const spaceUrl = new URL(`/space/${alice.space1.id}`, serverUrl).toString();
339
+ let expectedError;
340
+ try {
341
+ await bob.rootClient.request({ url: spaceUrl, action: 'GET' });
342
+ }
343
+ catch (err) {
344
+ expectedError = err;
345
+ }
346
+ // Bob gets a 404 instead of a 403 to avoid revealing the space's existence
347
+ assert.equal(expectedError.response.status, 404);
348
+ assert.match(expectedError.response.headers.get('content-type'), /application\/problem\+json/);
349
+ }
350
+ },
351
+ {
352
+ id: 'space.delete',
353
+ name: '[root] Alice should be able to DELETE her provisioned space',
354
+ group: 'Space API',
355
+ run: async (ctx, state) => {
356
+ const { serverUrl, createSpace, generateId } = ctx;
357
+ const { alice } = state;
358
+ const spaceId = generateId();
359
+ await createSpace({
360
+ spaceDescription: {
361
+ id: spaceId,
362
+ name: 'Space to Delete',
363
+ controller: alice.did
364
+ },
365
+ rootClient: alice.rootClient
366
+ });
367
+ const spaceUrl = new URL(`/space/${spaceId}`, serverUrl).toString();
368
+ const deleteResponse = await alice.rootClient.request({
369
+ url: spaceUrl,
370
+ method: 'DELETE'
371
+ });
372
+ assert.equal(deleteResponse.status, 204);
373
+ let checkResponse;
374
+ try {
375
+ await alice.rootClient.request({ url: spaceUrl, method: 'GET' });
376
+ }
377
+ catch (err) {
378
+ checkResponse = err.response;
379
+ }
380
+ assert.equal(checkResponse.status, 404);
381
+ }
382
+ },
383
+ {
384
+ id: 'collections.list-for-space',
385
+ name: '[root] GET /space/:spaceId/collections/ lists collections for a space',
386
+ group: 'Collections API',
387
+ run: async (ctx, state) => {
388
+ const { serverUrl } = ctx;
389
+ const { alice, collectionId } = state;
390
+ const collectionsUrl = new URL(`/space/${alice.space3.id}/collections/`, serverUrl).toString();
391
+ const response = await alice.rootClient.request({
392
+ url: collectionsUrl,
393
+ method: 'GET'
394
+ });
395
+ assert.equal(response.status, 200);
396
+ assert.deepStrictEqual(response.data, {
397
+ url: `/space/${alice.space3.id}/collections/`,
398
+ totalItems: 1,
399
+ items: [
400
+ {
401
+ id: collectionId,
402
+ name: 'Test Collection',
403
+ url: `/space/${alice.space3.id}/${collectionId}`
404
+ }
405
+ ]
406
+ });
407
+ }
408
+ }
409
+ ]
410
+ };
411
+ //# sourceMappingURL=spaces-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaces-api.js","sourceRoot":"","sources":["../../src/suites/spaces-api.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "@interop/was-conformance-suite",
3
+ "description": "Conformance test suite for Wallet Attached Storage (WAS) servers, runnable as a CLI or in the browser.",
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "pnpm run clear && tsc",
8
+ "clear": "rimraf dist/*",
9
+ "dev": "vite",
10
+ "fix": "eslint --fix src test web && pnpm run format",
11
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"web/src/**/*.ts\" \"*.md\"",
12
+ "lint": "eslint src test web",
13
+ "prepare": "pnpm run build",
14
+ "rebuild": "pnpm run clear && pnpm run build",
15
+ "test": "pnpm run fix && pnpm run lint && pnpm run test:node && pnpm run test:browser",
16
+ "test:browser": "playwright test",
17
+ "test:node": "vitest run",
18
+ "test:coverage": "vitest run --coverage",
19
+ "web:build": "vite build --config web/vite.config.ts",
20
+ "web:dev": "vite --config web/vite.config.ts",
21
+ "web:preview": "vite preview --config web/vite.config.ts"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE.md"
27
+ ],
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "react-native": "./dist/index.js",
32
+ "import": "./dist/index.js",
33
+ "default": "./dist/index.js"
34
+ }
35
+ },
36
+ "bin": {
37
+ "was-conformance": "dist/cli/index.js"
38
+ },
39
+ "module": "dist/index.js",
40
+ "browser": "dist/index.js",
41
+ "types": "dist/index.d.ts",
42
+ "sideEffects": false,
43
+ "dependencies": {
44
+ "@digitalcredentials/bnid": "^5.0.0",
45
+ "@interop/data-integrity-core": "^8.2.0",
46
+ "@interop/ed25519-signature": "^7.1.3",
47
+ "@interop/ed25519-verification-key": "^8.0.2",
48
+ "@interop/ezcap": "^7.3.2",
49
+ "@interop/was-client": "^0.14.2",
50
+ "assert": "^2.1.0",
51
+ "uuid": "^14.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@eslint/js": "^10.0.1",
55
+ "@playwright/test": "^1.60.0",
56
+ "@types/node": "^26.0.1",
57
+ "@vitest/coverage-v8": "^4.1.7",
58
+ "eslint": "^10.4.0",
59
+ "eslint-config-prettier": "^10.1.8",
60
+ "globals": "^17.6.0",
61
+ "prettier": "^3.8.3",
62
+ "rimraf": "^6.1.3",
63
+ "typescript": "^6.0.3",
64
+ "typescript-eslint": "^8.59.4",
65
+ "vite": "^8.0.14",
66
+ "vitest": "^4.1.7"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public"
70
+ },
71
+ "keywords": [
72
+ "wallet-attached-storage",
73
+ "was",
74
+ "conformance",
75
+ "test-suite",
76
+ "isomorphic"
77
+ ],
78
+ "packageManager": "pnpm@11.5.0",
79
+ "engines": {
80
+ "node": ">=24.0"
81
+ },
82
+ "author": {
83
+ "name": "Interop Alliance",
84
+ "url": "https://github.com/interop-alliance/"
85
+ },
86
+ "license": "MIT",
87
+ "repository": {
88
+ "type": "git",
89
+ "url": "git+https://github.com/interop-alliance/was-conformance-suite.git"
90
+ },
91
+ "homepage": "https://github.com/interop-alliance/was-conformance-suite",
92
+ "bugs": "https://github.com/interop-alliance/was-conformance-suite/issues"
93
+ }