@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.
@@ -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 type { RecordId, TypeId, FileId, StackRecord, RecordVersion, StackType, TypeSchema, FieldDef, ScalarFieldDef, ArrayFieldDef, ObjectFieldDef, ScalarFieldKind, Association, TagAssociation, AttachmentAssociation, RelationshipAssociation, Permission, StackQuery, RecordFilter, QuerySort, QueryResult, DateRange, Migration, MigrationFn, AdapterCapabilities, StackAdapter, EntityContent, AppContent, GroupContent, } from './types.js';
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAG7F,YAAY,EACV,QAAQ,EACR,MAAM,EACN,MAAM,EACN,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,YAAY,EACZ,aAAa,EACb,UAAU,EACV,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"}
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,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAoC9E,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"}
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, AdapterCapabilities } from './types.js';
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
- export declare class Stack {
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 capabilities(): AdapterCapabilities;
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
@@ -1 +1 @@
1
- {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"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"}
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
- return new Stack(adapter, entityId, timezone);
70
+ const stack = new Stack(adapter, entityId, timezone);
71
+ await stack.seedSystemTypes();
72
+ return stack;
55
73
  }
56
- get capabilities() {
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 Error(`Record not found: "${id}"`);
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 Error(`Record not found: "${id}"`);
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 Error(`Record not found: "${id}"`);
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 Error(`Version ${version} not found for record "${id}"`);
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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA6ChD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACjB;IAA5B,YAA4B,MAAyB;QACnD,KAAK,CACH,8BAA8B,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3F,CAAC;QAHwB,WAAM,GAAN,MAAM,CAAmB;QAInD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,0DAA0D;AAC1D,cAAc;AACd,0DAA0D;AAE1D,MAAM,OAAO,KAAK;IAIG;IACR;IACA;IALM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE3D,YACmB,OAAqB,EAC7B,aAA4B,EAC5B,QAAgB;QAFR,YAAO,GAAP,OAAO,CAAc;QAC7B,kBAAa,GAAb,aAAa,CAAe;QAC5B,aAAQ,GAAR,QAAQ,CAAQ;IACxB,CAAC;IAEJ;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAqB;QACvC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC;QAChE,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,0DAA0D;IAC1D,QAAQ;IACR,0DAA0D;IAE1D;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,EAAU,EACV,IAAY,EACZ,MAAkB,EAClB,OAA0B,EAAE;QAE5B,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,2BAA2B,EAAE,wEAAwE,CACtG,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAc;YACtB,EAAE;YACF,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI;YACJ,MAAM;YACN,UAAU;YACV,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;SAC9D,CAAC;QAEF,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,cAA0B;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnD,CAAC;IAED,0DAA0D;IAC1D,qBAAqB;IACrB,0DAA0D;IAE1D;;;;;;;OAOG;IACH,iBAAiB,CAAC,SAAoB;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,SAAS,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,MAAc,EAAE,IAAY;QACvD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;QAEjD,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,MAAM,CAAC;QAErB,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,MAAc;QACjC,IAAI,OAAO,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEpF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,mBAAmB,CAC3B,yDAAyD,UAAU,GAAG,CACvE,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,MAAM,KAAK,QAAQ;gBAAE,SAAS;YAElC,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,IAAI,MAA0B,CAAC;YAC/B,GAAG,CAAC;gBACF,MAAM,MAAM,GAAgB,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;oBAC1D,MAAM,EAAE,EAAE,MAAM,EAAE;oBAClB,KAAK,EAAE,GAAG;oBACV,MAAM;iBACP,CAAC,CAAC;gBAEH,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC/B,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAClD,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE;wBACzC,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,eAAe;wBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC;qBAC5B,CAAC,CAAC;oBACH,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAED,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;YACtC,CAAC,QAAQ,MAAM,EAAE;QACnB,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,0DAA0D;IAC1D,UAAU;IACV,0DAA0D;IAE1D;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,MAAc,EACd,OAAU,EACV,OAA4B,EAAE;QAE9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,6BAA6B,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAgB;YAC1B,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM;YACN,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,OAAO;YACP,OAAO,EAAE,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,QAAQ;gBACf,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;gBAC7B,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YAClE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;SACtE,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAA0C,CAAC;IACpF,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,OAAyB,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;QAC7C,IAAI,CAAC,aAAa;YAAE,OAAO,MAAM,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC;QAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,mCAAmC,MAAM,CAAC,MAAM,SAAS,QAAQ,iBAAiB,EAAE,KAAK;gBACvF,2EAA2E,CAC9E,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;SACnC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAAuC;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,+DAA+D;QAC/D,mEAAmE;QACnE,qCAAqC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC3E,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEnF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,kBAAkB,YAAY,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,MAAM,GAA4B,EAAE,GAAG,eAAe,EAAE,CAAC;QAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,mDAAmD;QACnD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE;YACnC,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,WAAwB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,WAAwB;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,WAAyB;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAA4B,EAAE;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,QAAoB,EAAE;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,0DAA0D;IAC1D,WAAW;IACX,0DAA0D;IAE1D,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,OAAe;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,OAAe;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,0BAA0B,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;QAED,0CAA0C;QAC1C,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,0DAA0D;IAC1D,cAAc;IACd,0DAA0D;IAE1D,KAAK,CAAC,aAAa,CAAC,IAAgB,EAAE,QAAgB;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,0DAA0D;IAC1D,YAAY;IACZ,0DAA0D;IAE1D;;;;;OAKG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC/B,CAAC;IAED,0DAA0D;IAC1D,kBAAkB;IAClB,0DAA0D;IAElD,KAAK,CAAC,WAAW,CAAC,MAAmB;QAC3C,MAAM,OAAO,GAAkB;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;SACtD,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACF"}
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"}
@@ -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
- total: number;
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
  }
@@ -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
@@ -9,5 +9,7 @@ export const SYSTEM_TYPES = {
9
9
  ENTITY: '_entity',
10
10
  APP: '_app',
11
11
  GROUP: '_group',
12
+ /** Creation-permission grants. See GrantContent. */
13
+ GRANT: '_grant',
12
14
  };
13
15
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiLH,+BAA+B;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,QAAQ;CACP,CAAC"}
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.1.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/