Skip to content

Commit

Permalink
feat(json-crdt): 馃幐 start Extension implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
streamich committed May 2, 2024
1 parent d3b05e3 commit 7da9262
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
24 changes: 24 additions & 0 deletions src/json-crdt/extensions/Extension.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {s, type NodeBuilder, type nodes} from "../../json-crdt-patch";
import type {ModelApi} from "../model";
import type {JsonNode} from "../nodes";
import type {ExtensionApi, ExtensionJsonNode} from "./types";

export class Extension<
Id extends number,
Node extends JsonNode,
ENode extends ExtensionJsonNode,
EApi extends ExtensionApi<ENode>,
ESchema extends NodeBuilder,
> {
constructor(
public readonly id: Id,
public readonly name: string,
public readonly schema: (...args: any[]) => ESchema,
public readonly Node: new (data: Node) => ENode,
public readonly Api: new (node: ENode, api: ModelApi) => EApi,
) {}

public new(...args: any[]): nodes.ext<Id, ESchema> {
return s.ext<Id, ESchema>(this.id, this.schema(...args));
}
}
3 changes: 2 additions & 1 deletion src/json-crdt/extensions/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ export interface ExtensionDefinition<
Node extends JsonNode = JsonNode,
ENode extends ExtensionJsonNode = ExtensionJsonNode,
EApi extends ExtensionApi<ENode> = ExtensionApi<ENode>,
ESchema extends NodeBuilder = NodeBuilder,
> {
id: number;
name: string;
new: (...args: any[]) => NodeBuilder;
new: (...args: any[]) => ESchema;
Node: new (data: Node) => ENode;
Api: new (node: ENode, api: ModelApi) => EApi;
}

0 comments on commit 7da9262

Please sign in to comment.