@haverstack/core 0.1.0 → 0.2.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/access.d.ts +25 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +54 -0
- package/dist/access.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/stack.d.ts +122 -3
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js +270 -9
- package/dist/stack.js.map +1 -1
- package/dist/testing.d.ts +52 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +121 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +30 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/package.json +12 -7
- package/LICENSE +0 -7
package/dist/access.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack — Permission Resolution
|
|
3
|
+
* -------------------------------------------------------
|
|
4
|
+
* Implements the Permissions model from the spec: a pure predicate over a
|
|
5
|
+
* Record's `permissions` field, with no dependency on a transport layer or
|
|
6
|
+
* storage backend. Used by ScopedStack (see stack.ts) to enforce access
|
|
7
|
+
* control; exported standalone for callers that want the raw predicate.
|
|
8
|
+
*/
|
|
9
|
+
import type { RecordId, StackRecord } from './types.js';
|
|
10
|
+
export type AccessMode = 'read' | 'write';
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a Record by ID. Used to walk a `_group` Record's associations for
|
|
13
|
+
* membership checks without requiring a full StackAdapter.
|
|
14
|
+
*/
|
|
15
|
+
export type RecordResolver = (id: RecordId) => Promise<StackRecord | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Check whether an entity has read or write access to a Record.
|
|
18
|
+
*
|
|
19
|
+
* - No permissions (absent/empty): owner only.
|
|
20
|
+
* - public: anyone can read; write still requires an explicit grant.
|
|
21
|
+
* - entity: direct entityId match.
|
|
22
|
+
* - group: walk the _group Record's relationship associations for membership.
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkAccess(record: StackRecord, requesterEntityId: string | null, ownerEntityId: string | null, mode: AccessMode, resolveRecord: RecordResolver): Promise<boolean>;
|
|
25
|
+
//# sourceMappingURL=access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAE3E;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAAC,OAAO,CAAC,CA2BlB"}
|
package/dist/access.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack — Permission Resolution
|
|
3
|
+
* -------------------------------------------------------
|
|
4
|
+
* Implements the Permissions model from the spec: a pure predicate over a
|
|
5
|
+
* Record's `permissions` field, with no dependency on a transport layer or
|
|
6
|
+
* storage backend. Used by ScopedStack (see stack.ts) to enforce access
|
|
7
|
+
* control; exported standalone for callers that want the raw predicate.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Check whether an entity has read or write access to a Record.
|
|
11
|
+
*
|
|
12
|
+
* - No permissions (absent/empty): owner only.
|
|
13
|
+
* - public: anyone can read; write still requires an explicit grant.
|
|
14
|
+
* - entity: direct entityId match.
|
|
15
|
+
* - group: walk the _group Record's relationship associations for membership.
|
|
16
|
+
*/
|
|
17
|
+
export async function checkAccess(record, requesterEntityId, ownerEntityId, mode, resolveRecord) {
|
|
18
|
+
// Owner always has full access.
|
|
19
|
+
if (requesterEntityId && requesterEntityId === ownerEntityId)
|
|
20
|
+
return true;
|
|
21
|
+
const perms = record.permissions;
|
|
22
|
+
// No permissions = private.
|
|
23
|
+
if (!perms || perms.length === 0)
|
|
24
|
+
return false;
|
|
25
|
+
for (const p of perms) {
|
|
26
|
+
if (p.access === 'public' && mode === 'read')
|
|
27
|
+
return true;
|
|
28
|
+
if (p.access === 'entity' && p.entityId === requesterEntityId) {
|
|
29
|
+
if (mode === 'read' && p.read)
|
|
30
|
+
return true;
|
|
31
|
+
if (mode === 'write' && p.write)
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (p.access === 'group' && requesterEntityId) {
|
|
35
|
+
const member = await isGroupMember(p.groupId, requesterEntityId, resolveRecord);
|
|
36
|
+
if (member) {
|
|
37
|
+
if (mode === 'read' && p.read)
|
|
38
|
+
return true;
|
|
39
|
+
if (mode === 'write' && p.write)
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
async function isGroupMember(groupRecordId, entityId, resolveRecord) {
|
|
47
|
+
const group = await resolveRecord(groupRecordId);
|
|
48
|
+
if (!group)
|
|
49
|
+
return false;
|
|
50
|
+
return (group.associations ?? []).some((a) => a.kind === 'relationship' &&
|
|
51
|
+
(a.label === 'member' || a.label === 'admin') &&
|
|
52
|
+
a.recordId === entityId);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAmB,EACnB,iBAAgC,EAChC,aAA4B,EAC5B,IAAgB,EAChB,aAA6B;IAE7B,gCAAgC;IAChC,IAAI,iBAAiB,IAAI,iBAAiB,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAE1E,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IAEjC,4BAA4B;IAC5B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAE1D,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YAC9D,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC3C,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,iBAAiB,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAChF,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;oBAAE,OAAO,IAAI,CAAC;gBAC3C,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,aAAuB,EACvB,QAAgB,EAChB,aAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,cAAc;QACzB,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;QAC7C,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC1B,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
* Storage adapters are published as separate packages:
|
|
8
8
|
* @haverstack/adapter-sqlite
|
|
9
9
|
*/
|
|
10
|
-
export { Stack, StackValidationError, StackMigrationError } from './stack.js';
|
|
11
|
-
export type { CreateRecordOptions, GetRecordOptions, DeleteRecordOptions } from './stack.js';
|
|
12
|
-
export
|
|
10
|
+
export { Stack, ScopedStack, StackValidationError, StackMigrationError, StackPermissionError, StackNotFoundError, } from './stack.js';
|
|
11
|
+
export type { StackClient, CreateRecordOptions, GetRecordOptions, DeleteRecordOptions, } from './stack.js';
|
|
12
|
+
export { checkAccess } from './access.js';
|
|
13
|
+
export type { AccessMode, RecordResolver } from './access.js';
|
|
14
|
+
export type { RecordId, TypeId, FileId, AttachmentMeta, StackRecord, RecordVersion, StackType, TypeSchema, FieldDef, ScalarFieldDef, ArrayFieldDef, ObjectFieldDef, ScalarFieldKind, Association, TagAssociation, AttachmentAssociation, RelationshipAssociation, Permission, StackQuery, RecordFilter, QuerySort, QueryResult, DateRange, Migration, MigrationFn, AdapterCapabilities, StackFeatures, StackAdapter, EntityContent, AppContent, GroupContent, GrantAction, GrantContent, } from './types.js';
|
|
13
15
|
export { SYSTEM_TYPES } from './types.js';
|
|
14
16
|
export { generateId, crockford32Encode, crockford32Decode } from './id.js';
|
|
15
17
|
export { hashSchema, isCompatible, parseTypeId, buildTypeId } from './schema.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG9D,YAAY,EACV,QAAQ,EACR,MAAM,EACN,MAAM,EACN,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,EACV,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
* Storage adapters are published as separate packages:
|
|
8
8
|
* @haverstack/adapter-sqlite
|
|
9
9
|
*/
|
|
10
|
-
// Core class
|
|
11
|
-
export { Stack, StackValidationError, StackMigrationError } from './stack.js';
|
|
10
|
+
// Core class and client interface
|
|
11
|
+
export { Stack, ScopedStack, StackValidationError, StackMigrationError, StackPermissionError, StackNotFoundError, } from './stack.js';
|
|
12
|
+
// Permissions
|
|
13
|
+
export { checkAccess } from './access.js';
|
|
12
14
|
export { SYSTEM_TYPES } from './types.js';
|
|
13
15
|
// Utilities
|
|
14
16
|
export { generateId, crockford32Encode, crockford32Decode } from './id.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kCAAkC;AAClC,OAAO,EACL,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAQpB,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAwC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY;AACZ,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/stack.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* Apps should never talk to a StackAdapter directly.
|
|
15
15
|
*/
|
|
16
16
|
import type { ValidationError } from './validate.js';
|
|
17
|
-
import type { StackRecord, StackType, TypeSchema, TypeId, StackAdapter, StackQuery, QueryResult, Association, Permission, Migration, RecordVersion,
|
|
17
|
+
import type { StackRecord, StackType, TypeSchema, TypeId, StackAdapter, StackQuery, QueryResult, Association, Permission, Migration, RecordVersion, StackFeatures, GrantAction } from './types.js';
|
|
18
18
|
export type CreateRecordOptions = {
|
|
19
19
|
parentId?: string;
|
|
20
20
|
entityId?: string;
|
|
@@ -40,7 +40,36 @@ export declare class StackValidationError extends Error {
|
|
|
40
40
|
export declare class StackMigrationError extends Error {
|
|
41
41
|
constructor(message: string);
|
|
42
42
|
}
|
|
43
|
-
|
|
43
|
+
/** Thrown by ScopedStack when a requester lacks permission for the operation. */
|
|
44
|
+
export declare class StackPermissionError extends Error {
|
|
45
|
+
constructor(message?: string);
|
|
46
|
+
}
|
|
47
|
+
/** Thrown when a record (or specific version) does not exist. */
|
|
48
|
+
export declare class StackNotFoundError extends Error {
|
|
49
|
+
constructor(message: string);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The app-facing record API, implemented by both Stack and ScopedStack.
|
|
53
|
+
* Accept this type in plugin or extension code to remain adapter-agnostic
|
|
54
|
+
* and work equally well with a full Stack or a permission-scoped view.
|
|
55
|
+
*/
|
|
56
|
+
export interface StackClient {
|
|
57
|
+
readonly features: StackFeatures;
|
|
58
|
+
create<T extends Record<string, unknown> = Record<string, unknown>>(typeId: TypeId, content: T, opts?: CreateRecordOptions): Promise<StackRecord & {
|
|
59
|
+
content: T;
|
|
60
|
+
}>;
|
|
61
|
+
get(id: string, opts?: GetRecordOptions): Promise<StackRecord | null>;
|
|
62
|
+
query(query?: StackQuery): Promise<QueryResult>;
|
|
63
|
+
update(id: string, content: Record<string, unknown | null>): Promise<StackRecord>;
|
|
64
|
+
associate(id: string, association: Association): Promise<void>;
|
|
65
|
+
dissociate(id: string, association: Association): Promise<void>;
|
|
66
|
+
setPermissions(id: string, permissions: Permission[]): Promise<void>;
|
|
67
|
+
delete(id: string, opts?: DeleteRecordOptions): Promise<void>;
|
|
68
|
+
getVersions(id: string): Promise<RecordVersion[]>;
|
|
69
|
+
getVersion(id: string, version: number): Promise<RecordVersion | null>;
|
|
70
|
+
restoreVersion(id: string, version: number): Promise<StackRecord>;
|
|
71
|
+
}
|
|
72
|
+
export declare class Stack implements StackClient {
|
|
44
73
|
private readonly adapter;
|
|
45
74
|
readonly ownerEntityId: string | null;
|
|
46
75
|
readonly timezone: string;
|
|
@@ -52,7 +81,20 @@ export declare class Stack {
|
|
|
52
81
|
* stack-level configuration.
|
|
53
82
|
*/
|
|
54
83
|
static create(adapter: StackAdapter): Promise<Stack>;
|
|
55
|
-
get
|
|
84
|
+
get features(): StackFeatures;
|
|
85
|
+
/**
|
|
86
|
+
* Get a permission-scoped view of this Stack, as if the request came from
|
|
87
|
+
* the given entity. Pass null for an anonymous/unauthenticated requester.
|
|
88
|
+
* Reads and writes are checked against each Record's `permissions`; the
|
|
89
|
+
* owner always has full access.
|
|
90
|
+
*
|
|
91
|
+
* Plain Stack methods are unscoped and skip permission checks entirely —
|
|
92
|
+
* correct for single-entity embedded use, where there's no requester
|
|
93
|
+
* distinct from the app itself. Use asEntity() when one Stack instance
|
|
94
|
+
* serves requests from multiple, possibly untrusted, entities (e.g. a
|
|
95
|
+
* multi-tenant API server).
|
|
96
|
+
*/
|
|
97
|
+
asEntity(entityId: string | null): ScopedStack;
|
|
56
98
|
/**
|
|
57
99
|
* Define and persist a new Type. Computes the schemaHash automatically.
|
|
58
100
|
* Should be called at app startup before creating any records of this type.
|
|
@@ -182,6 +224,83 @@ export declare class Stack {
|
|
|
182
224
|
* Safe to call even if the adapter has no resources to release.
|
|
183
225
|
*/
|
|
184
226
|
close(): Promise<void>;
|
|
227
|
+
/**
|
|
228
|
+
* Create _grant records that allow entities to call ScopedStack.create()
|
|
229
|
+
* for specific record types. Pass null as entityId for a default grant
|
|
230
|
+
* that applies to any authenticated entity.
|
|
231
|
+
*
|
|
232
|
+
* The _grant@1 type is defined automatically on first use.
|
|
233
|
+
*/
|
|
234
|
+
grant(entityId: string | null, grants: Array<{
|
|
235
|
+
actions: GrantAction[];
|
|
236
|
+
typeId: TypeId;
|
|
237
|
+
}>): Promise<StackRecord[]>;
|
|
238
|
+
private seedSystemTypes;
|
|
185
239
|
private saveVersion;
|
|
186
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* A permission-enforcing view of a Stack for a single requester. Obtained
|
|
243
|
+
* via `stack.asEntity(entityId)` — see there for when to use it.
|
|
244
|
+
*
|
|
245
|
+
* Read methods return null for a Record that doesn't exist, and throw
|
|
246
|
+
* StackPermissionError for one that exists but isn't readable by the requester.
|
|
247
|
+
* Write methods throw StackNotFoundError for a missing Record and
|
|
248
|
+
* StackPermissionError for one that exists but isn't writable. This lets
|
|
249
|
+
* callers distinguish "not found" from "forbidden".
|
|
250
|
+
*/
|
|
251
|
+
export declare class ScopedStack implements StackClient {
|
|
252
|
+
private readonly stack;
|
|
253
|
+
private readonly requesterEntityId;
|
|
254
|
+
constructor(stack: Stack, requesterEntityId: string | null);
|
|
255
|
+
get features(): StackFeatures;
|
|
256
|
+
private resolveRecord;
|
|
257
|
+
private checkRead;
|
|
258
|
+
private checkWrite;
|
|
259
|
+
/**
|
|
260
|
+
* Check whether the requester holds a _grant record covering at least one
|
|
261
|
+
* of the given actions for the given type. For -own actions, additionally
|
|
262
|
+
* requires that `record.entityId` matches the requester (authorship check).
|
|
263
|
+
* Anonymous requesters always return false.
|
|
264
|
+
*/
|
|
265
|
+
private hasGrant;
|
|
266
|
+
private canRead;
|
|
267
|
+
private checkCreateGrant;
|
|
268
|
+
/** Fetch a record the requester can update (via permissions or an update grant), or throw. */
|
|
269
|
+
private requireUpdatable;
|
|
270
|
+
/** Fetch a record the requester can delete (via permissions or a delete grant), or throw. */
|
|
271
|
+
private requireDeletable;
|
|
272
|
+
/**
|
|
273
|
+
* Create a new record on behalf of the authenticated requester.
|
|
274
|
+
* Requires either an entity-specific _grant or a default _grant for
|
|
275
|
+
* the target type. Anonymous requesters (null entityId) are always denied.
|
|
276
|
+
* The created record's entityId is always set to the requester.
|
|
277
|
+
*/
|
|
278
|
+
create<T extends Record<string, unknown> = Record<string, unknown>>(typeId: TypeId, content: T, opts?: CreateRecordOptions): Promise<StackRecord & {
|
|
279
|
+
content: T;
|
|
280
|
+
}>;
|
|
281
|
+
get(id: string, opts?: GetRecordOptions): Promise<StackRecord | null>;
|
|
282
|
+
/**
|
|
283
|
+
* Query records, filtered to only those the requester can read.
|
|
284
|
+
*
|
|
285
|
+
* Pagination is filtered-then-refilled: each adapter page is fetched in
|
|
286
|
+
* full and entirely evaluated before deciding whether to fetch another,
|
|
287
|
+
* so the returned page may overshoot `limit` slightly, but never skips a
|
|
288
|
+
* record that shared a page with the one that crossed the threshold (the
|
|
289
|
+
* adapter's cursor can't address a position mid-page).
|
|
290
|
+
*
|
|
291
|
+
* `total` is always null — see the QueryResult.total doc comment.
|
|
292
|
+
*
|
|
293
|
+
* Grant records are pre-fetched once before the pagination loop so read
|
|
294
|
+
* grants don't trigger a separate _grant@1 query per record.
|
|
295
|
+
*/
|
|
296
|
+
query(query?: StackQuery): Promise<QueryResult>;
|
|
297
|
+
update(id: string, content: Record<string, unknown | null>): Promise<StackRecord>;
|
|
298
|
+
associate(id: string, association: Association): Promise<void>;
|
|
299
|
+
dissociate(id: string, association: Association): Promise<void>;
|
|
300
|
+
setPermissions(id: string, permissions: Permission[]): Promise<void>;
|
|
301
|
+
delete(id: string, opts?: DeleteRecordOptions): Promise<void>;
|
|
302
|
+
getVersions(id: string): Promise<RecordVersion[]>;
|
|
303
|
+
getVersion(id: string, version: number): Promise<RecordVersion | null>;
|
|
304
|
+
restoreVersion(id: string, version: number): Promise<StackRecord>;
|
|
305
|
+
}
|
|
187
306
|
//# sourceMappingURL=stack.d.ts.map
|
package/dist/stack.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"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"}
|
package/dist/stack.js
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
import { generateId } from './id.js';
|
|
17
17
|
import { hashSchema, isCompatible, parseTypeId } from './schema.js';
|
|
18
18
|
import { validateContent } from './validate.js';
|
|
19
|
+
import { checkAccess } from './access.js';
|
|
20
|
+
import { SYSTEM_TYPES } from './types.js';
|
|
19
21
|
export class StackValidationError extends Error {
|
|
20
22
|
errors;
|
|
21
23
|
constructor(errors) {
|
|
@@ -30,6 +32,20 @@ export class StackMigrationError extends Error {
|
|
|
30
32
|
this.name = 'StackMigrationError';
|
|
31
33
|
}
|
|
32
34
|
}
|
|
35
|
+
/** Thrown by ScopedStack when a requester lacks permission for the operation. */
|
|
36
|
+
export class StackPermissionError extends Error {
|
|
37
|
+
constructor(message = 'Permission denied') {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = 'StackPermissionError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Thrown when a record (or specific version) does not exist. */
|
|
43
|
+
export class StackNotFoundError extends Error {
|
|
44
|
+
constructor(message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = 'StackNotFoundError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
33
49
|
// -------------------------------------------------------
|
|
34
50
|
// Stack class
|
|
35
51
|
// -------------------------------------------------------
|
|
@@ -51,11 +67,28 @@ export class Stack {
|
|
|
51
67
|
static async create(adapter) {
|
|
52
68
|
const entityId = await adapter.getConfig('entity_id');
|
|
53
69
|
const timezone = (await adapter.getConfig('timezone')) ?? 'UTC';
|
|
54
|
-
|
|
70
|
+
const stack = new Stack(adapter, entityId, timezone);
|
|
71
|
+
await stack.seedSystemTypes();
|
|
72
|
+
return stack;
|
|
55
73
|
}
|
|
56
|
-
get
|
|
74
|
+
get features() {
|
|
57
75
|
return this.adapter.capabilities;
|
|
58
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Get a permission-scoped view of this Stack, as if the request came from
|
|
79
|
+
* the given entity. Pass null for an anonymous/unauthenticated requester.
|
|
80
|
+
* Reads and writes are checked against each Record's `permissions`; the
|
|
81
|
+
* owner always has full access.
|
|
82
|
+
*
|
|
83
|
+
* Plain Stack methods are unscoped and skip permission checks entirely —
|
|
84
|
+
* correct for single-entity embedded use, where there's no requester
|
|
85
|
+
* distinct from the app itself. Use asEntity() when one Stack instance
|
|
86
|
+
* serves requests from multiple, possibly untrusted, entities (e.g. a
|
|
87
|
+
* multi-tenant API server).
|
|
88
|
+
*/
|
|
89
|
+
asEntity(entityId) {
|
|
90
|
+
return new ScopedStack(this, entityId);
|
|
91
|
+
}
|
|
59
92
|
// -------------------------------------------------------
|
|
60
93
|
// Types
|
|
61
94
|
// -------------------------------------------------------
|
|
@@ -216,9 +249,7 @@ export class Stack {
|
|
|
216
249
|
content,
|
|
217
250
|
version: 1,
|
|
218
251
|
...(opts.parentId && { parentId: opts.parentId }),
|
|
219
|
-
...(opts.entityId
|
|
220
|
-
? { entityId: opts.entityId }
|
|
221
|
-
: this.ownerEntityId && { entityId: this.ownerEntityId }),
|
|
252
|
+
...(opts.entityId && { entityId: opts.entityId }),
|
|
222
253
|
...(opts.appId && { appId: opts.appId }),
|
|
223
254
|
...(opts.permissions?.length && { permissions: opts.permissions }),
|
|
224
255
|
...(opts.associations?.length && { associations: opts.associations }),
|
|
@@ -278,7 +309,7 @@ export class Stack {
|
|
|
278
309
|
async update(id, content) {
|
|
279
310
|
const existing = await this.adapter.getRecord(id);
|
|
280
311
|
if (!existing) {
|
|
281
|
-
throw new
|
|
312
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
282
313
|
}
|
|
283
314
|
// Resolve the latest type version and migrate existing content
|
|
284
315
|
// in memory before applying the patch. This is when lazy migration
|
|
@@ -335,7 +366,7 @@ export class Stack {
|
|
|
335
366
|
async setPermissions(id, permissions) {
|
|
336
367
|
const existing = await this.adapter.getRecord(id);
|
|
337
368
|
if (!existing) {
|
|
338
|
-
throw new
|
|
369
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
339
370
|
}
|
|
340
371
|
await this.adapter.updateRecord(id, { permissions });
|
|
341
372
|
}
|
|
@@ -369,11 +400,11 @@ export class Stack {
|
|
|
369
400
|
async restoreVersion(id, version) {
|
|
370
401
|
const existing = await this.adapter.getRecord(id);
|
|
371
402
|
if (!existing) {
|
|
372
|
-
throw new
|
|
403
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
373
404
|
}
|
|
374
405
|
const target = await this.adapter.getVersion(id, version);
|
|
375
406
|
if (!target) {
|
|
376
|
-
throw new
|
|
407
|
+
throw new StackNotFoundError(`Version ${version} not found for record "${id}"`);
|
|
377
408
|
}
|
|
378
409
|
// Snapshot current state before restoring
|
|
379
410
|
await this.saveVersion(existing);
|
|
@@ -414,8 +445,44 @@ export class Stack {
|
|
|
414
445
|
await this.adapter.close?.();
|
|
415
446
|
}
|
|
416
447
|
// -------------------------------------------------------
|
|
448
|
+
// Grants
|
|
449
|
+
// -------------------------------------------------------
|
|
450
|
+
/**
|
|
451
|
+
* Create _grant records that allow entities to call ScopedStack.create()
|
|
452
|
+
* for specific record types. Pass null as entityId for a default grant
|
|
453
|
+
* that applies to any authenticated entity.
|
|
454
|
+
*
|
|
455
|
+
* The _grant@1 type is defined automatically on first use.
|
|
456
|
+
*/
|
|
457
|
+
async grant(entityId, grants) {
|
|
458
|
+
const records = [];
|
|
459
|
+
for (const g of grants) {
|
|
460
|
+
records.push(await this.create(`${SYSTEM_TYPES.GRANT}@1`, { typeId: g.typeId, actions: g.actions }, entityId ? { entityId } : {}));
|
|
461
|
+
}
|
|
462
|
+
return records;
|
|
463
|
+
}
|
|
464
|
+
// -------------------------------------------------------
|
|
417
465
|
// Private helpers
|
|
418
466
|
// -------------------------------------------------------
|
|
467
|
+
async seedSystemTypes() {
|
|
468
|
+
await this.defineType(`${SYSTEM_TYPES.ENTITY}@1`, 'Entity', {
|
|
469
|
+
name: { kind: 'string', required: true },
|
|
470
|
+
handle: { kind: 'string' },
|
|
471
|
+
});
|
|
472
|
+
await this.defineType(`${SYSTEM_TYPES.APP}@1`, 'App', {
|
|
473
|
+
name: { kind: 'string', required: true },
|
|
474
|
+
version: { kind: 'string' },
|
|
475
|
+
});
|
|
476
|
+
await this.defineType(`${SYSTEM_TYPES.GROUP}@1`, 'Group', {
|
|
477
|
+
name: { kind: 'string', required: true },
|
|
478
|
+
handle: { kind: 'string' },
|
|
479
|
+
stackUrl: { kind: 'string' },
|
|
480
|
+
});
|
|
481
|
+
await this.defineType(`${SYSTEM_TYPES.GRANT}@1`, 'Grant', {
|
|
482
|
+
typeId: { kind: 'string', required: true },
|
|
483
|
+
actions: { kind: 'array', items: { kind: 'string' }, required: true },
|
|
484
|
+
});
|
|
485
|
+
}
|
|
419
486
|
async saveVersion(record) {
|
|
420
487
|
const version = {
|
|
421
488
|
version: record.version,
|
|
@@ -426,4 +493,198 @@ export class Stack {
|
|
|
426
493
|
await this.adapter.saveVersion(record.id, version);
|
|
427
494
|
}
|
|
428
495
|
}
|
|
496
|
+
// -------------------------------------------------------
|
|
497
|
+
// ScopedStack
|
|
498
|
+
// -------------------------------------------------------
|
|
499
|
+
/** Default page size used to fill a permission-filtered query result. */
|
|
500
|
+
const DEFAULT_QUERY_LIMIT = 50;
|
|
501
|
+
/**
|
|
502
|
+
* A permission-enforcing view of a Stack for a single requester. Obtained
|
|
503
|
+
* via `stack.asEntity(entityId)` — see there for when to use it.
|
|
504
|
+
*
|
|
505
|
+
* Read methods return null for a Record that doesn't exist, and throw
|
|
506
|
+
* StackPermissionError for one that exists but isn't readable by the requester.
|
|
507
|
+
* Write methods throw StackNotFoundError for a missing Record and
|
|
508
|
+
* StackPermissionError for one that exists but isn't writable. This lets
|
|
509
|
+
* callers distinguish "not found" from "forbidden".
|
|
510
|
+
*/
|
|
511
|
+
export class ScopedStack {
|
|
512
|
+
stack;
|
|
513
|
+
requesterEntityId;
|
|
514
|
+
constructor(stack, requesterEntityId) {
|
|
515
|
+
this.stack = stack;
|
|
516
|
+
this.requesterEntityId = requesterEntityId;
|
|
517
|
+
}
|
|
518
|
+
get features() {
|
|
519
|
+
return this.stack.features;
|
|
520
|
+
}
|
|
521
|
+
resolveRecord = (id) => this.stack.get(id, { migrate: false });
|
|
522
|
+
checkRead(record) {
|
|
523
|
+
return checkAccess(record, this.requesterEntityId, this.stack.ownerEntityId, 'read', this.resolveRecord);
|
|
524
|
+
}
|
|
525
|
+
checkWrite(record) {
|
|
526
|
+
return checkAccess(record, this.requesterEntityId, this.stack.ownerEntityId, 'write', this.resolveRecord);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Check whether the requester holds a _grant record covering at least one
|
|
530
|
+
* of the given actions for the given type. For -own actions, additionally
|
|
531
|
+
* requires that `record.entityId` matches the requester (authorship check).
|
|
532
|
+
* Anonymous requesters always return false.
|
|
533
|
+
*/
|
|
534
|
+
async hasGrant(typeId, actions, record, prefetchedGrants) {
|
|
535
|
+
if (!this.requesterEntityId)
|
|
536
|
+
return false;
|
|
537
|
+
let grantRecords;
|
|
538
|
+
if (prefetchedGrants !== undefined) {
|
|
539
|
+
grantRecords = prefetchedGrants;
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
const result = await this.stack.query({
|
|
543
|
+
filter: {
|
|
544
|
+
typeId: `${SYSTEM_TYPES.GRANT}@1`,
|
|
545
|
+
...(this.stack.features.contentFieldQuery && { content: { typeId } }),
|
|
546
|
+
},
|
|
547
|
+
});
|
|
548
|
+
grantRecords = result.records;
|
|
549
|
+
}
|
|
550
|
+
return grantRecords.some((r) => {
|
|
551
|
+
const c = r.content;
|
|
552
|
+
if (c.typeId !== typeId)
|
|
553
|
+
return false;
|
|
554
|
+
if (r.entityId && r.entityId !== this.requesterEntityId)
|
|
555
|
+
return false;
|
|
556
|
+
return actions.some((action) => {
|
|
557
|
+
if (!c.actions.includes(action))
|
|
558
|
+
return false;
|
|
559
|
+
if (action.endsWith('-own'))
|
|
560
|
+
return record?.entityId === this.requesterEntityId;
|
|
561
|
+
return true;
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
async canRead(record, prefetchedGrants) {
|
|
566
|
+
return ((await this.checkRead(record)) ||
|
|
567
|
+
(await this.hasGrant(record.typeId, ['read-own', 'read-any'], record, prefetchedGrants)));
|
|
568
|
+
}
|
|
569
|
+
async checkCreateGrant(typeId) {
|
|
570
|
+
if (this.requesterEntityId === this.stack.ownerEntityId)
|
|
571
|
+
return true;
|
|
572
|
+
return this.hasGrant(typeId, ['create']);
|
|
573
|
+
}
|
|
574
|
+
/** Fetch a record the requester can update (via permissions or an update grant), or throw. */
|
|
575
|
+
async requireUpdatable(id) {
|
|
576
|
+
const record = await this.stack.get(id, { migrate: false });
|
|
577
|
+
if (!record)
|
|
578
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
579
|
+
const allowed = (await this.checkWrite(record)) ||
|
|
580
|
+
(await this.hasGrant(record.typeId, ['update-own', 'update-any'], record));
|
|
581
|
+
if (!allowed)
|
|
582
|
+
throw new StackPermissionError();
|
|
583
|
+
return record;
|
|
584
|
+
}
|
|
585
|
+
/** Fetch a record the requester can delete (via permissions or a delete grant), or throw. */
|
|
586
|
+
async requireDeletable(id) {
|
|
587
|
+
const record = await this.stack.get(id, { migrate: false });
|
|
588
|
+
if (!record)
|
|
589
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
590
|
+
const allowed = (await this.checkWrite(record)) ||
|
|
591
|
+
(await this.hasGrant(record.typeId, ['delete-own', 'delete-any'], record));
|
|
592
|
+
if (!allowed)
|
|
593
|
+
throw new StackPermissionError();
|
|
594
|
+
return record;
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Create a new record on behalf of the authenticated requester.
|
|
598
|
+
* Requires either an entity-specific _grant or a default _grant for
|
|
599
|
+
* the target type. Anonymous requesters (null entityId) are always denied.
|
|
600
|
+
* The created record's entityId is always set to the requester.
|
|
601
|
+
*/
|
|
602
|
+
async create(typeId, content, opts = {}) {
|
|
603
|
+
const requester = this.requesterEntityId;
|
|
604
|
+
if (!requester)
|
|
605
|
+
throw new StackPermissionError('Anonymous requesters cannot create records');
|
|
606
|
+
if (!(await this.checkCreateGrant(typeId))) {
|
|
607
|
+
throw new StackPermissionError(`No create grant for type "${typeId}"`);
|
|
608
|
+
}
|
|
609
|
+
return this.stack.create(typeId, content, { ...opts, entityId: requester });
|
|
610
|
+
}
|
|
611
|
+
async get(id, opts = {}) {
|
|
612
|
+
const record = await this.stack.get(id, opts);
|
|
613
|
+
if (!record)
|
|
614
|
+
return null;
|
|
615
|
+
if (!(await this.canRead(record)))
|
|
616
|
+
throw new StackPermissionError();
|
|
617
|
+
return record;
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Query records, filtered to only those the requester can read.
|
|
621
|
+
*
|
|
622
|
+
* Pagination is filtered-then-refilled: each adapter page is fetched in
|
|
623
|
+
* full and entirely evaluated before deciding whether to fetch another,
|
|
624
|
+
* so the returned page may overshoot `limit` slightly, but never skips a
|
|
625
|
+
* record that shared a page with the one that crossed the threshold (the
|
|
626
|
+
* adapter's cursor can't address a position mid-page).
|
|
627
|
+
*
|
|
628
|
+
* `total` is always null — see the QueryResult.total doc comment.
|
|
629
|
+
*
|
|
630
|
+
* Grant records are pre-fetched once before the pagination loop so read
|
|
631
|
+
* grants don't trigger a separate _grant@1 query per record.
|
|
632
|
+
*/
|
|
633
|
+
async query(query = {}) {
|
|
634
|
+
const limit = query.limit ?? DEFAULT_QUERY_LIMIT;
|
|
635
|
+
const records = [];
|
|
636
|
+
const prefetchedGrants = this.requesterEntityId
|
|
637
|
+
? (await this.stack.query({ filter: { typeId: `${SYSTEM_TYPES.GRANT}@1` } })).records
|
|
638
|
+
: undefined;
|
|
639
|
+
let page = { records: [], cursor: query.cursor ?? null, total: null };
|
|
640
|
+
do {
|
|
641
|
+
page = await this.stack.query({ ...query, cursor: page.cursor ?? undefined });
|
|
642
|
+
for (const record of page.records) {
|
|
643
|
+
if (await this.canRead(record, prefetchedGrants))
|
|
644
|
+
records.push(record);
|
|
645
|
+
}
|
|
646
|
+
} while (records.length < limit && page.cursor);
|
|
647
|
+
return { records, cursor: page.cursor, total: null };
|
|
648
|
+
}
|
|
649
|
+
async update(id, content) {
|
|
650
|
+
await this.requireUpdatable(id);
|
|
651
|
+
return this.stack.update(id, content);
|
|
652
|
+
}
|
|
653
|
+
async associate(id, association) {
|
|
654
|
+
await this.requireUpdatable(id);
|
|
655
|
+
return this.stack.associate(id, association);
|
|
656
|
+
}
|
|
657
|
+
async dissociate(id, association) {
|
|
658
|
+
await this.requireUpdatable(id);
|
|
659
|
+
return this.stack.dissociate(id, association);
|
|
660
|
+
}
|
|
661
|
+
async setPermissions(id, permissions) {
|
|
662
|
+
await this.requireUpdatable(id);
|
|
663
|
+
return this.stack.setPermissions(id, permissions);
|
|
664
|
+
}
|
|
665
|
+
async delete(id, opts = {}) {
|
|
666
|
+
await this.requireDeletable(id);
|
|
667
|
+
return this.stack.delete(id, opts);
|
|
668
|
+
}
|
|
669
|
+
async getVersions(id) {
|
|
670
|
+
const existing = await this.stack.get(id, { migrate: false });
|
|
671
|
+
if (!existing)
|
|
672
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
673
|
+
if (!(await this.canRead(existing)))
|
|
674
|
+
throw new StackPermissionError();
|
|
675
|
+
return this.stack.getVersions(id);
|
|
676
|
+
}
|
|
677
|
+
async getVersion(id, version) {
|
|
678
|
+
const existing = await this.stack.get(id, { migrate: false });
|
|
679
|
+
if (!existing)
|
|
680
|
+
throw new StackNotFoundError(`Record not found: "${id}"`);
|
|
681
|
+
if (!(await this.canRead(existing)))
|
|
682
|
+
throw new StackPermissionError();
|
|
683
|
+
return this.stack.getVersion(id, version);
|
|
684
|
+
}
|
|
685
|
+
async restoreVersion(id, version) {
|
|
686
|
+
await this.requireUpdatable(id);
|
|
687
|
+
return this.stack.restoreVersion(id, version);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
429
690
|
//# sourceMappingURL=stack.js.map
|
package/dist/stack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { StackAdapter, StackRecord, StackType, TypeId, RecordVersion, StackQuery, QueryResult, Association, AdapterCapabilities, AttachmentMeta } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fully functional in-memory StackAdapter with offset-based cursor pagination.
|
|
4
|
+
* Intended for use in tests — import from `@haverstack/core/testing`.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MemoryAdapter implements StackAdapter {
|
|
7
|
+
readonly capabilities: AdapterCapabilities;
|
|
8
|
+
readonly records: Map<string, StackRecord>;
|
|
9
|
+
readonly order: string[];
|
|
10
|
+
readonly versions: Map<string, RecordVersion[]>;
|
|
11
|
+
readonly types: Map<string, StackType>;
|
|
12
|
+
readonly config: Map<string, string>;
|
|
13
|
+
constructor(initialConfig?: Record<string, string>);
|
|
14
|
+
getConfig(key: string): Promise<string | null>;
|
|
15
|
+
setConfig(key: string, value: string): Promise<void>;
|
|
16
|
+
createRecord(record: StackRecord): Promise<StackRecord>;
|
|
17
|
+
getRecord(id: string): Promise<StackRecord | null>;
|
|
18
|
+
updateRecord(id: string, changes: Partial<StackRecord>): Promise<{
|
|
19
|
+
id: import("./types.js").RecordId;
|
|
20
|
+
typeId: TypeId;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
updatedAt: Date;
|
|
23
|
+
content: Record<string, unknown>;
|
|
24
|
+
version: number;
|
|
25
|
+
parentId?: import("./types.js").RecordId;
|
|
26
|
+
entityId?: import("./types.js").RecordId;
|
|
27
|
+
appId?: import("./types.js").RecordId;
|
|
28
|
+
deletedAt?: Date;
|
|
29
|
+
permissions?: import("./types.js").Permission[];
|
|
30
|
+
associations?: Association[];
|
|
31
|
+
}>;
|
|
32
|
+
deleteRecord(id: string, opts?: {
|
|
33
|
+
hard?: boolean;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
/** Cursor is a stringified offset into insertion order. */
|
|
36
|
+
queryRecords(query: StackQuery): Promise<QueryResult>;
|
|
37
|
+
associate(id: string, association: Association): Promise<void>;
|
|
38
|
+
dissociate(id: string, association: Association): Promise<void>;
|
|
39
|
+
getVersions(id: string): Promise<RecordVersion[]>;
|
|
40
|
+
getVersion(id: string, version: number): Promise<RecordVersion | null>;
|
|
41
|
+
saveVersion(id: string, version: RecordVersion): Promise<void>;
|
|
42
|
+
saveType(type: StackType): Promise<void>;
|
|
43
|
+
getType(id: TypeId): Promise<StackType | null>;
|
|
44
|
+
listTypes(): Promise<StackType[]>;
|
|
45
|
+
putAttachment(_data: Uint8Array, _mimeType: string): Promise<string>;
|
|
46
|
+
getAttachment(_fileId: string): Promise<Uint8Array>;
|
|
47
|
+
getAttachmentMeta(_fileId: string): Promise<AttachmentMeta | null>;
|
|
48
|
+
deleteAttachment(_fileId: string): Promise<void>;
|
|
49
|
+
flush?: () => Promise<void>;
|
|
50
|
+
close?: () => Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,MAAM,EACN,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,aAAc,YAAW,YAAY;IAChD,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAIxC;IAEF,QAAQ,CAAC,OAAO,2BAAkC;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,QAAQ,CAAC,QAAQ,+BAAsC;IACvD,QAAQ,CAAC,KAAK,yBAAgC;IAC9C,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEzB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAIhD,SAAS,CAAC,GAAG,EAAE,MAAM;IAGrB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIpC,YAAY,CAAC,MAAM,EAAE,WAAW;IAMhC,SAAS,CAAC,EAAE,EAAE,MAAM;IAIpB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC;;;;;;;;;;;;;;IAQtD,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAO;IAU5D,2DAA2D;IACrD,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBrD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAO9C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAS/C,WAAW,CAAC,EAAE,EAAE,MAAM;IAGtB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAGtC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAK9C,QAAQ,CAAC,IAAI,EAAE,SAAS;IAGxB,OAAO,CAAC,EAAE,EAAE,MAAM;IAGlB,SAAS;IAIT,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM;IAGlD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAGnD,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAGlE,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAEtC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fully functional in-memory StackAdapter with offset-based cursor pagination.
|
|
3
|
+
* Intended for use in tests — import from `@haverstack/core/testing`.
|
|
4
|
+
*/
|
|
5
|
+
export class MemoryAdapter {
|
|
6
|
+
capabilities = {
|
|
7
|
+
fullTextSearch: false,
|
|
8
|
+
contentFieldQuery: false,
|
|
9
|
+
sortableFields: ['createdAt', 'updatedAt', 'version'],
|
|
10
|
+
};
|
|
11
|
+
records = new Map();
|
|
12
|
+
order = [];
|
|
13
|
+
versions = new Map();
|
|
14
|
+
types = new Map();
|
|
15
|
+
config;
|
|
16
|
+
constructor(initialConfig = {}) {
|
|
17
|
+
this.config = new Map(Object.entries(initialConfig));
|
|
18
|
+
}
|
|
19
|
+
async getConfig(key) {
|
|
20
|
+
return this.config.get(key) ?? null;
|
|
21
|
+
}
|
|
22
|
+
async setConfig(key, value) {
|
|
23
|
+
this.config.set(key, value);
|
|
24
|
+
}
|
|
25
|
+
async createRecord(record) {
|
|
26
|
+
this.records.set(record.id, { ...record });
|
|
27
|
+
this.order.push(record.id);
|
|
28
|
+
return record;
|
|
29
|
+
}
|
|
30
|
+
async getRecord(id) {
|
|
31
|
+
return this.records.get(id) ?? null;
|
|
32
|
+
}
|
|
33
|
+
async updateRecord(id, changes) {
|
|
34
|
+
const existing = this.records.get(id);
|
|
35
|
+
if (!existing)
|
|
36
|
+
throw new Error(`Not found: ${id}`);
|
|
37
|
+
const updated = { ...existing, ...changes };
|
|
38
|
+
this.records.set(id, updated);
|
|
39
|
+
return updated;
|
|
40
|
+
}
|
|
41
|
+
async deleteRecord(id, opts = {}) {
|
|
42
|
+
if (opts.hard) {
|
|
43
|
+
this.records.delete(id);
|
|
44
|
+
this.order.splice(this.order.indexOf(id), 1);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const record = this.records.get(id);
|
|
48
|
+
if (record)
|
|
49
|
+
this.records.set(id, { ...record, deletedAt: new Date() });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Cursor is a stringified offset into insertion order. */
|
|
53
|
+
async queryRecords(query) {
|
|
54
|
+
const f = query.filter ?? {};
|
|
55
|
+
let results = this.order.map((id) => this.records.get(id));
|
|
56
|
+
if (!f.includeDeleted)
|
|
57
|
+
results = results.filter((r) => !r.deletedAt);
|
|
58
|
+
if (f.typeId) {
|
|
59
|
+
const ids = Array.isArray(f.typeId) ? f.typeId : [f.typeId];
|
|
60
|
+
results = results.filter((r) => ids.includes(r.typeId));
|
|
61
|
+
}
|
|
62
|
+
if (f.parentId !== undefined) {
|
|
63
|
+
results =
|
|
64
|
+
f.parentId === null
|
|
65
|
+
? results.filter((r) => !r.parentId)
|
|
66
|
+
: results.filter((r) => r.parentId === f.parentId);
|
|
67
|
+
}
|
|
68
|
+
const limit = query.limit ?? 50;
|
|
69
|
+
const start = query.cursor ? Number(query.cursor) : 0;
|
|
70
|
+
const page = results.slice(start, start + limit);
|
|
71
|
+
const nextStart = start + limit;
|
|
72
|
+
const cursor = nextStart < results.length ? String(nextStart) : null;
|
|
73
|
+
return { records: page, cursor, total: results.length };
|
|
74
|
+
}
|
|
75
|
+
async associate(id, association) {
|
|
76
|
+
const record = this.records.get(id);
|
|
77
|
+
if (!record)
|
|
78
|
+
throw new Error(`Not found: ${id}`);
|
|
79
|
+
const assocs = record.associations ?? [];
|
|
80
|
+
this.records.set(id, { ...record, associations: [...assocs, association] });
|
|
81
|
+
}
|
|
82
|
+
async dissociate(id, association) {
|
|
83
|
+
const record = this.records.get(id);
|
|
84
|
+
if (!record)
|
|
85
|
+
throw new Error(`Not found: ${id}`);
|
|
86
|
+
const assocs = (record.associations ?? []).filter((a) => !(a.kind === association.kind && a.label === association.label));
|
|
87
|
+
this.records.set(id, { ...record, associations: assocs });
|
|
88
|
+
}
|
|
89
|
+
async getVersions(id) {
|
|
90
|
+
return this.versions.get(id) ?? [];
|
|
91
|
+
}
|
|
92
|
+
async getVersion(id, version) {
|
|
93
|
+
return (this.versions.get(id) ?? []).find((v) => v.version === version) ?? null;
|
|
94
|
+
}
|
|
95
|
+
async saveVersion(id, version) {
|
|
96
|
+
const existing = this.versions.get(id) ?? [];
|
|
97
|
+
this.versions.set(id, [...existing, version]);
|
|
98
|
+
}
|
|
99
|
+
async saveType(type) {
|
|
100
|
+
this.types.set(type.id, type);
|
|
101
|
+
}
|
|
102
|
+
async getType(id) {
|
|
103
|
+
return this.types.get(id) ?? null;
|
|
104
|
+
}
|
|
105
|
+
async listTypes() {
|
|
106
|
+
return [...this.types.values()];
|
|
107
|
+
}
|
|
108
|
+
async putAttachment(_data, _mimeType) {
|
|
109
|
+
return 'file-123';
|
|
110
|
+
}
|
|
111
|
+
async getAttachment(_fileId) {
|
|
112
|
+
return new Uint8Array();
|
|
113
|
+
}
|
|
114
|
+
async getAttachmentMeta(_fileId) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
async deleteAttachment(_fileId) { }
|
|
118
|
+
flush;
|
|
119
|
+
close;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -131,11 +131,22 @@ export type GroupContent = {
|
|
|
131
131
|
/** If present, this group owns a shared collaborative stack at this URL. Absent = permission-only group. */
|
|
132
132
|
stackUrl?: string;
|
|
133
133
|
};
|
|
134
|
+
/** Actions that can be granted via a _grant record. */
|
|
135
|
+
export type GrantAction = 'create' | 'read-own' | 'read-any' | 'update-own' | 'update-any' | 'delete-own' | 'delete-any';
|
|
136
|
+
/** Content for _grant records */
|
|
137
|
+
export type GrantContent = {
|
|
138
|
+
/** Which record type the grant applies to. */
|
|
139
|
+
typeId: TypeId;
|
|
140
|
+
/** Which actions are permitted. */
|
|
141
|
+
actions: GrantAction[];
|
|
142
|
+
};
|
|
134
143
|
/** Reserved system type IDs */
|
|
135
144
|
export declare const SYSTEM_TYPES: {
|
|
136
145
|
readonly ENTITY: "_entity";
|
|
137
146
|
readonly APP: "_app";
|
|
138
147
|
readonly GROUP: "_group";
|
|
148
|
+
/** Creation-permission grants. See GrantContent. */
|
|
149
|
+
readonly GRANT: "_grant";
|
|
139
150
|
};
|
|
140
151
|
export type DateRange = {
|
|
141
152
|
before?: Date;
|
|
@@ -154,6 +165,7 @@ export type RecordFilter = {
|
|
|
154
165
|
recordId: RecordId;
|
|
155
166
|
label?: string;
|
|
156
167
|
};
|
|
168
|
+
attachmentFileId?: FileId;
|
|
157
169
|
content?: Record<string, unknown>;
|
|
158
170
|
search?: string;
|
|
159
171
|
includeDeleted?: boolean;
|
|
@@ -171,7 +183,14 @@ export type StackQuery = {
|
|
|
171
183
|
export type QueryResult = {
|
|
172
184
|
records: StackRecord[];
|
|
173
185
|
cursor: string | null;
|
|
174
|
-
|
|
186
|
+
/**
|
|
187
|
+
* Total count of matching records, ignoring pagination. `null` when the
|
|
188
|
+
* count cannot be reported without leaking information across a
|
|
189
|
+
* permission boundary — e.g. a permission-scoped query (see
|
|
190
|
+
* `Stack.asEntity()`) never reports an unfiltered total, since that would
|
|
191
|
+
* reveal the existence/cardinality of records the requester can't read.
|
|
192
|
+
*/
|
|
193
|
+
total: number | null;
|
|
175
194
|
};
|
|
176
195
|
export type MigrationFn = (content: Record<string, unknown>) => Record<string, unknown>;
|
|
177
196
|
export type Migration = {
|
|
@@ -184,6 +203,14 @@ export type AdapterCapabilities = {
|
|
|
184
203
|
contentFieldQuery: boolean;
|
|
185
204
|
sortableFields: Array<QuerySort['field']>;
|
|
186
205
|
};
|
|
206
|
+
/** What a Stack can do, as seen by app and plugin code. */
|
|
207
|
+
export type StackFeatures = AdapterCapabilities;
|
|
208
|
+
export type AttachmentMeta = {
|
|
209
|
+
mimeType: string;
|
|
210
|
+
size: number;
|
|
211
|
+
createdAt: Date;
|
|
212
|
+
filename?: string;
|
|
213
|
+
};
|
|
187
214
|
/**
|
|
188
215
|
* Every storage backend implements this interface.
|
|
189
216
|
* The Stack class is a thin orchestration layer on top.
|
|
@@ -207,9 +234,10 @@ export interface StackAdapter {
|
|
|
207
234
|
saveType(type: StackType): Promise<void>;
|
|
208
235
|
getType(id: TypeId): Promise<StackType | null>;
|
|
209
236
|
listTypes(): Promise<StackType[]>;
|
|
210
|
-
putAttachment(data: Uint8Array, mimeType: string): Promise<FileId>;
|
|
237
|
+
putAttachment(data: Uint8Array, mimeType: string, filename?: string): Promise<FileId>;
|
|
211
238
|
getAttachment(fileId: FileId): Promise<Uint8Array>;
|
|
212
239
|
deleteAttachment(fileId: FileId): Promise<void>;
|
|
240
|
+
getAttachmentMeta(fileId: FileId): Promise<AttachmentMeta | null>;
|
|
213
241
|
flush?(): Promise<void>;
|
|
214
242
|
close?(): Promise<void>;
|
|
215
243
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmMH,+BAA+B;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,QAAQ;IACf,oDAAoD;IACpD,KAAK,EAAE,QAAQ;CACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haverstack/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Core library for Haverstack — portable personal data stack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
8
8
|
"import": "./dist/index.js",
|
|
9
9
|
"types": "./dist/index.d.ts"
|
|
10
|
+
},
|
|
11
|
+
"./testing": {
|
|
12
|
+
"import": "./dist/testing.js",
|
|
13
|
+
"types": "./dist/testing.d.ts"
|
|
10
14
|
}
|
|
11
15
|
},
|
|
12
16
|
"main": "./dist/index.js",
|
|
@@ -28,15 +32,16 @@
|
|
|
28
32
|
"records",
|
|
29
33
|
"portable"
|
|
30
34
|
],
|
|
31
|
-
"devDependencies": {
|
|
32
|
-
"@types/node": "^22.0.0",
|
|
33
|
-
"typescript": "^5.5.0",
|
|
34
|
-
"vitest": "^2.0.0"
|
|
35
|
-
},
|
|
36
35
|
"scripts": {
|
|
36
|
+
"prepublishOnly": "pnpm run build",
|
|
37
37
|
"build": "tsc -p tsconfig.build.json",
|
|
38
38
|
"test": "vitest run",
|
|
39
39
|
"typecheck": "tsc --noEmit",
|
|
40
40
|
"lint": "eslint src tests"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.0.0",
|
|
44
|
+
"typescript": "^5.5.0",
|
|
45
|
+
"vitest": "^2.0.0"
|
|
41
46
|
}
|
|
42
|
-
}
|
|
47
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
|
|
2
|
-
|
|
3
|
-
To the extent possible under law, the Haverstack contributors have waived all
|
|
4
|
-
copyright and related or neighboring rights to Haverstack. This work is
|
|
5
|
-
published from the United States.
|
|
6
|
-
|
|
7
|
-
https://creativecommons.org/publicdomain/zero/1.0/
|