From 2d072d81fb19e92510a28dcdb6636e8aac5347a4 Mon Sep 17 00:00:00 2001 From: Alex Good Date: Sat, 8 Oct 2022 19:00:38 +0100 Subject: [PATCH] Add TypeScript type for PatchCallback --- automerge-js/src/index.ts | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/automerge-js/src/index.ts b/automerge-js/src/index.ts index 635c328a6..3a5316c9f 100644 --- a/automerge-js/src/index.ts +++ b/automerge-js/src/index.ts @@ -7,19 +7,21 @@ import { STATE, HEADS, TRACE, OBJECT_ID, READ_ONLY, FROZEN } from "./constants" import { AutomergeValue, Text, Counter } from "./types" export { AutomergeValue, Text, Counter, Int, Uint, Float64 } from "./types" -import { type API } from "@automerge/automerge-wasm"; +import { type API, type Patch } from "@automerge/automerge-wasm"; import { ApiHandler, UseApi } from "./low_level" import { Actor as ActorId, Prop, ObjID, Change, DecodedChange, Heads, Automerge, MaterializeValue } from "@automerge/automerge-wasm" import { JsSyncState as SyncState, SyncMessage, DecodedSyncMessage } from "@automerge/automerge-wasm" -export type ChangeOptions = { message?: string, time?: number, patchCallback?: Function } -export type ApplyOptions = { patchCallback?: Function } +export type ChangeOptions = { message?: string, time?: number, patchCallback?: PatchCallback } +export type ApplyOptions = { patchCallback?: PatchCallback } export type Doc = { readonly [P in keyof T]: T[P] } export type ChangeFn = (doc: T) => void +export type PatchCallback = (patch: Patch, before: Doc, after: Doc) => void + export interface State { change: DecodedChange snapshot: T @@ -32,25 +34,25 @@ export function use(api: API) { import * as wasm from "@automerge/automerge-wasm" use(wasm) -export type InitOptions = { +export type InitOptions = { actor?: ActorId, freeze?: boolean, - patchCallback?: Function, + patchCallback?: PatchCallback, }; -interface InternalState { +interface InternalState { handle: Automerge, heads: Heads | undefined, freeze: boolean, - patchCallback: Function | undefined, + patchCallback?: PatchCallback } export function getBackend(doc: Doc) : Automerge { return _state(doc).handle } -function _state(doc: Doc, checkroot = true) : InternalState { +function _state(doc: Doc, checkroot = true) : InternalState { const state = Reflect.get(doc,STATE) if (state === undefined || (checkroot && _obj(doc) !== "_root")) { throw new RangeError("must be the document root") @@ -90,7 +92,7 @@ function _readonly(doc: Doc) : boolean { return Reflect.get(doc,READ_ONLY) !== false } -function importOpts(_actor?: ActorId | InitOptions) : InitOptions { +function importOpts(_actor?: ActorId | InitOptions) : InitOptions { if (typeof _actor === 'object') { return _actor } else { @@ -98,7 +100,7 @@ function importOpts(_actor?: ActorId | InitOptions) : InitOptions { } } -export function init(_opts?: ActorId | InitOptions) : Doc{ +export function init(_opts?: ActorId | InitOptions) : Doc{ let opts = importOpts(_opts) let freeze = !!opts.freeze let patchCallback = opts.patchCallback @@ -131,7 +133,7 @@ export function from>(initialState: T | Doc return change(init(actor), (d) => Object.assign(d, initialState)) } -export function change(doc: Doc, options: string | ChangeOptions | ChangeFn, callback?: ChangeFn): Doc { +export function change(doc: Doc, options: string | ChangeOptions | ChangeFn, callback?: ChangeFn): Doc { if (typeof options === 'function') { return _change(doc, {}, options) } else if (typeof callback === 'function') { @@ -144,7 +146,7 @@ export function change(doc: Doc, options: string | ChangeOptions | ChangeF } } -function progressDocument(doc: Doc, heads: Heads, callback?: Function): Doc { +function progressDocument(doc: Doc, heads: Heads, callback?: PatchCallback): Doc { let state = _state(doc) let nextState = { ... state, heads: undefined }; // @ts-ignore @@ -154,7 +156,7 @@ function progressDocument(doc: Doc, heads: Heads, callback?: Function): Do return nextDoc } -function _change(doc: Doc, options: ChangeOptions, callback: ChangeFn): Doc { +function _change(doc: Doc, options: ChangeOptions, callback: ChangeFn): Doc { if (typeof callback !== "function") { @@ -192,7 +194,7 @@ function _change(doc: Doc, options: ChangeOptions, callback: ChangeFn): } } -export function emptyChange(doc: Doc, options: ChangeOptions) { +export function emptyChange(doc: Doc, options: ChangeOptions) { if (options === undefined) { options = {} } @@ -214,7 +216,7 @@ export function emptyChange(doc: Doc, options: ChangeOptions) { return progressDocument(doc, heads) } -export function load(data: Uint8Array, _opts?: ActorId | InitOptions) : Doc { +export function load(data: Uint8Array, _opts?: ActorId | InitOptions) : Doc { const opts = importOpts(_opts) const actor = opts.actor const patchCallback = opts.patchCallback @@ -320,7 +322,7 @@ export function getAllChanges(doc: Doc) : Change[] { return state.handle.getChanges([]) } -export function applyChanges(doc: Doc, changes: Change[], opts?: ApplyOptions) : [Doc] { +export function applyChanges(doc: Doc, changes: Change[], opts?: ApplyOptions) : [Doc] { const state = _state(doc) if (!opts) { opts = {} } if (state.heads) { @@ -378,7 +380,7 @@ export function generateSyncMessage(doc: Doc, inState: SyncState) : [ Sync return [ outState, message ] } -export function receiveSyncMessage(doc: Doc, inState: SyncState, message: SyncMessage, opts?: ApplyOptions) : [ Doc, SyncState, null ] { +export function receiveSyncMessage(doc: Doc, inState: SyncState, message: SyncMessage, opts?: ApplyOptions) : [ Doc, SyncState, null ] { const syncState = ApiHandler.importSyncState(inState) if (!opts) { opts = {} } const state = _state(doc)