{"version":3,"file":"index.mjs","sources":["../src/action.ts","../src/event/index.ts","../src/utils/id.ts","../src/graph/components/node.ts","../src/graph/graph-slice.ts","../src/graph/provenance-graph.ts","../src/provenance/trrack-events.ts","../src/provenance/trrack.ts","../src/registry/reg.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type PayloadAction<\n    Payload = void,\n    Type extends string = string,\n    Meta = never,\n    Error = never\n> = {\n    payload: Payload;\n    type: Type;\n} & ([Meta] extends [never] ? unknown : { meta: Meta })\n    & ([Error] extends [never] ? unknown : { error: Error });\n\ntype ActionLike = {\n    type: string;\n};\n\nexport type PrepareAction<Payload> =\n    | ((...args: any[]) => { payload: Payload })\n    | ((...args: any[]) => { payload: Payload; meta: any })\n    | ((...args: any[]) => { payload: Payload; error: any })\n    | ((...args: any[]) => { payload: Payload; meta: any; error: any });\n\ntype IsAny<T, True, False = never> = true | false extends (\n    T extends never ? true : false\n)\n    ? True\n    : False;\n\ntype IsUnknown<T, True, False = never> = unknown extends T\n    ? IsAny<T, False, True>\n    : False;\n\ntype IfMaybeUndefined<Payload, True, False> = [undefined] extends [Payload]\n    ? True\n    : False;\n\ntype IfVoid<Payload, True, False> = [void] extends [Payload] ? True : False;\n\ntype IsEmptyObject<T, True, False = never> = T extends unknown\n    ? keyof T extends never\n        ? IsUnknown<T, False, IfMaybeUndefined<T, False, IfVoid<T, False, True>>>\n        : False\n    : never;\n\ntype AtLeastTs35<True, False> = [True, False][IsUnknown<\n    ReturnType<(<T>() => T)>,\n    0,\n    1\n>];\n\ntype IsUnknownOrNonInferrable<T, True, False> = AtLeastTs35<\n    IsUnknown<T, True, False>,\n    IsEmptyObject<T, True, IsUnknown<T, True, False>>\n>;\n\ntype BaseActionCreator<\n    Payload,\n    Type extends string,\n    Meta = never,\n    Error = never\n> = {\n    type: Type;\n    toString(): Type;\n    match(action: unknown): action is PayloadAction<Payload, Type, Meta, Error>;\n};\n\nexport type ActionCreatorWithPayload<\n    Payload,\n    Type extends string = string\n> = BaseActionCreator<Payload, Type> & {\n    (payload: Payload): PayloadAction<Payload, Type>;\n};\n\nexport type ActionCreatorWithOptionalPayload<\n    Payload,\n    Type extends string = string\n> = BaseActionCreator<Payload, Type> & {\n    (payload?: Payload): PayloadAction<Payload, Type>;\n};\n\nexport type ActionCreatorWithoutPayload<\n    Type extends string = string\n> = BaseActionCreator<undefined, Type> & {\n    (noArgument: void): PayloadAction<undefined, Type>;\n};\n\nexport type ActionCreatorWithNonInferrablePayload<\n    Type extends string = string\n> = BaseActionCreator<unknown, Type> & {\n    <Payload>(payload: Payload): PayloadAction<Payload, Type>;\n};\n\nexport type ActionCreatorWithPreparedPayload<\n    Args extends unknown[],\n    Payload,\n    Type extends string = string,\n    Error = never,\n    Meta = never\n> = BaseActionCreator<Payload, Type, Meta, Error> & {\n    (...args: Args): PayloadAction<Payload, Type, Meta, Error>;\n};\n\ntype PreparedPayloadActionCreator<\n    Prepare extends PrepareAction<any>,\n    Type extends string\n> = ActionCreatorWithPreparedPayload<\n    Parameters<Prepare>,\n    ReturnType<Prepare>['payload'],\n    Type,\n    ReturnType<Prepare> extends { error: infer Error } ? Error : never,\n    ReturnType<Prepare> extends { meta: infer Meta } ? Meta : never\n>;\n\ntype _ActionCreatorWithPreparedPayload<\n    Prepare extends PrepareAction<any> | void,\n    Type extends string = string\n> = Prepare extends PrepareAction<any>\n    ? PreparedPayloadActionCreator<Prepare, Type>\n    : void;\n\ntype IfPrepareActionMethodProvided<Prepare, True, False> = Prepare extends (\n    ...args: any[]\n) => any\n    ? True\n    : False;\n\nexport type PayloadActionCreator<\n    Payload = void,\n    Type extends string = string,\n    Prepare extends PrepareAction<Payload> | void = void\n> = IfPrepareActionMethodProvided<\n    Prepare,\n    _ActionCreatorWithPreparedPayload<Prepare, Type>,\n    IsAny<\n        Payload,\n        // `any` must stay explicit here to preserve RTK-compatible payload behavior.\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ActionCreatorWithPayload<any, Type>,\n        IsUnknownOrNonInferrable<\n            Payload,\n            ActionCreatorWithNonInferrablePayload<Type>,\n            IfVoid<\n                Payload,\n                ActionCreatorWithoutPayload<Type>,\n                IfMaybeUndefined<\n                    Payload,\n                    ActionCreatorWithOptionalPayload<Payload, Type>,\n                    ActionCreatorWithPayload<Payload, Type>\n                >\n            >\n        >\n    >\n>;\n\nexport function createAction<Payload = void, Type extends string = string>(\n    type: Type\n): PayloadActionCreator<Payload, Type>;\nexport function createAction<\n    Prepare extends PrepareAction<any>,\n    Type extends string = string\n>(\n    type: Type,\n    prepareAction: Prepare\n): PayloadActionCreator<ReturnType<Prepare>['payload'], Type, Prepare>;\nexport function createAction(type: string, prepareAction?: PrepareAction<any>) {\n    const actionCreator = ((...args: unknown[]) => {\n        if (prepareAction) {\n            return {\n                ...prepareAction(...args),\n                type,\n            };\n        }\n\n        return {\n            payload: args[0],\n            type,\n        };\n    }) as PayloadActionCreator<unknown, string>;\n\n    actionCreator.type = type;\n    actionCreator.toString = () => type;\n    actionCreator.match = (\n        action: unknown\n    ): action is PayloadAction<unknown, string> =>\n        typeof action === 'object'\n        && action !== null\n        && 'type' in action\n        && (action as ActionLike).type === type;\n\n    return actionCreator;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function initEventManager() {\n    const eventsMap = new Map<string, Array<(args: any) => void>>();\n\n    return {\n        listen(event: string, listener: (args: any) => void) {\n            if (!eventsMap.has(event)) eventsMap.set(event, []);\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            eventsMap.get(event)!.push(listener);\n\n            return () => {\n                eventsMap.set(\n                    event,\n                    (eventsMap.get(event) || []).filter((e) => e !== listener)\n                );\n            };\n        },\n        fire(event: string, args?: any) {\n            const events = eventsMap.get(event);\n\n            if (events) {\n                events.forEach((e) => e(args));\n            }\n        },\n    };\n}\n","import { v4 as uuid } from 'uuid';\n\n/**\n * Type to add branding flavor\n */\ntype Flavoring<TFlavor> = {\n    _type?: TFlavor;\n};\n\nexport type FlavoredId<TBaseId, TFlavor> = TBaseId & Flavoring<TFlavor>;\n\nexport class ID {\n    private static ids: Map<string, boolean> = new Map();\n\n    static get() {\n        let id = uuid();\n\n        while (this.ids.has(id)) {\n            id = uuid();\n        }\n\n        this.ids.set(id, true);\n\n        return id;\n    }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Operation } from 'fast-json-patch';\nimport { PayloadAction } from '../../action';\n\nimport { FlavoredId, ID } from '../../utils';\n\nexport type NodeId = FlavoredId<string, 'Node'>;\n\ntype Checkpoint<State> = {\n    type: 'checkpoint';\n    val: State;\n};\n\ntype Patches = {\n    type: 'patch';\n    checkpointRef: NodeId;\n    val: Array<Operation>;\n};\n\nexport type StateLike<State> = Checkpoint<State> | Patches;\n\n/**\n * Node Artifact Type\n */\n\n/**\n * Artifact Types\n */\nexport type ArtifactId = FlavoredId<string, 'Artifact'>;\n\nexport type Artifact = {\n    id: ArtifactId;\n    createdOn: number;\n    val: unknown;\n};\n\nexport type NodeArtifact = Array<Artifact>;\n\n/**\n * Node Metadata Type\n */\nexport type MetadataId = FlavoredId<string, 'Metadata'>;\n\nexport type Metadata<T = unknown> = {\n    id: MetadataId;\n    type: string;\n    createdOn: number;\n    val: T;\n};\n\ntype NodeMetadata = {\n    annotation: Array<Metadata<string>>;\n    bookmark: Array<Metadata<boolean>>;\n    [key: string]: Array<Metadata<unknown>>;\n};\n\n/**\n * Node Types\n */\ntype BaseNode<State> = {\n    label: string;\n    id: NodeId;\n    createdOn: number;\n    artifacts: NodeArtifact;\n    meta: NodeMetadata;\n    children: NodeId[];\n    state: StateLike<State>;\n    level: number;\n};\n\nexport type RootNode<State> = BaseNode<State> & { event: 'Root' };\n\nexport type SideEffects = {\n    do: Array<PayloadAction<any, any>>;\n    undo: Array<PayloadAction<any, any>>;\n};\n\nexport type StateNode<State, Event extends string> = BaseNode<State> & {\n    event: Event;\n    parent: NodeId;\n    sideEffects: SideEffects;\n};\n\nexport type ProvenanceNode<State, Event extends string> =\n    | RootNode<State>\n    | StateNode<State, Event>;\n\nexport type Nodes<State, Event extends string> = Record<\n    string,\n    ProvenanceNode<State, Event>\n>;\n\nexport function isStateNode<State, Event extends string>(\n    node: ProvenanceNode<State, Event>\n): node is StateNode<State, Event> {\n    return 'parent' in node;\n}\n\nexport function isRootNode<State, Event extends string>(\n    node: ProvenanceNode<State, Event>\n): node is RootNode<State> {\n    return !isStateNode(node);\n}\n\nexport function createRootNode<State>(args: {\n    state: State;\n    initialMetadata?: Record<string, unknown>;\n    initialArtifact?: unknown;\n    label?: string;\n}): RootNode<State> {\n    const { label = undefined, state, initialArtifact, initialMetadata } = args;\n\n    const commonMetadata: NodeMetadata = {\n        annotation: [],\n        bookmark: [],\n    };\n\n    const meta = Object.keys(initialMetadata || {}).reduce<NodeMetadata>(\n        (acc: NodeMetadata, key) => {\n            acc[key] = [];\n            if (initialMetadata && initialMetadata[key] !== undefined) {\n                acc[key].push({\n                    type: key,\n                    id: ID.get(),\n                    val: initialMetadata[key],\n                    createdOn: Date.now(),\n                });\n            }\n            return acc;\n        },\n        commonMetadata\n    );\n\n    const artifacts = initialArtifact !== undefined\n        ? [\n              {\n                  id: ID.get(),\n                  createdOn: Date.now(),\n                  val: initialArtifact,\n              },\n          ]\n        : [];\n\n    return {\n        id: ID.get(),\n        label: label || 'Root',\n        event: 'Root',\n        children: [],\n        level: 0,\n        createdOn: Date.now(),\n        meta,\n        artifacts,\n        state: {\n            type: 'checkpoint',\n            val: state,\n        },\n    };\n}\n\nexport function createStateNode<State, Event extends string>({\n    parent,\n    state,\n    label,\n    sideEffects = {\n        do: [],\n        undo: [],\n    },\n    initialMetadata,\n    initialArtifact,\n    event,\n}: {\n    parent: ProvenanceNode<State, Event>;\n    state: StateLike<State>;\n    initialMetadata?: Record<string, unknown>;\n    initialArtifact?: unknown;\n    label: string;\n    sideEffects?: SideEffects;\n    event: Event;\n}): StateNode<State, Event> {\n    const commonMetadata: NodeMetadata = {\n        annotation: [],\n        bookmark: [],\n    };\n\n    const meta = Object.keys(initialMetadata || {}).reduce<NodeMetadata>(\n        (acc: NodeMetadata, key) => {\n            acc[key] = [];\n            if (initialMetadata && initialMetadata[key] !== undefined) {\n                acc[key].push({\n                    type: key,\n                    id: ID.get(),\n                    val: initialMetadata[key],\n                    createdOn: Date.now(),\n                });\n            }\n            return acc;\n        },\n        commonMetadata\n    );\n\n    const artifacts = initialArtifact !== undefined\n        ? [\n              {\n                  id: ID.get(),\n                  createdOn: Date.now(),\n                  val: initialArtifact,\n              },\n          ]\n        : [];\n\n    return {\n        id: ID.get(),\n        label,\n        event,\n        children: [],\n        parent: parent.id,\n        createdOn: Date.now(),\n        meta,\n        artifacts,\n        sideEffects,\n        state,\n        level: parent.level + 1,\n    };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport produce, { freeze } from 'immer';\nimport {\n    ActionCreatorWithPayload,\n    createAction,\n} from '../action';\nimport { ID } from '../utils';\nimport { createRootNode, NodeId, Nodes, StateNode } from './components';\n\ntype AddMetadataPayload = {\n    id: NodeId;\n    meta: Record<string, unknown>;\n};\n\ntype AddArtifactPayload = {\n    id: NodeId;\n    artifact: unknown;\n};\n\nexport type ProvenanceGraph<State, Event extends string> = {\n    nodes: Nodes<State, Event>;\n    current: NodeId;\n    root: NodeId;\n};\n\nexport type ProvenanceGraphActions<S, E extends string> = {\n    addMetadata: ActionCreatorWithPayload<\n        AddMetadataPayload,\n        'provenance-graph/addMetadata'\n    >;\n    addArtifact: ActionCreatorWithPayload<\n        AddArtifactPayload,\n        'provenance-graph/addArtifact'\n    >;\n    changeCurrent: ActionCreatorWithPayload<\n        NodeId,\n        'provenance-graph/changeCurrent'\n    >;\n    addNode: ActionCreatorWithPayload<\n        StateNode<S, E>,\n        'provenance-graph/addNode'\n    >;\n    load: ActionCreatorWithPayload<\n        ProvenanceGraph<S, E>,\n        'provenance-graph/load'\n    >;\n};\n\nexport type ProvenanceGraphAction<S, E extends string> = ReturnType<\n    ProvenanceGraphActions<S, E>[keyof ProvenanceGraphActions<S, E>]\n>;\n\ntype PublicGraphSlice<S, E extends string> = {\n    actions: ProvenanceGraphActions<S, E>;\n    getInitialState: () => ProvenanceGraph<S, E>;\n    reduce: (\n        state: ProvenanceGraph<S, E>,\n        action: ProvenanceGraphAction<S, E>\n    ) => ProvenanceGraph<S, E>;\n};\n\n// Maybe swithc to reduxtoolkit createEntityAdapter\n\nexport function graphSliceCreator<State, Event extends string>(\n    initialState: State,\n    args: {\n        artifact?: unknown;\n        metadata?: Record<string, unknown>;\n        rootLabel?: string;\n    } = {}\n): PublicGraphSlice<State, Event> {\n    const {\n        artifact = undefined,\n        metadata = undefined,\n        rootLabel = 'Root',\n    } = args;\n\n    const root = createRootNode<State>({\n        state: initialState,\n        label: rootLabel,\n        initialArtifact: artifact,\n        initialMetadata: metadata,\n    });\n\n    const graph: ProvenanceGraph<State, Event> = {\n        nodes: {\n            [root.id]: root,\n        },\n        root: root.id,\n        current: root.id,\n    };\n\n    const actions: ProvenanceGraphActions<State, Event> = {\n        addMetadata: createAction<\n            AddMetadataPayload,\n            'provenance-graph/addMetadata'\n        >(\n            'provenance-graph/addMetadata'\n        ),\n        addArtifact: createAction<\n            AddArtifactPayload,\n            'provenance-graph/addArtifact'\n        >(\n            'provenance-graph/addArtifact'\n        ),\n        changeCurrent: createAction<\n            NodeId,\n            'provenance-graph/changeCurrent'\n        >('provenance-graph/changeCurrent'),\n        addNode: createAction<\n            StateNode<State, Event>,\n            'provenance-graph/addNode'\n        >(\n            'provenance-graph/addNode'\n        ),\n        load: createAction<\n            ProvenanceGraph<State, Event>,\n            'provenance-graph/load'\n        >(\n            'provenance-graph/load'\n        ),\n    };\n\n    const frozenGraph = freeze(graph, true);\n\n    return {\n        actions,\n        getInitialState: () => frozenGraph,\n        reduce(g, action) {\n            switch (action.type) {\n                case actions.addMetadata.type:\n                    return produce(g, (draft) => {\n                        const { id, meta } = action.payload;\n                        const existingMetadata = draft.nodes[id].meta;\n\n                        const metaData = Object.keys(meta).reduce(\n                            (acc, key) => {\n                                if (!acc[key]) {\n                                    acc[key] = [];\n                                }\n\n                                acc[key].push({\n                                    type: key,\n                                    id: ID.get(),\n                                    val: meta[key],\n                                    createdOn: Date.now(),\n                                });\n\n                                return acc;\n                            },\n                            existingMetadata\n                        );\n\n                        draft.nodes[id].meta = metaData;\n                    });\n                case actions.addArtifact.type:\n                    return produce(g, (draft) => {\n                        draft.nodes[action.payload.id].artifacts.push({\n                            id: ID.get(),\n                            createdOn: Date.now(),\n                            val: action.payload.artifact as any,\n                        });\n                    });\n                case actions.changeCurrent.type:\n                    return produce(g, (draft) => {\n                        draft.current = action.payload;\n                    });\n                case actions.addNode.type:\n                    return produce(g, (draft) => {\n                        const { payload } = action;\n                        draft.nodes[payload.id] = payload as any;\n                        draft.nodes[payload.parent].children.push(payload.id);\n                        draft.current = payload.id;\n                    });\n                case actions.load.type:\n                    return freeze(action.payload, true);\n                default:\n                    return g;\n            }\n        },\n    };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ID } from '../utils';\n\nimport { RootNode } from './components';\nimport {\n    graphSliceCreator,\n    ProvenanceGraphAction,\n} from './graph-slice';\n\nexport type Trigger = 'traversal' | 'new';\n\nexport type CurrentChangeHandler = (trigger?: Trigger) => void;\nexport type CurrentChangeHandlerConfig = {\n    skipOnNew: boolean;\n};\nexport type UnsubscribeCurrentChangeListener = () => boolean;\n\nexport type ProvenanceGraphStore<\n    State = unknown,\n    Event extends string = string\n> = ReturnType<typeof initializeProvenanceGraph<State, Event>>;\n\nexport function initializeProvenanceGraph<State, Event extends string>(\n    initialState: State\n) {\n    const listeners: Map<\n        string,\n        {\n            id: string;\n            func: CurrentChangeHandler;\n            config: CurrentChangeHandlerConfig;\n        }\n    > = new Map();\n\n    const { reduce, actions, getInitialState } = graphSliceCreator<\n        State,\n        Event\n    >(initialState);\n    let state = getInitialState();\n\n    function update(action: ProvenanceGraphAction<State, Event>) {\n        state = reduce(state, action);\n\n        const isTrackedAction =\n            action.type === actions.changeCurrent.type\n            || action.type === actions.addNode.type;\n\n        if (!isTrackedAction) return action;\n\n        listeners.forEach((listener) => {\n            const isNew = action.type === actions.addNode.type;\n            const { skipOnNew } = listener.config;\n\n            if (skipOnNew && isNew) return;\n\n            listener.func(isNew ? 'new' : 'traversal');\n        });\n\n        return action;\n    }\n\n    return {\n        initialState: getInitialState(),\n        get backend() {\n            return state;\n        },\n        get current() {\n            return state.nodes[state.current];\n        },\n        get root() {\n            return state.nodes[state.root] as RootNode<State>;\n        },\n        currentChange(\n            func: CurrentChangeHandler,\n            config: CurrentChangeHandlerConfig\n        ): UnsubscribeCurrentChangeListener {\n            const listener = {\n                id: ID.get(),\n                func,\n                config,\n            };\n            listeners.set(listener.id, listener);\n\n            return () => listeners.delete(listener.id);\n        },\n        update,\n        ...actions,\n    };\n}\n","export enum TrrackEvents {\n    TRAVERSAL_START = 'Traversal_Start',\n    TRAVERSAL_END = 'Traversal_End',\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport jsonPatch from 'fast-json-patch';\nimport type { Operation } from 'fast-json-patch';\nimport { RecordActionArgs, Trrack, TrrackTreeNode } from './types';\nimport { PayloadAction } from '../action';\n\nimport { initEventManager } from '../event';\nimport {\n    createStateNode,\n    CurrentChangeHandler,\n    initializeProvenanceGraph,\n    isStateNode,\n    Metadata,\n    NodeId,\n    Nodes,\n    ProvenanceNode,\n    StateLike,\n    UnsubscribeCurrentChangeListener,\n} from '../graph';\nimport { ProvenanceGraph } from '../graph/graph-slice';\nimport {\n    ProduceWrappedStateChangeFunction,\n    TrrackActionFunction,\n} from '../registry';\nimport { ConfigureTrrackOptions } from './trrack-config-opts';\nimport { TrrackEvents } from './trrack-events';\n\nconst { applyPatch, compare, deepClone } = jsonPatch;\n\nfunction getState<State, Event extends string>(\n    node: ProvenanceNode<State, Event>,\n    nodes: Nodes<State, Event>\n): State {\n    const stateLike = node.state;\n    if (stateLike.type === 'checkpoint') return stateLike.val;\n\n    const { checkpointRef } = stateLike;\n    const checkpointNode = nodes[checkpointRef];\n    const path = getPath(checkpointNode, node, nodes);\n    path.shift();\n    const patches = path\n        .map((p) => nodes[p])\n        .map((n) => n.state.val as Operation[])\n        .reduce((acc, patch) => [...acc, ...patch], []);\n\n    const checkpointState = getState(checkpointNode, nodes);\n\n    const results = applyPatch(\n        checkpointState,\n        deepClone(patches),\n        true,\n        false\n    );\n\n    return results.newDocument;\n}\n\nfunction determineSaveStrategy<T>(\n    state: T,\n    patches: Array<Operation>\n): 'checkpoint' | 'patch' {\n    const objectKeysLength = Object.keys(state as any).length;\n\n    const uniquePatchesLength = new Set(\n        patches.map((patch) => {\n            return patch.path.split('/')[1] ?? '';\n        })\n    ).size;\n\n    if (uniquePatchesLength < objectKeysLength / 2) return 'patch';\n\n    return 'checkpoint';\n}\n\nexport function initializeTrrack<State = any, Event extends string = string>({\n    registry,\n    initialState,\n}: ConfigureTrrackOptions<State, Event>): Trrack<State, Event> {\n    let isTraversing = false;\n    const eventManager = initEventManager();\n    const graph = initializeProvenanceGraph<State, Event>(initialState);\n\n    function getNode(id: NodeId) {\n        return graph.backend.nodes[id];\n    }\n\n    eventManager.listen(TrrackEvents.TRAVERSAL_START, () => {\n        isTraversing = true;\n    });\n\n    eventManager.listen(TrrackEvents.TRAVERSAL_END, () => {\n        isTraversing = false;\n    });\n\n    const metadata = {\n        add(\n            metadata: Record<string, unknown>,\n            node: NodeId = graph.current.id\n        ) {\n            graph.update(\n                graph.addMetadata({\n                    id: node,\n                    meta: metadata,\n                })\n            );\n        },\n        latestOfType<T = unknown>(\n            type: string,\n            node: NodeId = graph.current.id\n        ) {\n            return graph.backend.nodes[node].meta[type]?.at(-1) as\n                | Metadata<T>\n                | undefined;\n        },\n        allOfType<T = unknown>(type: string, node: NodeId = graph.current.id) {\n            return graph.backend.nodes[node].meta[type] as\n                | Metadata<T>[]\n                | undefined;\n        },\n        latest(node: NodeId = graph.current.id) {\n            const metas = graph.backend.nodes[node].meta;\n\n            const latest = Object.keys(metas).reduce(\n                (acc: Record<string, Metadata>, key: string) => {\n                    const data = metas[key].at(-1);\n                    if (data) acc[key] = data;\n                    return acc;\n                },\n                {}\n            );\n\n            return Object.keys(latest).length > 0 ? latest : undefined;\n        },\n        all(node: NodeId = graph.current.id) {\n            return graph.backend.nodes[node].meta;\n        },\n        types(node: NodeId = graph.current.id) {\n            return Object.keys(graph.backend.nodes[node].meta);\n        },\n    };\n\n    const artifact = {\n        add(artifact: unknown, node: NodeId = graph.current.id) {\n            graph.update(\n                graph.addArtifact({\n                    id: node,\n                    artifact,\n                })\n            );\n        },\n        latest(node: NodeId = graph.current.id) {\n            return graph.backend.nodes[node].artifacts.at(-1);\n        },\n        all(node: NodeId = graph.current.id) {\n            return graph.backend.nodes[node].artifacts;\n        },\n    };\n    const annotations = {\n        add(annotation: string, node: NodeId = graph.current.id) {\n            metadata.add({ annotation }, node);\n        },\n        latest(node: NodeId = graph.current.id) {\n            return metadata.latestOfType<string>('annotation', node)?.val;\n        },\n        all(node: NodeId = graph.current.id) {\n            return metadata\n                .allOfType<string>('annotation', node)\n                ?.map((a) => a.val) as string[] | undefined;\n        },\n    };\n    const bookmarks = {\n        add(node: NodeId = graph.current.id) {\n            metadata.add({ bookmark: true }, node);\n        },\n        remove(node: NodeId = graph.current.id) {\n            metadata.add({ bookmark: false }, node);\n        },\n        is(node: NodeId = graph.current.id) {\n            return Boolean(\n                metadata.latestOfType<boolean>('bookmark', node)?.val\n            );\n        },\n        toggle(node: NodeId = graph.current.id) {\n            if (bookmarks.is(node)) bookmarks.remove(node);\n            else bookmarks.add(node);\n        },\n    };\n\n    return {\n        registry,\n        get isTraversing() {\n            return isTraversing;\n        },\n        getState(node: ProvenanceNode<State, Event> = graph.current) {\n            return getState(node, graph.backend.nodes);\n        },\n        graph,\n        get current() {\n            return graph.current;\n        },\n        get root() {\n            return graph.root;\n        },\n        record({\n            label,\n            state,\n            sideEffects,\n            eventType: event,\n            onlySideEffects = false,\n        }: RecordActionArgs<State, Event>) {\n            const originalState: State = getState(\n                this.current,\n                this.graph.backend.nodes\n            );\n\n            const stateToSave: StateLike<State> = onlySideEffects\n                ? {\n                      type: 'checkpoint',\n                      val: state,\n                  }\n                : (() => {\n                      const patches = compare(originalState as any, state as any);\n                      const saveStrategy = determineSaveStrategy(state, patches);\n\n                      if (saveStrategy === 'checkpoint') {\n                          return {\n                              type: 'checkpoint',\n                              val: state,\n                          };\n                      }\n\n                      const lastRef =\n                          this.current.state.type === 'checkpoint'\n                              ? this.current.id\n                              : this.current.state.checkpointRef;\n\n                      return {\n                          type: 'patch',\n                          val: patches,\n                          checkpointRef: lastRef,\n                      };\n                  })();\n\n            const newStateNode = createStateNode({\n                label,\n                state: stateToSave,\n                parent: this.current,\n                sideEffects,\n                event,\n            });\n\n            graph.update(graph.addNode(newStateNode));\n        },\n        async apply<T extends string, Payload = any>(\n            label: string,\n            act: PayloadAction<Payload, T>\n        ) {\n            const action = registry.get(act.type);\n            const originalState = getState(\n                this.current,\n                this.graph.backend.nodes\n            );\n\n            if (action.config.hasSideEffects) {\n                const actionRecord = (action.func as TrrackActionFunction<\n                    any,\n                    any,\n                    any,\n                    any\n                >)(act.payload);\n\n                this.record({\n                    label,\n                    state: originalState,\n                    sideEffects: {\n                        do: [actionRecord.do ?? act],\n                        undo: [actionRecord.undo],\n                    },\n                    eventType: action.config.eventType as Event,\n                });\n            } else {\n                const newState = (\n                    action.func as ProduceWrappedStateChangeFunction<State>\n                )(originalState as State, act.payload);\n\n                this.record({\n                    label,\n                    state: newState,\n                    sideEffects: { do: [], undo: [] },\n                    eventType: action.config.eventType as Event,\n                });\n            }\n        },\n        async to(node: NodeId) {\n            eventManager.fire(TrrackEvents.TRAVERSAL_START);\n\n            const path = getPath(\n                graph.current,\n                graph.backend.nodes[node],\n                graph.backend.nodes\n            );\n\n            const sideEffectsToApply: Array<PayloadAction<any, any>> = [];\n\n            for (let i = 0; i < path.length - 1; ++i) {\n                const currentNode = getNode(path[i]);\n                const nextNode = getNode(path[i + 1]);\n\n                const isUndo = isNextNodeUp(currentNode, nextNode);\n\n                if (isUndo) {\n                    if (isStateNode(currentNode))\n                        sideEffectsToApply.push(\n                            ...currentNode.sideEffects.undo\n                        );\n                } else {\n                    if (isStateNode(nextNode))\n                        sideEffectsToApply.push(...nextNode.sideEffects.do);\n                }\n            }\n\n            for (const sf of sideEffectsToApply) {\n                const actionFunction = registry.get(sf.type)\n                    .func as TrrackActionFunction<any, any, any, any>;\n                await actionFunction(sf.payload);\n            }\n\n            graph.update(graph.changeCurrent(node));\n\n            eventManager.fire(TrrackEvents.TRAVERSAL_END);\n        },\n        undo() {\n            const { current } = graph;\n            if (isStateNode(current)) {\n                return this.to(current.parent);\n            } else {\n                return Promise.resolve(console.warn('Already at root!'));\n            }\n        },\n        redo(to: 'latest' | 'oldest' = 'latest') {\n            const { current } = graph;\n            if (current.children.length > 0) {\n                return this.to(\n                    current.children[\n                        to === 'oldest' ? 0 : current.children.length - 1\n                    ]\n                );\n            } else {\n                return Promise.resolve(\n                    console.warn('Already at latest in this branch!')\n                );\n            }\n        },\n        currentChange(\n            listener: CurrentChangeHandler,\n            skipOnNew = false\n        ): UnsubscribeCurrentChangeListener {\n            return graph.currentChange(listener, {\n                skipOnNew,\n            });\n        },\n        done() {\n            console.log('Setup later for URL sharing.');\n        },\n        tree() {\n            return getTreeFromNode(graph.root, graph.backend.nodes);\n        },\n        on(event: TrrackEvents, listener: (args?: any) => void) {\n            eventManager.listen(event, listener);\n        },\n        export() {\n            return JSON.stringify(graph.backend);\n        },\n        exportObject() {\n            return JSON.parse(\n                JSON.stringify(graph.backend)\n            ) as typeof graph.backend;\n        },\n        import(graphString: string) {\n            const g: ProvenanceGraph<State, Event> = JSON.parse(graphString);\n\n            const current = g.current;\n            g.current = g.root;\n            graph.update(graph.load(g));\n            this.to(current);\n        },\n        importObject(g: typeof graph.backend) {\n            const current = g.current;\n            g.current = g.root;\n            graph.update(graph.load(g));\n            this.to(current);\n        },\n        metadata,\n        artifact,\n        annotations,\n        bookmarks,\n    };\n}\n\nfunction LCA<S>(\n    current: ProvenanceNode<S, any>,\n    destination: ProvenanceNode<S, any>,\n    nodes: Nodes<S, any>\n): NodeId {\n    let [source, target] = [current, destination];\n\n    if (source.level > target.level) {\n        [source, target] = [target, source];\n    }\n\n    let diff = target.level - source.level;\n\n    while (isStateNode(target) && diff !== 0) {\n        target = nodes[target.parent];\n        diff -= 1;\n    }\n\n    if (source.id === target.id) return source.id;\n\n    while (source.id !== target.id) {\n        if (isStateNode(source)) source = nodes[source.parent];\n        if (isStateNode(target)) target = nodes[target.parent];\n    }\n\n    return source.id;\n}\n\nfunction getPath<S>(\n    current: ProvenanceNode<S, any>,\n    destination: ProvenanceNode<S, any>,\n    nodes: Nodes<S, any>\n): Array<NodeId> {\n    const lcaId = LCA(current, destination, nodes);\n    const lca = nodes[lcaId];\n\n    const pathFromSourceToLca: ProvenanceNode<S, any>[] = [];\n    const pathFromDestinationToLca: ProvenanceNode<S, any>[] = [];\n\n    let [source, target] = [current, destination];\n\n    while (source.id !== lca.id) {\n        pathFromSourceToLca.push(source);\n        if (isStateNode(source)) source = nodes[source.parent];\n    }\n\n    pathFromSourceToLca.push(source);\n\n    while (target.id !== lca.id) {\n        pathFromDestinationToLca.push(target);\n        if (isStateNode(target)) target = nodes[target.parent];\n    }\n\n    const reversedPath = pathFromDestinationToLca.reverse();\n\n    return [...pathFromSourceToLca, ...reversedPath].map((node) => node.id);\n}\n\nfunction isNextNodeUp(\n    source: ProvenanceNode<unknown, any>,\n    target: ProvenanceNode<unknown, any>\n): boolean {\n    if (isStateNode(source) && source.parent === target.id) return true;\n    if (isStateNode(target) && target.parent === source.id) return false;\n\n    throw new Error(\n        'Incorrect use of function. Nodes are not connected to each other.'\n    );\n}\n\nfunction getTreeFromNode(\n    node: ProvenanceNode<any, any>,\n    nodes: Nodes<any, any>\n): TrrackTreeNode<any, any> {\n    return {\n        ...node,\n        children: node.children.map((n) => getTreeFromNode(nodes[n], nodes)),\n        name: `${node.label}`,\n    };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport produce, { enablePatches } from 'immer';\nimport { createAction, PayloadActionCreator } from '../action';\n\nimport {\n    Label,\n    LabelGenerator,\n    ProduceWrappedStateChangeFunction,\n    StateChangeFunction,\n    TrrackActionConfig,\n    TrrackActionFunction,\n} from './action';\n\nenablePatches();\n\n\ntype TrrackActionRegisteredObject = {\n    func: TrrackActionFunction<any, any, any, any> | ProduceWrappedStateChangeFunction<any>;\n    config: TrrackActionConfig<any, any>;\n};\n\nfunction prepareAction(action: TrrackActionFunction<any, any, any, any> | StateChangeFunction<any, any>) {\n    return action.length === 2 ? produce(action) as unknown as ProduceWrappedStateChangeFunction<any> : action as TrrackActionFunction<any, any, any, any>;\n}\n\nexport class Registry<Event extends string> {\n    static create<Event extends string>(): Registry<Event> {\n        return new Registry<Event>();\n    }\n\n    private registry: Map<string, TrrackActionRegisteredObject>;\n\n    private constructor() {\n        this.registry = new Map();\n    }\n\n    has(name: string) {\n        return this.registry.has(name);\n    }\n\n    register<\n        DoActionType extends string,\n        State = any,\n        DoActionPayload = any\n    >(\n        type: DoActionType,\n        actionFunction: StateChangeFunction<State, DoActionPayload>,\n        config?: {\n            eventType: Event;\n            label: Label | LabelGenerator<DoActionPayload>\n        }\n    ): PayloadActionCreator<DoActionPayload, DoActionType>;\n    register<\n        DoActionType extends string,\n        UndoActionType extends string,\n        DoActionPayload = any,\n        UndoActionPayload = any\n    >(\n        type: DoActionType,\n        actionFunction: TrrackActionFunction<\n            DoActionType,\n            UndoActionType,\n            UndoActionPayload,\n            DoActionPayload\n        >,\n        config?: {\n            eventType: Event;\n            label: Label | LabelGenerator<DoActionPayload>\n        }\n    ): PayloadActionCreator<DoActionPayload, DoActionType>;\n    register<\n        DoActionType extends string,\n        UndoActionType extends string,\n        DoActionPayload = any,\n        UndoActionPayload = any,\n        State = any\n    >(\n        type: DoActionType,\n        actionFunction: TrrackActionFunction<\n            DoActionType,\n            UndoActionType,\n            UndoActionPayload,\n            DoActionPayload\n        > | StateChangeFunction<State, DoActionPayload>,\n        config?: {\n            eventType: Event;\n            label: Label | LabelGenerator<DoActionPayload>\n        }\n    ): PayloadActionCreator<DoActionPayload, DoActionType>;\n    register<\n        DoActionType extends string,\n        UndoActionType extends string,\n        DoActionPayload = any,\n        UndoActionPayload = any,\n        State = any\n    >(\n        type: DoActionType,\n        actionFunction: TrrackActionFunction<\n            DoActionType,\n            UndoActionType,\n            UndoActionPayload,\n            DoActionPayload\n        > | StateChangeFunction<State, DoActionPayload>,\n        config?: {\n            eventType: Event;\n            label: Label | LabelGenerator<DoActionPayload>\n        }\n    ): PayloadActionCreator<DoActionPayload, DoActionType> {\n        const isState = actionFunction.length === 2;\n\n        if (actionFunction.length > 2)\n            throw new Error('Incorrect action function signature. Action function can only have two arguments at most!');\n\n        if (this.has(type)) throw new Error(`Already registered: ${type}`);\n\n        const { label = type, eventType = type as unknown as Event } = config || {};\n\n        this.registry.set(type, {\n            func: prepareAction(actionFunction),\n            config: {\n                hasSideEffects: !isState,\n                label:\n                    typeof label === 'string'\n                        ? ((() => label) as LabelGenerator<void>)\n                        : label,\n                eventType,\n            },\n        });\n\n        return createAction<DoActionPayload, DoActionType>(\n            type\n        ) as PayloadActionCreator<DoActionPayload, DoActionType>;\n    }\n\n    get(type: string) {\n        const action = this.registry.get(type);\n\n        if (!action) throw new Error(`Not registered: ${type}`);\n\n        return action;\n    }\n}\n"],"names":["createAction","type","prepareAction","actionCreator","args","action","initEventManager","eventsMap","event","listener","e","events","ID","id","uuid","isStateNode","node","isRootNode","createRootNode","label","state","initialArtifact","initialMetadata","commonMetadata","meta","acc","key","artifacts","createStateNode","parent","sideEffects","graphSliceCreator","initialState","artifact","metadata","rootLabel","root","graph","actions","frozenGraph","freeze","g","produce","draft","existingMetadata","metaData","payload","initializeProvenanceGraph","listeners","reduce","getInitialState","update","isNew","skipOnNew","func","config","TrrackEvents","applyPatch","compare","deepClone","jsonPatch","getState","nodes","stateLike","checkpointRef","checkpointNode","path","getPath","patches","p","n","patch","checkpointState","determineSaveStrategy","objectKeysLength","initializeTrrack","registry","isTraversing","eventManager","getNode","metas","latest","data","annotations","annotation","a","bookmarks","onlySideEffects","originalState","stateToSave","lastRef","newStateNode","act","actionRecord","newState","sideEffectsToApply","i","currentNode","nextNode","isNextNodeUp","sf","actionFunction","current","to","getTreeFromNode","graphString","LCA","destination","source","target","diff","lcaId","lca","pathFromSourceToLca","pathFromDestinationToLca","reversedPath","enablePatches","Registry","name","isState","eventType"],"mappings":"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"}