@@ -7,19 +7,21 @@ import { STATE, HEADS, TRACE, OBJECT_ID, READ_ONLY, FROZEN } from "./constants"
7
7
import { AutomergeValue , Text , Counter } from "./types"
8
8
export { AutomergeValue , Text , Counter , Int , Uint , Float64 } from "./types"
9
9
10
- import { type API } from "@automerge/automerge-wasm" ;
10
+ import { type API , type Patch } from "@automerge/automerge-wasm" ;
11
11
import { ApiHandler , UseApi } from "./low_level"
12
12
13
13
import { Actor as ActorId , Prop , ObjID , Change , DecodedChange , Heads , Automerge , MaterializeValue } from "@automerge/automerge-wasm"
14
14
import { JsSyncState as SyncState , SyncMessage , DecodedSyncMessage } from "@automerge/automerge-wasm"
15
15
16
- export type ChangeOptions = { message ?: string , time ?: number , patchCallback ?: Function }
17
- export type ApplyOptions = { patchCallback ?: Function }
16
+ export type ChangeOptions < T > = { message ?: string , time ?: number , patchCallback ?: PatchCallback < T > }
17
+ export type ApplyOptions < T > = { patchCallback ?: PatchCallback < T > }
18
18
19
19
export type Doc < T > = { readonly [ P in keyof T ] : T [ P ] }
20
20
21
21
export type ChangeFn < T > = ( doc : T ) => void
22
22
23
+ export type PatchCallback < T > = ( patch : Patch , before : Doc < T > , after : Doc < T > ) => void
24
+
23
25
export interface State < T > {
24
26
change : DecodedChange
25
27
snapshot : T
@@ -32,25 +34,25 @@ export function use(api: API) {
32
34
import * as wasm from "@automerge/automerge-wasm"
33
35
use ( wasm )
34
36
35
- export type InitOptions = {
37
+ export type InitOptions < T > = {
36
38
actor ?: ActorId ,
37
39
freeze ?: boolean ,
38
- patchCallback ?: Function ,
40
+ patchCallback ?: PatchCallback < T > ,
39
41
} ;
40
42
41
43
42
- interface InternalState {
44
+ interface InternalState < T > {
43
45
handle : Automerge ,
44
46
heads : Heads | undefined ,
45
47
freeze : boolean ,
46
- patchCallback : Function | undefined ,
48
+ patchCallback ?: PatchCallback < T >
47
49
}
48
50
49
51
export function getBackend < T > ( doc : Doc < T > ) : Automerge {
50
52
return _state ( doc ) . handle
51
53
}
52
54
53
- function _state < T > ( doc : Doc < T > , checkroot = true ) : InternalState {
55
+ function _state < T > ( doc : Doc < T > , checkroot = true ) : InternalState < T > {
54
56
const state = Reflect . get ( doc , STATE )
55
57
if ( state === undefined || ( checkroot && _obj ( doc ) !== "_root" ) ) {
56
58
throw new RangeError ( "must be the document root" )
@@ -90,15 +92,15 @@ function _readonly<T>(doc: Doc<T>) : boolean {
90
92
return Reflect . get ( doc , READ_ONLY ) !== false
91
93
}
92
94
93
- function importOpts ( _actor ?: ActorId | InitOptions ) : InitOptions {
95
+ function importOpts < T > ( _actor ?: ActorId | InitOptions < T > ) : InitOptions < T > {
94
96
if ( typeof _actor === 'object' ) {
95
97
return _actor
96
98
} else {
97
99
return { actor : _actor }
98
100
}
99
101
}
100
102
101
- export function init < T > ( _opts ?: ActorId | InitOptions ) : Doc < T > {
103
+ export function init < T > ( _opts ?: ActorId | InitOptions < T > ) : Doc < T > {
102
104
let opts = importOpts ( _opts )
103
105
let freeze = ! ! opts . freeze
104
106
let patchCallback = opts . patchCallback
@@ -131,7 +133,7 @@ export function from<T extends Record<string, unknown>>(initialState: T | Doc<T>
131
133
return change ( init ( actor ) , ( d ) => Object . assign ( d , initialState ) )
132
134
}
133
135
134
- export function change < T > ( doc : Doc < T > , options : string | ChangeOptions | ChangeFn < T > , callback ?: ChangeFn < T > ) : Doc < T > {
136
+ export function change < T > ( doc : Doc < T > , options : string | ChangeOptions < T > | ChangeFn < T > , callback ?: ChangeFn < T > ) : Doc < T > {
135
137
if ( typeof options === 'function' ) {
136
138
return _change ( doc , { } , options )
137
139
} else if ( typeof callback === 'function' ) {
@@ -144,7 +146,7 @@ export function change<T>(doc: Doc<T>, options: string | ChangeOptions | ChangeF
144
146
}
145
147
}
146
148
147
- function progressDocument < T > ( doc : Doc < T > , heads : Heads , callback ?: Function ) : Doc < T > {
149
+ function progressDocument < T > ( doc : Doc < T > , heads : Heads , callback ?: PatchCallback < T > ) : Doc < T > {
148
150
let state = _state ( doc )
149
151
let nextState = { ... state , heads : undefined } ;
150
152
// @ts -ignore
@@ -154,7 +156,7 @@ function progressDocument<T>(doc: Doc<T>, heads: Heads, callback?: Function): Do
154
156
return nextDoc
155
157
}
156
158
157
- function _change < T > ( doc : Doc < T > , options : ChangeOptions , callback : ChangeFn < T > ) : Doc < T > {
159
+ function _change < T > ( doc : Doc < T > , options : ChangeOptions < T > , callback : ChangeFn < T > ) : Doc < T > {
158
160
159
161
160
162
if ( typeof callback !== "function" ) {
@@ -192,7 +194,7 @@ function _change<T>(doc: Doc<T>, options: ChangeOptions, callback: ChangeFn<T>):
192
194
}
193
195
}
194
196
195
- export function emptyChange < T > ( doc : Doc < T > , options : ChangeOptions ) {
197
+ export function emptyChange < T > ( doc : Doc < T > , options : ChangeOptions < T > ) {
196
198
if ( options === undefined ) {
197
199
options = { }
198
200
}
@@ -214,7 +216,7 @@ export function emptyChange<T>(doc: Doc<T>, options: ChangeOptions) {
214
216
return progressDocument ( doc , heads )
215
217
}
216
218
217
- export function load < T > ( data : Uint8Array , _opts ?: ActorId | InitOptions ) : Doc < T > {
219
+ export function load < T > ( data : Uint8Array , _opts ?: ActorId | InitOptions < T > ) : Doc < T > {
218
220
const opts = importOpts ( _opts )
219
221
const actor = opts . actor
220
222
const patchCallback = opts . patchCallback
@@ -320,7 +322,7 @@ export function getAllChanges<T>(doc: Doc<T>) : Change[] {
320
322
return state . handle . getChanges ( [ ] )
321
323
}
322
324
323
- export function applyChanges < T > ( doc : Doc < T > , changes : Change [ ] , opts ?: ApplyOptions ) : [ Doc < T > ] {
325
+ export function applyChanges < T > ( doc : Doc < T > , changes : Change [ ] , opts ?: ApplyOptions < T > ) : [ Doc < T > ] {
324
326
const state = _state ( doc )
325
327
if ( ! opts ) { opts = { } }
326
328
if ( state . heads ) {
@@ -378,7 +380,7 @@ export function generateSyncMessage<T>(doc: Doc<T>, inState: SyncState) : [ Sync
378
380
return [ outState , message ]
379
381
}
380
382
381
- export function receiveSyncMessage < T > ( doc : Doc < T > , inState : SyncState , message : SyncMessage , opts ?: ApplyOptions ) : [ Doc < T > , SyncState , null ] {
383
+ export function receiveSyncMessage < T > ( doc : Doc < T > , inState : SyncState , message : SyncMessage , opts ?: ApplyOptions < T > ) : [ Doc < T > , SyncState , null ] {
382
384
const syncState = ApiHandler . importSyncState ( inState )
383
385
if ( ! opts ) { opts = { } }
384
386
const state = _state ( doc )
0 commit comments