sh3-core 0.9.0 → 0.9.1

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.
@@ -2,14 +2,14 @@ import { describe, it, expect, beforeEach } from 'vitest';
2
2
  import { MemoryDocumentBackend } from '../documents/backends';
3
3
  import { __setDocumentBackend, __setTenantId } from '../documents/config';
4
4
  import { registerShard, activateShard, __resetShardRegistryForTest } from './activate.svelte';
5
- import { PERMISSION_DOCUMENTS_BROWSE } from '../documents/types';
5
+ import { PERMISSION_DOCUMENTS_BROWSE, PERMISSION_DOCUMENTS_READ, PERMISSION_DOCUMENTS_WRITE, } from '../documents/types';
6
6
  describe('ctx.browse permission gating', () => {
7
7
  beforeEach(() => {
8
8
  __resetShardRegistryForTest();
9
9
  __setDocumentBackend(new MemoryDocumentBackend());
10
10
  __setTenantId('tenant-a');
11
11
  });
12
- it('is undefined when permission is absent', async () => {
12
+ it('is undefined when no documents permission is declared', async () => {
13
13
  let captured = null;
14
14
  registerShard({
15
15
  manifest: { id: 'no-browse', label: 'n', version: '0.0.0', views: [] },
@@ -18,7 +18,7 @@ describe('ctx.browse permission gating', () => {
18
18
  await activateShard('no-browse');
19
19
  expect(captured.browse).toBeUndefined();
20
20
  });
21
- it('is defined when documents:browse is declared', async () => {
21
+ it('exposes metadata methods when documents:browse is declared', async () => {
22
22
  var _a, _b, _c;
23
23
  let captured = null;
24
24
  registerShard({
@@ -33,4 +33,88 @@ describe('ctx.browse permission gating', () => {
33
33
  expect(typeof ((_b = captured.browse) === null || _b === void 0 ? void 0 : _b.watchDocuments)).toBe('function');
34
34
  expect(typeof ((_c = captured.browse) === null || _c === void 0 ? void 0 : _c.listShards)).toBe('function');
35
35
  });
36
+ it('omits readFrom and writeTo when only documents:browse is declared', async () => {
37
+ var _a, _b;
38
+ let captured = null;
39
+ registerShard({
40
+ manifest: {
41
+ id: 'browse-only', label: 'b', version: '0.0.0', views: [],
42
+ permissions: [PERMISSION_DOCUMENTS_BROWSE],
43
+ },
44
+ activate(ctx) { captured = ctx; },
45
+ });
46
+ await activateShard('browse-only');
47
+ expect((_a = captured.browse) === null || _a === void 0 ? void 0 : _a.readFrom).toBeUndefined();
48
+ expect((_b = captured.browse) === null || _b === void 0 ? void 0 : _b.writeTo).toBeUndefined();
49
+ });
50
+ it('exposes readFrom when documents:browse + documents:read are declared', async () => {
51
+ var _a, _b;
52
+ let captured = null;
53
+ registerShard({
54
+ manifest: {
55
+ id: 'browse-and-read', label: 'br', version: '0.0.0', views: [],
56
+ permissions: [PERMISSION_DOCUMENTS_BROWSE, PERMISSION_DOCUMENTS_READ],
57
+ },
58
+ activate(ctx) { captured = ctx; },
59
+ });
60
+ await activateShard('browse-and-read');
61
+ expect(typeof ((_a = captured.browse) === null || _a === void 0 ? void 0 : _a.readFrom)).toBe('function');
62
+ expect((_b = captured.browse) === null || _b === void 0 ? void 0 : _b.writeTo).toBeUndefined();
63
+ });
64
+ it('exposes writeTo when documents:browse + documents:write are declared', async () => {
65
+ var _a, _b;
66
+ let captured = null;
67
+ registerShard({
68
+ manifest: {
69
+ id: 'browse-and-write', label: 'bw', version: '0.0.0', views: [],
70
+ permissions: [PERMISSION_DOCUMENTS_BROWSE, PERMISSION_DOCUMENTS_WRITE],
71
+ },
72
+ activate(ctx) { captured = ctx; },
73
+ });
74
+ await activateShard('browse-and-write');
75
+ expect((_a = captured.browse) === null || _a === void 0 ? void 0 : _a.readFrom).toBeUndefined();
76
+ expect(typeof ((_b = captured.browse) === null || _b === void 0 ? void 0 : _b.writeTo)).toBe('function');
77
+ });
78
+ it('exposes both readFrom and writeTo when all three permissions are declared', async () => {
79
+ var _a, _b;
80
+ let captured = null;
81
+ registerShard({
82
+ manifest: {
83
+ id: 'full-access', label: 'full', version: '0.0.0', views: [],
84
+ permissions: [
85
+ PERMISSION_DOCUMENTS_BROWSE,
86
+ PERMISSION_DOCUMENTS_READ,
87
+ PERMISSION_DOCUMENTS_WRITE,
88
+ ],
89
+ },
90
+ activate(ctx) { captured = ctx; },
91
+ });
92
+ await activateShard('full-access');
93
+ expect(typeof ((_a = captured.browse) === null || _a === void 0 ? void 0 : _a.readFrom)).toBe('function');
94
+ expect(typeof ((_b = captured.browse) === null || _b === void 0 ? void 0 : _b.writeTo)).toBe('function');
95
+ });
96
+ it('yields no ctx.browse when documents:read is declared without documents:browse', async () => {
97
+ let captured = null;
98
+ registerShard({
99
+ manifest: {
100
+ id: 'read-only', label: 'r', version: '0.0.0', views: [],
101
+ permissions: [PERMISSION_DOCUMENTS_READ],
102
+ },
103
+ activate(ctx) { captured = ctx; },
104
+ });
105
+ await activateShard('read-only');
106
+ expect(captured.browse).toBeUndefined();
107
+ });
108
+ it('yields no ctx.browse when documents:write is declared without documents:browse', async () => {
109
+ let captured = null;
110
+ registerShard({
111
+ manifest: {
112
+ id: 'write-only', label: 'w', version: '0.0.0', views: [],
113
+ permissions: [PERMISSION_DOCUMENTS_WRITE],
114
+ },
115
+ activate(ctx) { captured = ctx; },
116
+ });
117
+ await activateShard('write-only');
118
+ expect(captured.browse).toBeUndefined();
119
+ });
36
120
  });
@@ -23,7 +23,7 @@ import { fetchEnvState, putEnvState } from '../env/client';
23
23
  import { isAdmin as checkIsAdmin } from '../auth/index';
24
24
  import { createZoneManager } from '../state/manage';
25
25
  import { PERMISSION_STATE_MANAGE } from '../state/types';
26
- import { PERMISSION_DOCUMENTS_BROWSE } from '../documents/types';
26
+ import { PERMISSION_DOCUMENTS_BROWSE, PERMISSION_DOCUMENTS_READ, PERMISSION_DOCUMENTS_WRITE, } from '../documents/types';
27
27
  import { createBrowseCapability } from '../documents/browse';
28
28
  import { createShardKeysApi } from '../keys/client';
29
29
  import { PERMISSION_KEYS_MINT } from '../keys/types';
@@ -137,7 +137,10 @@ export async function activateShard(id) {
137
137
  ? createZoneManager()
138
138
  : undefined,
139
139
  browse: ((_b = shard.manifest.permissions) === null || _b === void 0 ? void 0 : _b.includes(PERMISSION_DOCUMENTS_BROWSE))
140
- ? createBrowseCapability(getTenantId(), getDocumentBackend())
140
+ ? createBrowseCapability(getTenantId(), getDocumentBackend(), {
141
+ canRead: shard.manifest.permissions.includes(PERMISSION_DOCUMENTS_READ),
142
+ canWrite: shard.manifest.permissions.includes(PERMISSION_DOCUMENTS_WRITE),
143
+ })
141
144
  : undefined,
142
145
  keys: ((_c = shard.manifest.permissions) === null || _c === void 0 ? void 0 : _c.includes(PERMISSION_KEYS_MINT))
143
146
  ? createShardKeysApi({
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Auto-generated from package.json — do not edit manually. */
2
- export declare const VERSION = "0.9.0";
2
+ export declare const VERSION = "0.9.1";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Auto-generated from package.json — do not edit manually. */
2
- export const VERSION = '0.9.0';
2
+ export const VERSION = '0.9.1';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh3-core",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"