@substrat-run/contract-tests 0.138.0 → 0.139.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.
- package/dist/attachment-text-fixtures.d.ts +17 -0
- package/dist/attachment-text-fixtures.d.ts.map +1 -1
- package/dist/attachment-text-fixtures.js +344 -4
- package/dist/attachment-text-fixtures.js.map +1 -1
- package/dist/attachment-text-suite.d.ts +16 -1
- package/dist/attachment-text-suite.d.ts.map +1 -1
- package/dist/attachment-text-suite.js +212 -28
- package/dist/attachment-text-suite.js.map +1 -1
- package/dist/caused-by-module.d.ts +23 -0
- package/dist/caused-by-module.d.ts.map +1 -0
- package/dist/caused-by-module.js +56 -0
- package/dist/caused-by-module.js.map +1 -0
- package/dist/caused-by-suite.d.ts +28 -0
- package/dist/caused-by-suite.d.ts.map +1 -0
- package/dist/caused-by-suite.js +179 -0
- package/dist/caused-by-suite.js.map +1 -0
- package/dist/entity-state-module.d.ts +134 -0
- package/dist/entity-state-module.d.ts.map +1 -0
- package/dist/entity-state-module.js +140 -0
- package/dist/entity-state-module.js.map +1 -0
- package/dist/entity-state-suite.d.ts +9 -0
- package/dist/entity-state-suite.d.ts.map +1 -0
- package/dist/entity-state-suite.js +534 -0
- package/dist/entity-state-suite.js.map +1 -0
- package/dist/findings-atomic-suite.d.ts +21 -0
- package/dist/findings-atomic-suite.d.ts.map +1 -0
- package/dist/findings-atomic-suite.js +131 -0
- package/dist/findings-atomic-suite.js.map +1 -0
- package/dist/findings-suite.d.ts +11 -0
- package/dist/findings-suite.d.ts.map +1 -0
- package/dist/findings-suite.js +391 -0
- package/dist/findings-suite.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/membership-executor-suite.d.ts +6 -2
- package/dist/membership-executor-suite.d.ts.map +1 -1
- package/dist/membership-executor-suite.js +260 -14
- package/dist/membership-executor-suite.js.map +1 -1
- package/dist/modules.d.ts +217 -0
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +4 -0
- package/dist/modules.js.map +1 -1
- package/dist/permission-suite.d.ts.map +1 -1
- package/dist/permission-suite.js +75 -0
- package/dist/permission-suite.js.map +1 -1
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +48 -0
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/vertical-events-suite.d.ts +14 -0
- package/dist/vertical-events-suite.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract suite for entity archive and trash (#119): `ctx.archive`, `ctx.unarchive`,
|
|
3
|
+
* `ctx.trash`, `ctx.restore`, `ctx.entityState`, the views `ctx.page`/`ctx.search` compose,
|
|
4
|
+
* the permission-checked trashed readers, and `ctx.sql`'s refusal to write the columns.
|
|
5
|
+
*
|
|
6
|
+
* The REAL tuple checker on purpose: the property under test is that the kernel checks the
|
|
7
|
+
* DECLARED key, and an allow-all checker would pass a verb that checked nothing.
|
|
8
|
+
*
|
|
9
|
+
* Every refusal here has its positive twin beside it, so a test cannot pass by a verb that
|
|
10
|
+
* refuses everything.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
13
|
+
import { errorCodeOf, PAGE_CURSOR_RESTART, permissionKey, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
|
|
14
|
+
import { ulid } from '@substrat-run/kernel';
|
|
15
|
+
import { stateMod } from './entity-state-module.js';
|
|
16
|
+
const READ = permissionKey.parse('doc:read');
|
|
17
|
+
const ARCHIVE = permissionKey.parse('doc:archive');
|
|
18
|
+
const TRASH = permissionKey.parse('doc:trash');
|
|
19
|
+
export function entityStateContractSuite(adapterName, makeFixture, raw) {
|
|
20
|
+
describe(`entity archive and trash (#119): ${adapterName}`, () => {
|
|
21
|
+
let fixture;
|
|
22
|
+
let host;
|
|
23
|
+
const t1 = tenantId.parse(ulid());
|
|
24
|
+
const scope = scopeId.parse(ulid());
|
|
25
|
+
const staff = platformActorId.parse(ulid());
|
|
26
|
+
/** Every key, scope-wide. */
|
|
27
|
+
const alice = principalId.parse(ulid());
|
|
28
|
+
/** Archive but NOT trash — the two keys are distinct, and this is who proves it. */
|
|
29
|
+
const bob = principalId.parse(ulid());
|
|
30
|
+
/** Trash on ONE document only, entity-narrowed — whose bin holds that one and nothing else. */
|
|
31
|
+
const carol = principalId.parse(ulid());
|
|
32
|
+
let as;
|
|
33
|
+
const carolsDoc = `01CAROL${ulid().slice(7)}`;
|
|
34
|
+
/** A fresh document, so each case starts from `active` whatever ran before it. */
|
|
35
|
+
const doc = async (title = `doc ${ulid()}`, owner = 'o1') => {
|
|
36
|
+
const id = ulid();
|
|
37
|
+
await as.alice.invoke('state/add', { id, title, owner });
|
|
38
|
+
return id;
|
|
39
|
+
};
|
|
40
|
+
const errOf = async (call) => call.then(() => {
|
|
41
|
+
throw new Error('expected a refusal, got an answer');
|
|
42
|
+
}, (e) => e);
|
|
43
|
+
const ids = (page) => page.entries.map((r) => String(r['id']));
|
|
44
|
+
const activeIds = async () => ids(await as.alice.invoke('state/page', {}));
|
|
45
|
+
const archivedIds = async () => ids(await as.alice.invoke('state/page', { view: 'archived' }));
|
|
46
|
+
const trashedIds = async () => ids(await as.alice.invoke('state/page-trashed', {}));
|
|
47
|
+
beforeAll(async () => {
|
|
48
|
+
fixture = await makeFixture();
|
|
49
|
+
host = fixture.host;
|
|
50
|
+
host.registerModule(stateMod);
|
|
51
|
+
await host.admin.createTenant(staff, { id: t1, slug: 'state-tenant', name: 'State Tenant' });
|
|
52
|
+
await host.admin.grantEntitlement(staff, t1, 'state');
|
|
53
|
+
await host.admin.defineRole(staff, t1, { key: 'keeper', permissions: [READ, ARCHIVE, TRASH], source: 'vertical' });
|
|
54
|
+
await host.admin.defineRole(staff, t1, { key: 'filer', permissions: [READ, ARCHIVE], source: 'vertical' });
|
|
55
|
+
await host.admin.assignRole(staff, { principalId: alice, roleKey: 'keeper', node: { tenantId: t1, scopeId: null } });
|
|
56
|
+
await host.admin.assignRole(staff, { principalId: bob, roleKey: 'filer', node: { tenantId: t1, scopeId: null } });
|
|
57
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: scope, vertical: 'state-vertical' });
|
|
58
|
+
await host.admin.activateScope(staff, t1, scope);
|
|
59
|
+
await host.admin.grant(staff, {
|
|
60
|
+
principalId: carol,
|
|
61
|
+
permission: TRASH,
|
|
62
|
+
node: { tenantId: t1, scopeId: scope },
|
|
63
|
+
entity: { entityType: 'stdoc', entityId: carolsDoc },
|
|
64
|
+
grantedBy: alice,
|
|
65
|
+
});
|
|
66
|
+
as = {
|
|
67
|
+
alice: await host.getScope(alice, t1, scope),
|
|
68
|
+
bob: await host.getScope(bob, t1, scope),
|
|
69
|
+
carol: await host.getScope(carol, t1, scope),
|
|
70
|
+
};
|
|
71
|
+
await as.alice.invoke('state/add', { id: carolsDoc, title: 'carol owns this', owner: 'o3' });
|
|
72
|
+
});
|
|
73
|
+
afterAll(async () => {
|
|
74
|
+
await fixture.cleanup();
|
|
75
|
+
});
|
|
76
|
+
// -- transitions ---------------------------------------------------------------------
|
|
77
|
+
it('archives an active entity, and unarchives it back', async () => {
|
|
78
|
+
const id = await doc();
|
|
79
|
+
expect(await as.alice.invoke('state/archive', { id })).toBe('archived');
|
|
80
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('archived');
|
|
81
|
+
expect(await as.alice.invoke('state/unarchive', { id })).toBe('active');
|
|
82
|
+
});
|
|
83
|
+
it('trashes an active entity, and restore brings it back ACTIVE', async () => {
|
|
84
|
+
const id = await doc();
|
|
85
|
+
expect(await as.alice.invoke('state/trash', { id })).toBe('trashed');
|
|
86
|
+
expect(await as.alice.invoke('state/restore', { id })).toBe('active');
|
|
87
|
+
});
|
|
88
|
+
it('trashes an ARCHIVED entity, and restore brings it back ARCHIVED — never silently active', async () => {
|
|
89
|
+
const id = await doc();
|
|
90
|
+
await as.alice.invoke('state/archive', { id });
|
|
91
|
+
expect(await as.alice.invoke('state/trash', { id })).toBe('trashed');
|
|
92
|
+
expect(await as.alice.invoke('state/restore', { id })).toBe('archived');
|
|
93
|
+
expect(await activeIds()).not.toContain(id);
|
|
94
|
+
expect(await archivedIds()).toContain(id);
|
|
95
|
+
});
|
|
96
|
+
it('answers null for a row that does not exist', async () => {
|
|
97
|
+
expect(await as.alice.invoke('state/state', { id: ulid() })).toBeNull();
|
|
98
|
+
});
|
|
99
|
+
// -- refusals ------------------------------------------------------------------------
|
|
100
|
+
const expectConflict = async (call) => {
|
|
101
|
+
const err = await errOf(call);
|
|
102
|
+
expect(errorCodeOf(err)).toBe('conflict');
|
|
103
|
+
expect(err).toMatchObject({ extensions: { reason: 'invalid_transition' } });
|
|
104
|
+
};
|
|
105
|
+
it('refuses every move out of a state it does not start from', async () => {
|
|
106
|
+
const id = await doc();
|
|
107
|
+
await expectConflict(as.alice.invoke('state/unarchive', { id })); // active
|
|
108
|
+
await expectConflict(as.alice.invoke('state/restore', { id })); // active
|
|
109
|
+
await as.alice.invoke('state/archive', { id });
|
|
110
|
+
await expectConflict(as.alice.invoke('state/archive', { id })); // archived
|
|
111
|
+
await expectConflict(as.alice.invoke('state/restore', { id })); // archived, not trashed
|
|
112
|
+
await as.alice.invoke('state/trash', { id });
|
|
113
|
+
await expectConflict(as.alice.invoke('state/archive', { id })); // trashed: restore first
|
|
114
|
+
await expectConflict(as.alice.invoke('state/unarchive', { id })); // trashed
|
|
115
|
+
await expectConflict(as.alice.invoke('state/trash', { id })); // trashed
|
|
116
|
+
// …and the state is exactly what the last legal move left.
|
|
117
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('trashed');
|
|
118
|
+
});
|
|
119
|
+
it('answers not_found for a row that does not exist, after the key check', async () => {
|
|
120
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/archive', { id: ulid() })))).toBe('not_found');
|
|
121
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/trash', { id: ulid() })))).toBe('not_found');
|
|
122
|
+
});
|
|
123
|
+
it('refuses a verb on an entity that declares no such state', async () => {
|
|
124
|
+
await as.alice.invoke('state/add', { entityType: 'stnote', id: 'N-trash', title: 'note' });
|
|
125
|
+
await as.alice.invoke('state/add', { entityType: 'stplain', id: 'P-1', title: 'plain' });
|
|
126
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/trash', { entityType: 'stnote', id: 'N-trash' })))).toBe('validation_failed');
|
|
127
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/archive', { entityType: 'stplain', id: 'P-1' })))).toBe('validation_failed');
|
|
128
|
+
// Positive twin: the note's declared archive works.
|
|
129
|
+
expect(await as.alice.invoke('state/archive', { entityType: 'stnote', id: 'N-trash' })).toBe('archived');
|
|
130
|
+
});
|
|
131
|
+
it('rolls the move back with an operation that throws after it', async () => {
|
|
132
|
+
const id = await doc();
|
|
133
|
+
await errOf(as.alice.invoke('state/archive-then-throw', { id }));
|
|
134
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('active');
|
|
135
|
+
const events = await as.alice.invoke('state/history', { id });
|
|
136
|
+
expect(events.map((e) => e.type)).not.toContain('entity.archived');
|
|
137
|
+
});
|
|
138
|
+
// -- the declared keys ---------------------------------------------------------------
|
|
139
|
+
it('checks the declared ARCHIVE key: a holder may archive', async () => {
|
|
140
|
+
const id = await doc();
|
|
141
|
+
expect(await as.bob.invoke('state/archive', { id })).toBe('archived');
|
|
142
|
+
expect(await as.bob.invoke('state/unarchive', { id })).toBe('active');
|
|
143
|
+
});
|
|
144
|
+
it('checks the declared TRASH key — archive authority is not trash authority', async () => {
|
|
145
|
+
const id = await doc();
|
|
146
|
+
expect(errorCodeOf(await errOf(as.bob.invoke('state/trash', { id })))).toBe('permission_denied');
|
|
147
|
+
await as.alice.invoke('state/trash', { id });
|
|
148
|
+
expect(errorCodeOf(await errOf(as.bob.invoke('state/restore', { id })))).toBe('permission_denied');
|
|
149
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('trashed');
|
|
150
|
+
});
|
|
151
|
+
it('checks the key on THE entity: an entity-narrowed trash grant reaches that one row only', async () => {
|
|
152
|
+
const other = await doc();
|
|
153
|
+
expect(errorCodeOf(await errOf(as.carol.invoke('state/trash', { id: other })))).toBe('permission_denied');
|
|
154
|
+
// …and trash authority is not archive authority either.
|
|
155
|
+
expect(errorCodeOf(await errOf(as.carol.invoke('state/archive', { id: carolsDoc })))).toBe('permission_denied');
|
|
156
|
+
expect(await as.carol.invoke('state/trash', { id: carolsDoc })).toBe('trashed');
|
|
157
|
+
expect(await as.carol.invoke('state/restore', { id: carolsDoc })).toBe('active');
|
|
158
|
+
});
|
|
159
|
+
it('refuses before it reveals: a caller without the key learns nothing about a missing id', async () => {
|
|
160
|
+
expect(errorCodeOf(await errOf(as.carol.invoke('state/trash', { id: ulid() })))).toBe('permission_denied');
|
|
161
|
+
});
|
|
162
|
+
// -- recording -----------------------------------------------------------------------
|
|
163
|
+
it('records each move as a kernel event carrying who, when, from and to', async () => {
|
|
164
|
+
const id = await doc();
|
|
165
|
+
await as.alice.invoke('state/archive', { id });
|
|
166
|
+
await as.alice.invoke('state/trash', { id });
|
|
167
|
+
await as.alice.invoke('state/restore', { id });
|
|
168
|
+
await as.bob.invoke('state/unarchive', { id });
|
|
169
|
+
const events = (await as.alice.invoke('state/history', { id })).filter((e) => e.type.startsWith('entity.'));
|
|
170
|
+
expect(events.map((e) => [e.type, e.payload])).toEqual([
|
|
171
|
+
['entity.archived', { entity: { entityType: 'stdoc', entityId: id }, from: 'active', to: 'archived' }],
|
|
172
|
+
['entity.trashed', { entity: { entityType: 'stdoc', entityId: id }, from: 'archived', to: 'trashed' }],
|
|
173
|
+
['entity.restored', { entity: { entityType: 'stdoc', entityId: id }, from: 'trashed', to: 'archived' }],
|
|
174
|
+
['entity.unarchived', { entity: { entityType: 'stdoc', entityId: id }, from: 'archived', to: 'active' }],
|
|
175
|
+
]);
|
|
176
|
+
expect(events.map((e) => e.actor)).toEqual([alice, alice, alice, bob]);
|
|
177
|
+
expect(events.every((e) => typeof e.occurredAt === 'string')).toBe(true);
|
|
178
|
+
// The declared key is what authorized it, on the entity (K-34).
|
|
179
|
+
expect(JSON.stringify(events[3].authorization)).toContain('doc:archive');
|
|
180
|
+
});
|
|
181
|
+
// -- views ---------------------------------------------------------------------------
|
|
182
|
+
it('leaves archived and trashed rows out of the active page, and its count', async () => {
|
|
183
|
+
const [a, b, c] = [await doc('view a', 'ov'), await doc('view b', 'ov'), await doc('view c', 'ov')];
|
|
184
|
+
await as.alice.invoke('state/archive', { id: b });
|
|
185
|
+
await as.alice.invoke('state/trash', { id: c });
|
|
186
|
+
const page = await as.alice.invoke('state/page', { filters: { owner: 'ov' }, total: true });
|
|
187
|
+
expect(ids(page)).toEqual([a]);
|
|
188
|
+
expect(page.total).toBe(1);
|
|
189
|
+
const archived = await as.alice.invoke('state/page', {
|
|
190
|
+
view: 'archived',
|
|
191
|
+
filters: { owner: 'ov' },
|
|
192
|
+
total: true,
|
|
193
|
+
});
|
|
194
|
+
expect(ids(archived)).toEqual([b]);
|
|
195
|
+
expect(archived.total).toBe(1);
|
|
196
|
+
expect(await trashedIds()).toContain(c);
|
|
197
|
+
expect(await trashedIds()).not.toContain(b);
|
|
198
|
+
});
|
|
199
|
+
it('keeps a trashed ARCHIVED row out of the archive view — trash wins', async () => {
|
|
200
|
+
const id = await doc();
|
|
201
|
+
await as.alice.invoke('state/archive', { id });
|
|
202
|
+
await as.alice.invoke('state/trash', { id });
|
|
203
|
+
expect(await archivedIds()).not.toContain(id);
|
|
204
|
+
expect(await trashedIds()).toContain(id);
|
|
205
|
+
});
|
|
206
|
+
it('refuses the trashed view on the unchecked ctx.page, and a view an entity does not declare', async () => {
|
|
207
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/page', { view: 'trashed' })))).toBe('validation_failed');
|
|
208
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/page', { entityType: 'stplain', view: 'archived' })))).toBe('validation_failed');
|
|
209
|
+
// Positive twins: the archive-only note has an archived view, and a plain entity pages.
|
|
210
|
+
await as.alice.invoke('state/page', { entityType: 'stnote', view: 'archived' });
|
|
211
|
+
await as.alice.invoke('state/page', { entityType: 'stplain' });
|
|
212
|
+
});
|
|
213
|
+
it('reads the bin with the declared trash key checked on EVERY row', async () => {
|
|
214
|
+
const mine = carolsDoc;
|
|
215
|
+
const someoneElses = await doc('not carols');
|
|
216
|
+
await as.alice.invoke('state/trash', { id: mine });
|
|
217
|
+
await as.alice.invoke('state/trash', { id: someoneElses });
|
|
218
|
+
const carols = ids(await as.carol.invoke('state/page-trashed', {}));
|
|
219
|
+
expect(carols).toEqual([mine]);
|
|
220
|
+
// A key holder scope-wide sees both; a caller with no trash key sees nothing.
|
|
221
|
+
expect(await trashedIds()).toEqual(expect.arrayContaining([mine, someoneElses]));
|
|
222
|
+
expect(ids(await as.bob.invoke('state/page-trashed', {}))).toEqual([]);
|
|
223
|
+
await as.alice.invoke('state/restore', { id: mine });
|
|
224
|
+
});
|
|
225
|
+
it('keeps walking the bin past a page whose rows were all refused', async () => {
|
|
226
|
+
// Pages of one: carol is refused every row but her own, and the walk must reach it.
|
|
227
|
+
const seen = [];
|
|
228
|
+
let cursor;
|
|
229
|
+
await as.alice.invoke('state/trash', { id: carolsDoc });
|
|
230
|
+
for (let guard = 0; guard < 200; guard++) {
|
|
231
|
+
const got = await as.carol.invoke('state/page-trashed', { limit: 1, cursor });
|
|
232
|
+
seen.push(...ids(got));
|
|
233
|
+
if (got.nextCursor === null)
|
|
234
|
+
break;
|
|
235
|
+
cursor = got.nextCursor;
|
|
236
|
+
}
|
|
237
|
+
expect(seen).toEqual([carolsDoc]);
|
|
238
|
+
await as.alice.invoke('state/restore', { id: carolsDoc });
|
|
239
|
+
});
|
|
240
|
+
/** A cursor's envelope (K-44): base64url JSON naming the row it continues from. */
|
|
241
|
+
const decode = (cursor) => JSON.parse(new TextDecoder().decode(Uint8Array.from(atob(cursor.replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0))));
|
|
242
|
+
it('hands a caller denied every binned row an empty bin and NO cursor — no position of a hidden row leaks', async () => {
|
|
243
|
+
const hidden = await doc('hidden from bob');
|
|
244
|
+
await as.alice.invoke('state/trash', { id: hidden });
|
|
245
|
+
for (const limit of [1, 2, 50]) {
|
|
246
|
+
expect(await as.bob.invoke('state/page-trashed', { limit })).toEqual({ entries: [], nextCursor: null });
|
|
247
|
+
}
|
|
248
|
+
await as.alice.invoke('state/restore', { id: hidden });
|
|
249
|
+
});
|
|
250
|
+
it('mints every cursor from a row the caller can see, in a bin mostly of rows they cannot', async () => {
|
|
251
|
+
const others = [await doc('aaa other'), await doc('zzz other')];
|
|
252
|
+
for (const id of [...others, carolsDoc])
|
|
253
|
+
await as.alice.invoke('state/trash', { id });
|
|
254
|
+
const first = await as.carol.invoke('state/page-trashed', { limit: 1 });
|
|
255
|
+
expect(ids(first)).toEqual([carolsDoc]);
|
|
256
|
+
expect(first.nextCursor).not.toBeNull();
|
|
257
|
+
const position = decode(first.nextCursor);
|
|
258
|
+
expect(position.id).toBe(carolsDoc);
|
|
259
|
+
expect(position.value).toBe('carol owns this');
|
|
260
|
+
expect(await as.carol.invoke('state/page-trashed', { limit: 1, cursor: first.nextCursor })).toEqual({
|
|
261
|
+
entries: [],
|
|
262
|
+
nextCursor: null,
|
|
263
|
+
});
|
|
264
|
+
for (const id of [...others, carolsDoc])
|
|
265
|
+
await as.alice.invoke('state/restore', { id });
|
|
266
|
+
});
|
|
267
|
+
it("refuses a cursor from one view in another — a position among the active rows means nothing in the archive", async () => {
|
|
268
|
+
const [a, b] = [await doc('cursor a', 'ocur'), await doc('cursor b', 'ocur')];
|
|
269
|
+
const [c, d] = [await doc('cursor c', 'ocur'), await doc('cursor d', 'ocur')];
|
|
270
|
+
await as.alice.invoke('state/archive', { id: c });
|
|
271
|
+
await as.alice.invoke('state/archive', { id: d });
|
|
272
|
+
const restart = async (call) => {
|
|
273
|
+
const err = await errOf(call);
|
|
274
|
+
expect(errorCodeOf(err)).toBe('validation_failed');
|
|
275
|
+
expect(err).toMatchObject({ extensions: { reason: PAGE_CURSOR_RESTART } });
|
|
276
|
+
};
|
|
277
|
+
const filters = { owner: 'ocur' };
|
|
278
|
+
const active = await as.alice.invoke('state/page', { limit: 1, filters });
|
|
279
|
+
expect(ids(active)).toEqual([a]);
|
|
280
|
+
await restart(as.alice.invoke('state/page', { limit: 1, filters, view: 'archived', cursor: active.nextCursor }));
|
|
281
|
+
await restart(as.alice.invoke('state/page-trashed', { limit: 1, cursor: active.nextCursor }));
|
|
282
|
+
const archived = await as.alice.invoke('state/page', { limit: 1, filters, view: 'archived' });
|
|
283
|
+
expect(ids(archived)).toEqual([c]);
|
|
284
|
+
await restart(as.alice.invoke('state/page', { limit: 1, filters, cursor: archived.nextCursor }));
|
|
285
|
+
// The twins: each cursor continues the view that minted it.
|
|
286
|
+
expect(ids(await as.alice.invoke('state/page', { limit: 1, filters, cursor: active.nextCursor }))).toEqual([b]);
|
|
287
|
+
expect(ids(await as.alice.invoke('state/page', { limit: 1, filters, view: 'archived', cursor: archived.nextCursor }))).toEqual([d]);
|
|
288
|
+
});
|
|
289
|
+
it('carries no total on the bin — a count would disclose rows the caller cannot see', async () => {
|
|
290
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/page-trashed', { total: true })))).toBe('validation_failed');
|
|
291
|
+
});
|
|
292
|
+
it('searches the active rows by default, the archive on request, and the bin key-checked', async () => {
|
|
293
|
+
const tag = `zq${ulid().slice(-6).toLowerCase()}`;
|
|
294
|
+
const [live, filed, binned] = [
|
|
295
|
+
await doc(`${tag} live`),
|
|
296
|
+
await doc(`${tag} filed`),
|
|
297
|
+
await doc(`${tag} binned`),
|
|
298
|
+
];
|
|
299
|
+
await as.alice.invoke('state/archive', { id: filed });
|
|
300
|
+
await as.alice.invoke('state/trash', { id: binned });
|
|
301
|
+
const found = async (op, extra = {}, who = as.alice) => (await who.invoke(op, { term: tag, ...extra })).map((h) => h.id);
|
|
302
|
+
expect(await found('state/search')).toEqual([live]);
|
|
303
|
+
expect(await found('state/search', { view: 'archived' })).toEqual([filed]);
|
|
304
|
+
expect(await found('state/search-trashed')).toEqual([binned]);
|
|
305
|
+
expect(await found('state/search-trashed', {}, as.bob)).toEqual([]);
|
|
306
|
+
expect(errorCodeOf(await errOf(as.alice.invoke('state/search', { term: tag, view: 'trashed' })))).toBe('validation_failed');
|
|
307
|
+
});
|
|
308
|
+
// -- the columns are the kernel's -----------------------------------------------------
|
|
309
|
+
const expectGuarded = async (sql) => {
|
|
310
|
+
const err = await errOf(as.alice.invoke('state/sql', { sql }));
|
|
311
|
+
expect(errorCodeOf(err), sql).toBe('forbidden');
|
|
312
|
+
expect(err).toMatchObject({ extensions: { reason: 'spine_write' } });
|
|
313
|
+
};
|
|
314
|
+
it('refuses a module write to either column, in every position a write names one', async () => {
|
|
315
|
+
const id = await doc();
|
|
316
|
+
await as.alice.invoke('state/trash', { id });
|
|
317
|
+
const before = await as.alice.invoke('state/history', { id });
|
|
318
|
+
await expectGuarded(`UPDATE state_docs SET _substrat_trashed_at = NULL WHERE id = '${id}'`);
|
|
319
|
+
await expectGuarded(`UPDATE state_docs SET title = 'x', _substrat_archived_at = '2026' WHERE id = '${id}'`);
|
|
320
|
+
await expectGuarded(`UPDATE state_docs SET title = (SELECT title FROM state_docs WHERE id = 'x'), _substrat_trashed_at = NULL`);
|
|
321
|
+
await expectGuarded(`UPDATE state_docs SET (title, _substrat_trashed_at) = ('x', NULL)`);
|
|
322
|
+
// Codex r2: a CASE … END before the target ended the first scanner's list at its END.
|
|
323
|
+
await expectGuarded(`UPDATE state_docs SET title = CASE WHEN 1 THEN 'x' ELSE title END, _substrat_trashed_at = NULL WHERE id = '${id}'`);
|
|
324
|
+
await expectGuarded(`UPDATE state_docs SET title = (SELECT CASE WHEN 1 THEN 'END' END), "_substrat_trashed_at" = NULL WHERE id = '${id}'`);
|
|
325
|
+
await expectGuarded(`UPDATE state_docs SET "_substrat_trashed_at" = NULL`);
|
|
326
|
+
await expectGuarded(`INSERT INTO state_docs (id, title, owner, _substrat_archived_at) VALUES ('${ulid()}', 't', 'o', '2026')`);
|
|
327
|
+
await expectGuarded(`INSERT INTO state_docs (id, title, owner) VALUES ('${id}', 't', 'o')
|
|
328
|
+
ON CONFLICT (id) DO UPDATE SET _substrat_trashed_at = NULL`);
|
|
329
|
+
await expectGuarded('ALTER TABLE state_docs DROP COLUMN _substrat_trashed_at');
|
|
330
|
+
await expectGuarded('ALTER TABLE state_docs RENAME COLUMN _substrat_trashed_at TO gone');
|
|
331
|
+
// Nothing above reached the row, or its history.
|
|
332
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('trashed');
|
|
333
|
+
expect(await as.alice.invoke('state/history', { id })).toEqual(before);
|
|
334
|
+
});
|
|
335
|
+
it('lets a module READ the columns, in a SELECT and in the WHERE of its own write', async () => {
|
|
336
|
+
const id = await doc();
|
|
337
|
+
await as.alice.invoke('state/archive', { id });
|
|
338
|
+
const rows = await as.alice.invoke('state/sql', {
|
|
339
|
+
sql: 'SELECT _substrat_archived_at AS at FROM state_docs WHERE id = ?',
|
|
340
|
+
params: [id],
|
|
341
|
+
});
|
|
342
|
+
expect(typeof rows[0]['at']).toBe('string');
|
|
343
|
+
await as.alice.invoke('state/sql', {
|
|
344
|
+
sql: `UPDATE state_docs SET title = 'renamed' WHERE id = ? AND _substrat_trashed_at IS NULL`,
|
|
345
|
+
params: [id],
|
|
346
|
+
});
|
|
347
|
+
await as.alice.invoke('state/sql', {
|
|
348
|
+
sql: `UPDATE state_docs SET title = (SELECT title FROM state_docs WHERE _substrat_archived_at IS NOT NULL LIMIT 1) WHERE id = ?`,
|
|
349
|
+
params: [id],
|
|
350
|
+
});
|
|
351
|
+
const after = await as.alice.invoke('state/sql', { sql: 'SELECT title FROM state_docs WHERE id = ?', params: [id] });
|
|
352
|
+
expect(after[0]['title']).toBeTypeOf('string');
|
|
353
|
+
});
|
|
354
|
+
it('refuses every write that would set the state by position or reset it by REPLACE — and none moves it', async () => {
|
|
355
|
+
const binned = await doc();
|
|
356
|
+
await as.alice.invoke('state/trash', { id: binned });
|
|
357
|
+
const before = await as.alice.invoke('state/history', { id: binned });
|
|
358
|
+
const born = ulid();
|
|
359
|
+
// Columns are (id, title, owner, _substrat_archived_at, _substrat_trashed_at).
|
|
360
|
+
for (const sql of [
|
|
361
|
+
`INSERT INTO state_docs VALUES ('${born}', 't', 'o', '2026', NULL)`,
|
|
362
|
+
`insert into STATE_DOCS values ('${born}', 't', 'o', NULL, '2026')`,
|
|
363
|
+
`INSERT INTO main.state_docs VALUES ('${born}', 't', 'o', '2026', NULL)`,
|
|
364
|
+
`INSERT INTO state_docs SELECT '${born}', 't', 'o', '2026', NULL`,
|
|
365
|
+
`INSERT OR IGNORE INTO state_docs VALUES ('${born}', 't', 'o', '2026', NULL)`,
|
|
366
|
+
// REPLACE deletes the binned row and writes it back with both columns NULL: a restore
|
|
367
|
+
// without the key and without a record.
|
|
368
|
+
`REPLACE INTO state_docs (id, title, owner) VALUES ('${binned}', 't', 'o')`,
|
|
369
|
+
`INSERT OR REPLACE INTO state_docs (id, title, owner) VALUES ('${binned}', 't', 'o')`,
|
|
370
|
+
`REPLACE INTO state_docs VALUES ('${binned}', 't', 'o', NULL, NULL)`,
|
|
371
|
+
]) {
|
|
372
|
+
await expectGuarded(sql);
|
|
373
|
+
}
|
|
374
|
+
expect(await as.alice.invoke('state/state', { id: binned })).toBe('trashed');
|
|
375
|
+
expect(await as.alice.invoke('state/state', { id: born })).toBeNull();
|
|
376
|
+
expect(await as.alice.invoke('state/history', { id: binned })).toEqual(before);
|
|
377
|
+
});
|
|
378
|
+
it('still lets a module write a stateful table by naming its columns, and any other table by position', async () => {
|
|
379
|
+
const named = ulid();
|
|
380
|
+
await as.alice.invoke('state/sql', { sql: `INSERT INTO state_docs (id, title, owner) VALUES ('${named}', 't', 'o')` });
|
|
381
|
+
expect(await as.alice.invoke('state/state', { id: named })).toBe('active');
|
|
382
|
+
const selected = ulid();
|
|
383
|
+
await as.alice.invoke('state/sql', {
|
|
384
|
+
sql: `INSERT INTO state_docs (id, title, owner) SELECT '${selected}', title, owner FROM state_docs WHERE id = '${named}'`,
|
|
385
|
+
});
|
|
386
|
+
expect(await as.alice.invoke('state/state', { id: selected })).toBe('active');
|
|
387
|
+
await as.alice.invoke('state/sql', { sql: `INSERT INTO state_plain VALUES ('${ulid()}', 'plain')` });
|
|
388
|
+
await as.alice.invoke('state/sql', { sql: `REPLACE INTO state_plain VALUES ('P-1', 'replaced')` });
|
|
389
|
+
});
|
|
390
|
+
it('never lets a row be born archived or trashed, even by SQL the guard never sees', async () => {
|
|
391
|
+
const born = ulid();
|
|
392
|
+
for (const sql of [
|
|
393
|
+
`INSERT INTO state_docs (id, title, owner, _substrat_archived_at) VALUES ('${born}', 't', 'o', '2026')`,
|
|
394
|
+
`INSERT INTO state_docs (id, title, owner, _substrat_trashed_at) VALUES ('${born}', 't', 'o', '2026')`,
|
|
395
|
+
`INSERT INTO state_notes (id, title, _substrat_archived_at) VALUES ('${born}', 't', '2026')`,
|
|
396
|
+
]) {
|
|
397
|
+
await expect(raw(t1, scope, sql), sql).rejects.toThrow(/never inserted archived or trashed/);
|
|
398
|
+
}
|
|
399
|
+
expect(await as.alice.invoke('state/state', { id: born })).toBeNull();
|
|
400
|
+
// The twin: the same raw path inserts an active row.
|
|
401
|
+
await raw(t1, scope, `INSERT INTO state_docs (id, title, owner) VALUES ('${born}', 't', 'o')`);
|
|
402
|
+
expect(await as.alice.invoke('state/state', { id: born })).toBe('active');
|
|
403
|
+
});
|
|
404
|
+
it('never lets a state column change outside a kernel move, even by SQL the guard never sees', async () => {
|
|
405
|
+
const id = await doc();
|
|
406
|
+
await as.alice.invoke('state/trash', { id });
|
|
407
|
+
const before = await as.alice.invoke('state/history', { id });
|
|
408
|
+
for (const sql of [
|
|
409
|
+
`UPDATE state_docs SET _substrat_trashed_at = NULL WHERE id = '${id}'`,
|
|
410
|
+
`UPDATE state_docs SET title = CASE WHEN 1 THEN 'x' ELSE title END, _substrat_trashed_at = NULL WHERE id = '${id}'`,
|
|
411
|
+
`UPDATE state_docs SET _substrat_archived_at = '2026' WHERE id = '${id}'`,
|
|
412
|
+
]) {
|
|
413
|
+
await expect(raw(t1, scope, sql), sql).rejects.toThrow(/moves only through ctx\.archive/);
|
|
414
|
+
}
|
|
415
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('trashed');
|
|
416
|
+
expect(await as.alice.invoke('state/history', { id })).toEqual(before);
|
|
417
|
+
// The twins: an update that leaves the columns alone is untouched by the trigger, and the
|
|
418
|
+
// kernel's own move still passes it.
|
|
419
|
+
await raw(t1, scope, `UPDATE state_docs SET title = 'renamed raw' WHERE id = '${id}'`);
|
|
420
|
+
expect(await as.alice.invoke('state/restore', { id })).toBe('active');
|
|
421
|
+
});
|
|
422
|
+
it('carries archived and binned rows through an export and import, and the trigger comes back after them', async () => {
|
|
423
|
+
const filed = await doc('carried filed');
|
|
424
|
+
const binned = await doc('carried binned');
|
|
425
|
+
await as.alice.invoke('state/archive', { id: filed });
|
|
426
|
+
await as.alice.invoke('state/archive', { id: binned });
|
|
427
|
+
await as.alice.invoke('state/trash', { id: binned });
|
|
428
|
+
const fork = scopeId.parse(ulid());
|
|
429
|
+
await host.importScope(staff, { tenantId: t1, scopeId: fork, vertical: 'state-vertical' }, await host.admin.exportScope(staff, t1, scope));
|
|
430
|
+
const there = await host.getScope(alice, t1, fork);
|
|
431
|
+
expect(await there.invoke('state/state', { id: filed })).toBe('archived');
|
|
432
|
+
expect(await there.invoke('state/state', { id: binned })).toBe('trashed');
|
|
433
|
+
expect(await there.invoke('state/restore', { id: binned })).toBe('archived');
|
|
434
|
+
await expect(raw(t1, fork, `INSERT INTO state_docs (id, title, owner, _substrat_trashed_at) VALUES ('${ulid()}', 't', 'o', '2026')`)).rejects.toThrow(/never inserted archived or trashed/);
|
|
435
|
+
await expect(raw(t1, fork, `UPDATE state_docs SET _substrat_archived_at = NULL WHERE id = '${filed}'`)).rejects.toThrow(/moves only through ctx\.archive/);
|
|
436
|
+
// The derived list indexes came back with the load too: the walk still plans on them, and
|
|
437
|
+
// a module's runtime DDL in the copy passes the kernel's integrity check.
|
|
438
|
+
const rt = `rt_${ulid().toLowerCase()}`;
|
|
439
|
+
await there.invoke('state/sql', { sql: `CREATE TABLE ${rt} (id TEXT)` });
|
|
440
|
+
expect((await there.invoke('state/explain', { view: 'archived' })).join(' | ')).toMatch(/INDEX _substrat_list_test_state_stdoc_title_archived\b/);
|
|
441
|
+
});
|
|
442
|
+
it("refuses runtime DDL that would move a stateful table's rows out from under its triggers", async () => {
|
|
443
|
+
const id = await doc('ddl victim');
|
|
444
|
+
await as.alice.invoke('state/trash', { id });
|
|
445
|
+
const before = await as.alice.invoke('state/history', { id });
|
|
446
|
+
const copy = `SELECT id, title, owner, NULL AS _substrat_archived_at, NULL AS _substrat_trashed_at FROM main.state_docs`;
|
|
447
|
+
for (const sql of [
|
|
448
|
+
// Codex r3's sequence, statement by statement.
|
|
449
|
+
'ALTER TABLE state_docs RENAME TO state_docs_old',
|
|
450
|
+
`CREATE TABLE state_docs AS ${copy}`,
|
|
451
|
+
'DROP TABLE state_docs',
|
|
452
|
+
'DROP TABLE IF EXISTS main.state_docs',
|
|
453
|
+
// Every spelling of the name.
|
|
454
|
+
'ALTER TABLE "State_Docs" RENAME TO x',
|
|
455
|
+
'ALTER TABLE main.state_docs RENAME TO x',
|
|
456
|
+
'ALTER TABLE state_plain RENAME TO state_docs',
|
|
457
|
+
'ALTER TABLE state_docs RENAME COLUMN title TO heading',
|
|
458
|
+
'ALTER TABLE state_docs DROP COLUMN title',
|
|
459
|
+
// A temp object of the same name shadows the table in every unqualified reference.
|
|
460
|
+
`CREATE TEMP TABLE state_docs AS ${copy}`,
|
|
461
|
+
`CREATE TEMPORARY TABLE IF NOT EXISTS "STATE_DOCS" (id TEXT)`,
|
|
462
|
+
`CREATE TEMP VIEW state_docs AS ${copy}`,
|
|
463
|
+
`CREATE TABLE temp.state_docs AS ${copy}`,
|
|
464
|
+
'CREATE TEMP TRIGGER t_shadow AFTER INSERT ON state_docs BEGIN SELECT 1; END',
|
|
465
|
+
'CREATE TRIGGER t_on AFTER UPDATE ON main.state_docs BEGIN SELECT 1; END',
|
|
466
|
+
// `begin` as an identifier ahead of the trigger (CodeRabbit on #2070) — on a DO, one exec
|
|
467
|
+
// runs every statement in the string.
|
|
468
|
+
'SELECT 1 AS begin; CREATE TRIGGER t_hidden BEFORE UPDATE OF _substrat_trashed_at ON state_docs BEGIN SELECT RAISE(IGNORE); END',
|
|
469
|
+
// The kernel's derived objects, by their reserved prefix.
|
|
470
|
+
'DROP TRIGGER _substrat_state_state_docs_moved',
|
|
471
|
+
'DROP TRIGGER IF EXISTS _substrat_state_state_docs_born',
|
|
472
|
+
'DROP INDEX _substrat_list_test_state_stdoc_title',
|
|
473
|
+
"ATTACH DATABASE ':memory:' AS other",
|
|
474
|
+
]) {
|
|
475
|
+
await expectGuarded(sql);
|
|
476
|
+
}
|
|
477
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('trashed');
|
|
478
|
+
expect(await as.alice.invoke('state/history', { id })).toEqual(before);
|
|
479
|
+
expect(ids(await as.alice.invoke('state/page-trashed', {}))).toContain(id);
|
|
480
|
+
});
|
|
481
|
+
it("still runs a module's ordinary runtime DDL (#1811), and checks the stateful tables after it", async () => {
|
|
482
|
+
const t = `rt_${ulid().toLowerCase()}`;
|
|
483
|
+
await as.alice.invoke('state/sql', { sql: `CREATE TABLE IF NOT EXISTS ${t} (id TEXT PRIMARY KEY)` });
|
|
484
|
+
await as.alice.invoke('state/sql', { sql: `INSERT INTO ${t} VALUES ('a')` });
|
|
485
|
+
await as.alice.invoke('state/sql', { sql: `ALTER TABLE ${t} ADD COLUMN note TEXT` });
|
|
486
|
+
await as.alice.invoke('state/sql', { sql: `CREATE INDEX ${t}_note ON ${t} (note)` });
|
|
487
|
+
await as.alice.invoke('state/sql', { sql: `CREATE INDEX IF NOT EXISTS state_docs_owner_rt ON state_docs (owner)` });
|
|
488
|
+
expect(await as.alice.invoke('state/sql', { sql: `SELECT id FROM ${t}` })).toEqual([{ id: 'a' }]);
|
|
489
|
+
await as.alice.invoke('state/sql', { sql: `DROP TABLE ${t}` });
|
|
490
|
+
});
|
|
491
|
+
it('refuses to record a move whose update a foreign trigger swallowed', async () => {
|
|
492
|
+
// Past every guard, a trigger that turns the kernel's UPDATE into a no-op (CodeRabbit on #2070).
|
|
493
|
+
const id = await doc('swallowed');
|
|
494
|
+
await as.alice.invoke('state/trash', { id });
|
|
495
|
+
const before = await as.alice.invoke('state/history', { id });
|
|
496
|
+
await raw(t1, scope, 'CREATE TRIGGER t_swallow BEFORE UPDATE OF _substrat_trashed_at ON state_docs BEGIN SELECT RAISE(IGNORE); END');
|
|
497
|
+
try {
|
|
498
|
+
const err = await errOf(as.alice.invoke('state/restore', { id }));
|
|
499
|
+
expect(String(err.message)).toMatch(/changed no row/);
|
|
500
|
+
expect(await as.alice.invoke('state/state', { id })).toBe('trashed');
|
|
501
|
+
expect(await as.alice.invoke('state/history', { id })).toEqual(before);
|
|
502
|
+
}
|
|
503
|
+
finally {
|
|
504
|
+
await raw(t1, scope, 'DROP TRIGGER t_swallow');
|
|
505
|
+
}
|
|
506
|
+
expect(await as.alice.invoke('state/restore', { id })).toBe('active');
|
|
507
|
+
});
|
|
508
|
+
it('fails closed: runtime DDL that leaves a stateful table without its triggers is rolled back', async () => {
|
|
509
|
+
// Past the guard, take one derived trigger away — what a form nobody foresaw would do.
|
|
510
|
+
await raw(t1, scope, 'DROP TRIGGER _substrat_state_state_docs_born');
|
|
511
|
+
const t = `rt_${ulid().toLowerCase()}`;
|
|
512
|
+
const err = await errOf(as.alice.invoke('state/sql', { sql: `CREATE TABLE ${t} (id TEXT)` }));
|
|
513
|
+
expect(String(err.message)).toMatch(/without its born trigger/);
|
|
514
|
+
expect(await as.alice.invoke('state/sql', { sql: `SELECT name FROM sqlite_master WHERE name = '${t}'` })).toEqual([]);
|
|
515
|
+
// Put it back exactly as the kernel derives it, and the same DDL runs.
|
|
516
|
+
await raw(t1, scope, `CREATE TRIGGER _substrat_state_state_docs_born BEFORE INSERT ON state_docs WHEN NEW._substrat_archived_at IS NOT NULL OR NEW._substrat_trashed_at IS NOT NULL BEGIN SELECT RAISE(ABORT, 'a row is never inserted archived or trashed - ctx.archive and ctx.trash move it (#119)'); END`);
|
|
517
|
+
await as.alice.invoke('state/sql', { sql: `CREATE TABLE ${t} (id TEXT)` });
|
|
518
|
+
await as.alice.invoke('state/sql', { sql: `DROP TABLE ${t}` });
|
|
519
|
+
});
|
|
520
|
+
// -- the indexes -------------------------------------------------------------------------
|
|
521
|
+
const planOf = (view, extra = {}) => as.alice.invoke('state/explain', { ...(view ? { view } : {}), ...extra });
|
|
522
|
+
it('walks each view on its own PARTIAL index, never a table scan', async () => {
|
|
523
|
+
const active = (await planOf()).join(' | ');
|
|
524
|
+
expect(active).toMatch(/USING (COVERING )?INDEX _substrat_list_test_state_stdoc_title\b/);
|
|
525
|
+
expect(active).not.toMatch(/SCAN state_docs\b(?! USING)/);
|
|
526
|
+
expect((await planOf('archived')).join(' | ')).toMatch(/INDEX _substrat_list_test_state_stdoc_title_archived\b/);
|
|
527
|
+
expect((await planOf('trashed')).join(' | ')).toMatch(/INDEX _substrat_list_test_state_stdoc_title_trashed\b/);
|
|
528
|
+
expect((await planOf(undefined, { filters: { owner: 'o1' } })).join(' | ')).toMatch(/INDEX _substrat_list_test_state_stdoc_owner_title\b/);
|
|
529
|
+
// An archive-only entity: one column, one-term predicate, still partial.
|
|
530
|
+
expect((await planOf(undefined, { entityType: 'stnote' })).join(' | ')).toMatch(/INDEX _substrat_list_test_state_stnote_title\b/);
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=entity-state-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-state-suite.js","sourceRoot":"","sources":["../src/entity-state-suite.ts"],"names":[],"mappings":"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"}
|