@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,21 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- high-level WasClient: Delegation.
6
+ *
7
+ * Exercises the client's grant / `fromCapability` round-trip against a live
8
+ * server: Alice delegates access to Bob, who rebuilds a handle from the signed
9
+ * capability and reads (but cannot write beyond the grant).
10
+ */
11
+ import { Space } from '@interop/was-client';
12
+ import type { Suite } from '../harness/types.js';
13
+ interface State {
14
+ alice: any;
15
+ bob: any;
16
+ createdSpaces: Space[];
17
+ newSpace: (name: string) => Promise<Space>;
18
+ }
19
+ export declare const clientDelegation: Suite<State>;
20
+ export {};
21
+ //# sourceMappingURL=client-delegation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-delegation.d.ts","sourceRoot":"","sources":["../../src/suites/client-delegation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,EAAY,MAAM,qBAAqB,CAAA;AAGrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,UAAU,KAAK;IACb,KAAK,EAAE,GAAG,CAAA;IACV,GAAG,EAAE,GAAG,CAAA;IACR,aAAa,EAAE,KAAK,EAAE,CAAA;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC3C;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAwFzC,CAAA"}
@@ -0,0 +1,94 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- high-level WasClient: Delegation.
6
+ *
7
+ * Exercises the client's grant / `fromCapability` round-trip against a live
8
+ * server: Alice delegates access to Bob, who rebuilds a handle from the signed
9
+ * capability and reads (but cannot write beyond the grant).
10
+ */
11
+ import { Space, Resource } from '@interop/was-client';
12
+ import assert from '../harness/assert.js';
13
+ export const clientDelegation = {
14
+ id: 'client-delegation',
15
+ name: 'WasClient — Delegation',
16
+ setup: async (ctx) => {
17
+ // Shallow-clone the shared actors so per-suite scratch fields do not leak
18
+ // into other suites.
19
+ const alice = { ...ctx.actors.alice };
20
+ const bob = { ...ctx.actors.bob };
21
+ const createdSpaces = [];
22
+ /**
23
+ * Creates a space owned by Alice and registers it for teardown.
24
+ *
25
+ * @param name {string}
26
+ * @returns {Promise<Space>}
27
+ */
28
+ async function newSpace(name) {
29
+ const space = await ctx.provisionSpace({ was: alice.was, name });
30
+ createdSpaces.push(space);
31
+ return space;
32
+ }
33
+ return { alice, bob, createdSpaces, newSpace };
34
+ },
35
+ teardown: async (ctx, state) => {
36
+ for (const space of state.createdSpaces) {
37
+ try {
38
+ await space.delete();
39
+ }
40
+ catch {
41
+ /* best-effort cleanup */
42
+ }
43
+ }
44
+ },
45
+ tests: [
46
+ {
47
+ id: 'delegation.bob-no-grant',
48
+ name: 'bob cannot see an alice space without a grant',
49
+ run: async (ctx, state) => {
50
+ const { newSpace, bob } = state;
51
+ const space = await newSpace('Private');
52
+ const seenByBob = await bob.was.space(space.id).describe();
53
+ assert.equal(seenByBob, null);
54
+ }
55
+ },
56
+ {
57
+ id: 'delegation.grant-read-space',
58
+ name: 'grants read on a space; recipient reads via fromCapability',
59
+ run: async (ctx, state) => {
60
+ const { newSpace, bob } = state;
61
+ const space = await newSpace('Shared Space');
62
+ const zcap = await space.grant({ to: bob.did, actions: ['GET'] });
63
+ const handle = bob.was.fromCapability(zcap);
64
+ assert.ok(handle instanceof Space);
65
+ const description = await handle.describe();
66
+ assert.equal(description?.name, 'Shared Space');
67
+ }
68
+ },
69
+ {
70
+ id: 'delegation.grant-read-resource',
71
+ name: 'grants read on a resource; recipient reads but cannot write',
72
+ run: async (ctx, state) => {
73
+ const { newSpace, alice, bob } = state;
74
+ const space = await newSpace('Doc Space');
75
+ const collection = await space.createCollection({ id: 'docs' });
76
+ const added = await collection.add({ secret: 'value' });
77
+ // Lowercase action input is normalized to uppercase in the signed zcap,
78
+ // so it still validates against the server (which expects 'GET').
79
+ const zcap = await alice.was.grant({
80
+ to: bob.did,
81
+ actions: ['get'],
82
+ target: added.url
83
+ });
84
+ assert.deepStrictEqual(zcap.allowedAction, ['GET']);
85
+ const handle = bob.was.fromCapability(zcap);
86
+ assert.ok(handle instanceof Resource);
87
+ assert.equal((await handle.get()).secret, 'value');
88
+ // The grant is read-only; a write must be denied.
89
+ await assert.rejects(handle.put({ secret: 'tampered' }));
90
+ }
91
+ }
92
+ ]
93
+ };
94
+ //# sourceMappingURL=client-delegation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-delegation.js","sourceRoot":"","sources":["../../src/suites/client-delegation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- high-level WasClient: Export / Import.
6
+ *
7
+ * Exercises the client's whole-space tar export and import against a live
8
+ * server: export a populated space, then import the archive into a fresh one.
9
+ */
10
+ import type { Space } from '@interop/was-client';
11
+ import type { Suite } from '../harness/types.js';
12
+ interface State {
13
+ alice: any;
14
+ createdSpaces: Space[];
15
+ newSpace: (name: string) => Promise<Space>;
16
+ }
17
+ export declare const clientExportImport: Suite<State>;
18
+ export {};
19
+ //# sourceMappingURL=client-export-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-export-import.d.ts","sourceRoot":"","sources":["../../src/suites/client-export-import.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAGhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,UAAU,KAAK;IACb,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,KAAK,EAAE,CAAA;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC3C;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAiF3C,CAAA"}
@@ -0,0 +1,74 @@
1
+ import assert from '../harness/assert.js';
2
+ export const clientExportImport = {
3
+ id: 'client-export-import',
4
+ name: 'WasClient — Export / Import',
5
+ setup: async (ctx) => {
6
+ // Shallow-clone the shared actor so per-suite scratch fields do not leak
7
+ // into other suites.
8
+ const alice = { ...ctx.actors.alice };
9
+ const createdSpaces = [];
10
+ /**
11
+ * Creates a space owned by Alice and registers it for teardown.
12
+ *
13
+ * @param name {string}
14
+ * @returns {Promise<Space>}
15
+ */
16
+ async function newSpace(name) {
17
+ const space = await ctx.provisionSpace({ was: alice.was, name });
18
+ createdSpaces.push(space);
19
+ return space;
20
+ }
21
+ return { alice, createdSpaces, newSpace };
22
+ },
23
+ teardown: async (ctx, state) => {
24
+ for (const space of state.createdSpaces) {
25
+ try {
26
+ await space.delete();
27
+ }
28
+ catch {
29
+ /* best-effort cleanup */
30
+ }
31
+ }
32
+ },
33
+ tests: [
34
+ {
35
+ id: 'export-import.round-trip',
36
+ name: 'exports a space to a tar archive and imports it into another',
37
+ run: async (ctx, state) => {
38
+ const { serverUrl } = ctx;
39
+ const { newSpace, alice } = state;
40
+ const source = await newSpace('Export Source');
41
+ const collection = await source.createCollection({
42
+ id: 'notes',
43
+ name: 'Notes'
44
+ });
45
+ await collection.put('first', { body: 'one' });
46
+ await collection.put('second', { body: 'two' });
47
+ // Make the collection world-readable so we can verify the policy survives
48
+ // the export/import round-trip.
49
+ await alice.was.request({
50
+ path: `/space/${source.id}/notes/policy`,
51
+ method: 'PUT',
52
+ json: { type: 'PublicCanRead' }
53
+ });
54
+ const archive = await source.export();
55
+ assert.ok(archive instanceof Uint8Array);
56
+ assert.ok(archive.byteLength > 0);
57
+ const target = await newSpace('Import Target');
58
+ const stats = await target.import(archive);
59
+ assert.ok(stats.collectionsCreated >= 1);
60
+ assert.ok(stats.resourcesCreated >= 2);
61
+ assert.ok(stats.policiesCreated >= 1);
62
+ const imported = (await target.collection('notes').get('first'));
63
+ assert.equal(imported.body, 'one');
64
+ // The PublicCanRead policy round-tripped: an anonymous GET of the imported
65
+ // resource in the target space succeeds.
66
+ const anonResponse = await fetch(new URL(`/space/${target.id}/notes/first`, serverUrl));
67
+ assert.equal(anonResponse.status, 200);
68
+ const anonBody = (await anonResponse.json());
69
+ assert.equal(anonBody.body, 'one');
70
+ }
71
+ }
72
+ ]
73
+ };
74
+ //# sourceMappingURL=client-export-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-export-import.js","sourceRoot":"","sources":["../../src/suites/client-export-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Suite } from '../harness/types.js';
2
+ import type { Collection, Space } from '@interop/was-client';
3
+ interface State {
4
+ alice: any;
5
+ space: Space;
6
+ jsonCollection: Collection;
7
+ binaryCollection: Collection;
8
+ }
9
+ export declare const clientResources: Suite<State>;
10
+ export {};
11
+ //# sourceMappingURL=client-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-resources.d.ts","sourceRoot":"","sources":["../../src/suites/client-resources.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE5D,UAAU,KAAK;IACb,KAAK,EAAE,GAAG,CAAA;IACV,KAAK,EAAE,KAAK,CAAA;IACZ,cAAc,EAAE,UAAU,CAAA;IAC1B,gBAAgB,EAAE,UAAU,CAAA;CAC7B;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CA8MxC,CAAA"}
@@ -0,0 +1,193 @@
1
+ /*!
2
+ * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
+ */
4
+ /**
5
+ * WAS conformance tests -- high-level WasClient: Resources (JSON + binary).
6
+ *
7
+ * Drives the published `@interop/was-client` against a live server, covering the
8
+ * client's JSON-vs-binary handling and the null-on-404 read semantics end to
9
+ * end.
10
+ */
11
+ import assert from '../harness/assert.js';
12
+ export const clientResources = {
13
+ id: 'client-resources',
14
+ name: 'WasClient — Resources',
15
+ setup: async (ctx) => {
16
+ // Shallow-clone the shared actor so per-suite scratch fields do not leak
17
+ // into other suites.
18
+ const alice = { ...ctx.actors.alice };
19
+ const space = await ctx.provisionSpace({
20
+ was: alice.was,
21
+ name: 'Resources Space'
22
+ });
23
+ const jsonCollection = await space.createCollection({
24
+ id: 'docs',
25
+ name: 'Docs'
26
+ });
27
+ const binaryCollection = await space.createCollection({
28
+ id: 'files',
29
+ name: 'Files'
30
+ });
31
+ return { alice, space, jsonCollection, binaryCollection };
32
+ },
33
+ teardown: async (ctx, state) => {
34
+ try {
35
+ await state.space.delete();
36
+ }
37
+ catch {
38
+ /* best-effort cleanup */
39
+ }
40
+ },
41
+ tests: [
42
+ {
43
+ id: 'json.add-server-id-and-get',
44
+ name: 'adds a JSON resource (server-generated id) and gets it back',
45
+ group: 'JSON resources',
46
+ run: async (ctx, state) => {
47
+ const { jsonCollection } = state;
48
+ const result = await jsonCollection.add({ name: 'Sample', value: 42 });
49
+ assert.ok(result.id);
50
+ assert.ok(result.url.includes(`/${result.id}`));
51
+ assert.match(result.contentType, /json/);
52
+ const fetched = (await jsonCollection.get(result.id));
53
+ assert.equal(fetched.name, 'Sample');
54
+ assert.equal(fetched.value, 42);
55
+ }
56
+ },
57
+ {
58
+ id: 'json.put-upsert-and-list',
59
+ name: 'puts a JSON resource by id (upsert) and lists items',
60
+ group: 'JSON resources',
61
+ run: async (ctx, state) => {
62
+ const { jsonCollection } = state;
63
+ await jsonCollection.put('greeting', { message: 'hello' });
64
+ assert.equal((await jsonCollection.get('greeting')).message, 'hello');
65
+ await jsonCollection.put('greeting', { message: 'updated' });
66
+ assert.equal((await jsonCollection.get('greeting')).message, 'updated');
67
+ const listing = await jsonCollection.list();
68
+ assert.ok(listing);
69
+ assert.ok(listing.items.some(item => item.id === 'greeting'));
70
+ }
71
+ },
72
+ {
73
+ id: 'json.get-missing-null',
74
+ name: 'returns null getting a missing resource (404 conflation)',
75
+ group: 'JSON resources',
76
+ run: async (ctx, state) => {
77
+ const { jsonCollection } = state;
78
+ assert.equal(await jsonCollection.get('no-such-resource'), null);
79
+ }
80
+ },
81
+ {
82
+ id: 'json.delete-via-handle',
83
+ name: 'deletes a resource via its handle',
84
+ group: 'JSON resources',
85
+ run: async (ctx, state) => {
86
+ const { jsonCollection } = state;
87
+ await jsonCollection.put('temp', { tmp: true });
88
+ assert.notEqual(await jsonCollection.get('temp'), null);
89
+ await jsonCollection.resource('temp').delete();
90
+ assert.equal(await jsonCollection.get('temp'), null);
91
+ }
92
+ },
93
+ {
94
+ id: 'binary.put-read-bytes-text',
95
+ name: 'puts and reads Uint8Array bytes via getBytes/getText',
96
+ group: 'binary resources',
97
+ run: async (ctx, state) => {
98
+ const { binaryCollection } = state;
99
+ const bytes = new TextEncoder().encode('line 1\nline 2\n');
100
+ await binaryCollection.put('note.txt', bytes, {
101
+ contentType: 'text/plain'
102
+ });
103
+ const handle = binaryCollection.resource('note.txt');
104
+ assert.equal(await handle.getText(), 'line 1\nline 2\n');
105
+ assert.deepStrictEqual(await handle.getBytes(), bytes);
106
+ }
107
+ },
108
+ {
109
+ id: 'binary.add-returns-blob',
110
+ name: 'add() returns a Blob from get() for non-JSON content',
111
+ group: 'binary resources',
112
+ run: async (ctx, state) => {
113
+ const { binaryCollection } = state;
114
+ const blob = new Blob(['hello blob'], { type: 'text/plain' });
115
+ const result = await binaryCollection.add(blob);
116
+ const fetched = await binaryCollection.get(result.id);
117
+ assert.ok(fetched instanceof Blob);
118
+ assert.equal(await fetched.text(), 'hello blob');
119
+ }
120
+ },
121
+ {
122
+ id: 'binary.get-missing-null',
123
+ name: 'getText/getBytes return null for a missing resource',
124
+ group: 'binary resources',
125
+ run: async (ctx, state) => {
126
+ const { binaryCollection } = state;
127
+ const handle = binaryCollection.resource('absent');
128
+ assert.equal(await handle.getText(), null);
129
+ assert.equal(await handle.getBytes(), null);
130
+ }
131
+ },
132
+ {
133
+ id: 'binary.put-octet-stream-raw',
134
+ name: 'puts raw application/octet-stream bytes (non-multipart) and reads them back',
135
+ group: 'binary resources',
136
+ run: async (ctx, state) => {
137
+ const { binaryCollection } = state;
138
+ const bytes = new Uint8Array([0, 1, 2, 253, 254, 255]);
139
+ await binaryCollection.put('raw.bin', bytes, {
140
+ contentType: 'application/octet-stream'
141
+ });
142
+ const handle = binaryCollection.resource('raw.bin');
143
+ assert.deepStrictEqual(await handle.getBytes(), bytes);
144
+ const meta = await handle.meta();
145
+ assert.equal(meta.contentType, 'application/octet-stream');
146
+ assert.equal(meta.size, bytes.length);
147
+ }
148
+ },
149
+ {
150
+ id: 'binary.dotted-id-content-type',
151
+ name: 'preserves a dotted resource id and its content-type in listings',
152
+ group: 'binary resources',
153
+ run: async (ctx, state) => {
154
+ const { binaryCollection } = state;
155
+ const bytes = new Uint8Array([0x89, 0x50, 0x4e, 0x47]);
156
+ await binaryCollection.put('photo.png', bytes, {
157
+ contentType: 'image/png'
158
+ });
159
+ assert.deepStrictEqual(await binaryCollection.resource('photo.png').getBytes(), bytes);
160
+ assert.equal((await binaryCollection.resource('photo.png').meta()).contentType, 'image/png');
161
+ const listing = await binaryCollection.list();
162
+ const entry = listing.items.find(item => item.id === 'photo.png');
163
+ assert.ok(entry, 'dotted id should appear in the listing');
164
+ assert.equal(entry.contentType, 'image/png');
165
+ }
166
+ },
167
+ {
168
+ id: 'binary.jsonl-raw-not-parsed',
169
+ name: 'stores application/jsonl as raw bytes, not parsed as JSON',
170
+ group: 'binary resources',
171
+ run: async (ctx, state) => {
172
+ const { binaryCollection } = state;
173
+ // A JSON-Lines body is several JSON values, not one. The full stack must
174
+ // keep it raw end to end: the server must not route it through the JSON
175
+ // storage path, and the client (down through `@interop/http-client`) must
176
+ // not auto-parse a content-type that merely contains the substring "json"
177
+ // (`response.json()` throws on a JSON-Lines body).
178
+ const body = '{"a":1}\n{"a":2}\n';
179
+ await binaryCollection.put('data.jsonl', new Blob([body], { type: 'application/jsonl' }));
180
+ const handle = binaryCollection.resource('data.jsonl');
181
+ assert.equal(await handle.getText(), body);
182
+ const meta = await handle.meta();
183
+ assert.equal(meta.contentType, 'application/jsonl');
184
+ assert.equal(meta.size, new TextEncoder().encode(body).length);
185
+ // get() returns a Blob (not a parsed object) for the json-substring type.
186
+ const fetched = await binaryCollection.get('data.jsonl');
187
+ assert.ok(fetched instanceof Blob);
188
+ assert.equal(await fetched.text(), body);
189
+ }
190
+ }
191
+ ]
192
+ };
193
+ //# sourceMappingURL=client-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-resources.js","sourceRoot":"","sources":["../../src/suites/client-resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;GAMG;AACH,OAAO,MAAM,MAAM,sBAAsB,CAAA;AAYzC,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,uBAAuB;IAE7B,KAAK,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;QACjB,yEAAyE;QACzE,qBAAqB;QACrB,MAAM,KAAK,GAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC;YACrC,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAA;QACF,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC;YAClD,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;SACb,CAAC,CAAA;QACF,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC;YACpD,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;SACd,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;IAC3D,CAAC;IAED,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,EAAE;QACL;YACE,EAAE,EAAE,4BAA4B;YAChC,IAAI,EAAE,6DAA6D;YACnE,KAAK,EAAE,gBAAgB;YACvB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;gBAChC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;gBACtE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACpB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAY,EAAE,MAAM,CAAC,CAAA;gBAEzC,MAAM,OAAO,GAAG,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAQ,CAAA;gBAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;gBACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACjC,CAAC;SACF;QACD;YACE,EAAE,EAAE,0BAA0B;YAC9B,IAAI,EAAE,qDAAqD;YAC3D,KAAK,EAAE,gBAAgB;YACvB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;gBAChC,MAAM,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC1D,MAAM,CAAC,KAAK,CACT,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAS,CAAC,OAAO,EACvD,OAAO,CACR,CAAA;gBAED,MAAM,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC5D,MAAM,CAAC,KAAK,CACT,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAS,CAAC,OAAO,EACvD,SAAS,CACV,CAAA;gBAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;gBAC3C,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;gBAClB,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAA;YAC/D,CAAC;SACF;QACD;YACE,EAAE,EAAE,uBAAuB;YAC3B,IAAI,EAAE,0DAA0D;YAChE,KAAK,EAAE,gBAAgB;YACvB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;gBAChC,MAAM,CAAC,KAAK,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAA;YAClE,CAAC;SACF;QACD;YACE,EAAE,EAAE,wBAAwB;YAC5B,IAAI,EAAE,mCAAmC;YACzC,KAAK,EAAE,gBAAgB;YACvB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;gBAChC,MAAM,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC/C,MAAM,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAA;gBACvD,MAAM,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;gBAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAA;YACtD,CAAC;SACF;QACD;YACE,EAAE,EAAE,4BAA4B;YAChC,IAAI,EAAE,sDAAsD;YAC5D,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;gBAClC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;gBAC1D,MAAM,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE;oBAC5C,WAAW,EAAE,YAAY;iBAC1B,CAAC,CAAA;gBAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;gBACpD,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAA;gBACxD,MAAM,CAAC,eAAe,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAA;YACxD,CAAC;SACF;QACD;YACE,EAAE,EAAE,yBAAyB;YAC7B,IAAI,EAAE,sDAAsD;YAC5D,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;gBAClC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;gBAC7D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC/C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACrD,MAAM,CAAC,EAAE,CAAC,OAAO,YAAY,IAAI,CAAC,CAAA;gBAClC,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAA;YAClD,CAAC;SACF;QACD;YACE,EAAE,EAAE,yBAAyB;YAC7B,IAAI,EAAE,qDAAqD;YAC3D,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;gBAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAClD,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAA;gBAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAA;YAC7C,CAAC;SACF;QACD;YACE,EAAE,EAAE,6BAA6B;YACjC,IAAI,EAAE,6EAA6E;YACnF,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;gBAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;gBACtD,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE;oBAC3C,WAAW,EAAE,0BAA0B;iBACxC,CAAC,CAAA;gBAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACnD,MAAM,CAAC,eAAe,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAA;gBACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAChC,MAAM,CAAC,KAAK,CAAC,IAAK,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAA;gBAC3D,MAAM,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YACxC,CAAC;SACF;QACD;YACE,EAAE,EAAE,+BAA+B;YACnC,IAAI,EAAE,iEAAiE;YACvE,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;gBAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;gBACtD,MAAM,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE;oBAC7C,WAAW,EAAE,WAAW;iBACzB,CAAC,CAAA;gBAEF,MAAM,CAAC,eAAe,CACpB,MAAM,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,EACvD,KAAK,CACN,CAAA;gBACD,MAAM,CAAC,KAAK,CACV,CAAC,MAAM,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC,WAAW,EAClE,WAAW,CACZ,CAAA;gBAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAA;gBAC7C,MAAM,KAAK,GAAG,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,WAAW,CAAC,CAAA;gBAClE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,wCAAwC,CAAC,CAAA;gBAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;YAC9C,CAAC;SACF;QACD;YACE,EAAE,EAAE,6BAA6B;YACjC,IAAI,EAAE,2DAA2D;YACjE,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;gBAClC,yEAAyE;gBACzE,wEAAwE;gBACxE,0EAA0E;gBAC1E,0EAA0E;gBAC1E,mDAAmD;gBACnD,MAAM,IAAI,GAAG,oBAAoB,CAAA;gBACjC,MAAM,gBAAgB,CAAC,GAAG,CACxB,YAAY,EACZ,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAChD,CAAA;gBAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;gBACtD,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAA;gBAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAChC,MAAM,CAAC,KAAK,CAAC,IAAK,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAA;gBACpD,MAAM,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;gBAE/D,0EAA0E;gBAC1E,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;gBACxD,MAAM,CAAC,EAAE,CAAC,OAAO,YAAY,IAAI,CAAC,CAAA;gBAClC,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;YAC1C,CAAC;SACF;KACF;CACF,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { Suite } from '../harness/types.js';
2
+ import type { Space } from '@interop/was-client';
3
+ interface State {
4
+ alice: any;
5
+ createdSpaces: Space[];
6
+ newSpace: (name: string) => Promise<Space>;
7
+ space: Space;
8
+ }
9
+ export declare const clientSpaces: Suite<State>;
10
+ export {};
11
+ //# sourceMappingURL=client-spaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-spaces.d.ts","sourceRoot":"","sources":["../../src/suites/client-spaces.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAGhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,UAAU,KAAK;IACb,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,KAAK,EAAE,CAAA;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC1C,KAAK,EAAE,KAAK,CAAA;CACb;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CA0VrC,CAAA"}