// Type definitions for json-patch
// Project: https://github.com/bruth/jsonpatch-js
// Definitions by: vvakame <https://github.com/vvakame>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped

declare namespace jsonpatch {
    type OpPatch = AddPatch | RemovePatch | ReplacePatch | MovePatch | CopyPatch | TestPatch;
    interface Patch {
        path: string;
    }
    interface AddPatch extends Patch {
        op: 'add';
        value: any;
    }
    interface RemovePatch extends Patch {
        op: 'remove';
    }
    interface ReplacePatch extends Patch {
        op: 'replace';
        value: any;
    }
    interface MovePatch extends Patch {
        op: 'move';
        from: string;
    }
    interface CopyPatch extends Patch {
        op: 'copy';
        from: string;
    }
    interface TestPatch extends Patch {
        op: 'test';
        value: any;
    }

    function apply(document: any, patches: OpPatch[]): any;
    function compile(patches: OpPatch[]): (document: any) => any;

    class JSONPatchError extends Error { }
    class InvalidPointerError extends Error { }
    class InvalidPatchError extends JSONPatchError { }
    class PatchConflictError extends JSONPatchError { }
    class PatchTestFailed extends Error { }
}

export = jsonpatch;
export as namespace jsonpatch;
