Skip to content

Commit

Permalink
feat(json-crdt-extensions): 🎸 add ability to access Peritext "str" no…
Browse files Browse the repository at this point in the history
…de API
  • Loading branch information
streamich committed May 4, 2024
1 parent 9f223b4 commit 41ec564
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 23 deletions.
8 changes: 6 additions & 2 deletions src/json-crdt-extensions/peritext/PeritextApi.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import {NodeApi} from '../../json-crdt/model/api/nodes';
import type {PeritextNode} from './PeritextNode';
import type {ExtensionApi} from '../../json-crdt';
import type {ExtensionApi, StrApi} from '../../json-crdt';

export class PeritextApi extends NodeApi<PeritextNode> implements ExtensionApi<PeritextNode> {}
export class PeritextApi extends NodeApi<PeritextNode> implements ExtensionApi<PeritextNode> {
public text(): StrApi {
return this.api.wrap(this.node.text());
}
}
8 changes: 6 additions & 2 deletions src/json-crdt-extensions/peritext/PeritextNode.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {MNEMONIC} from './constants';
import {ExtensionNode} from '../../json-crdt/extensions/ExtensionNode';
import {ExtensionId} from '../constants';
import type {StrNode} from '../../json-crdt/nodes';
import type {PeritextDataNode} from './types';

export class PeritextNode extends ExtensionNode<PeritextDataNode> {
Expand All @@ -10,8 +11,11 @@ export class PeritextNode extends ExtensionNode<PeritextDataNode> {
return MNEMONIC;
}

public text(): StrNode {
return this.data.get(0)!;
}

public view(): string {
const str = this.data.get(0)!;
return str.view();
return this.text().view();
}
}
33 changes: 14 additions & 19 deletions src/json-crdt-extensions/peritext/__tests__/extension.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {s} from '../../../json-crdt-patch';
import {VecApi} from '../../../json-crdt/model';
import {StrApi, VecApi} from '../../../json-crdt/model';
import {ModelWithExt, ext} from '../../ModelWithExt';
import {PeritextApi} from '../PeritextApi';
import {PeritextNode} from '../PeritextNode';
Expand All @@ -12,11 +12,19 @@ const schema = s.obj({
}),
});

test('can access PeritextNode in type safe way', () => {
// const model = ModelWithExt.create(schema);
// const node = model.root.node().get('nested')!.get('obj')!.get('text')!.child!();
// expect(node).toBeInstanceOf(PeritextNode);
// expect(node.view()).toBe('Hello, world\n');
test('can access PeritextNode in type safe way (using the proxy selector)', () => {
const model = ModelWithExt.create(schema);
let api = model.s.nested.obj.text.ext();
expect(api).toBeInstanceOf(PeritextApi);
api = new PeritextApi(api.node, api.api);
});

test('can access raw text "str" node in type safe way', () => {
const model = ModelWithExt.create(schema);
const str = model.s.nested.obj.text.ext().text();
expect(str).toBeInstanceOf(StrApi);
str.ins(str.length() - 1, '!');
expect(model.view().nested.obj.text).toBe('Hello, world!\n');
});

test('can access PeritextApi using path selector', () => {
Expand Down Expand Up @@ -62,16 +70,3 @@ test('can access PeritextApi using parent proxy selector', () => {
expect(api2).toBeInstanceOf(PeritextApi);
api2 = new PeritextApi(node, api.api);
});

test('can access PeritextApi using inline proxy selector', () => {
const model = ModelWithExt.create(schema);
let api = model.s.nested.obj.text.ext();
expect(api).toBeInstanceOf(PeritextApi);
api = new PeritextApi(api.node, api.api);
});

// test('can access nested nodes using proxy selector', () => {
// const model = ModelWithExt.create(schema);
// const api = model.s.nested.obj.text.toApi();
// console.log(api + '');
// });

0 comments on commit 41ec564

Please sign in to comment.