Skip to content

Commit 7248c8c

Browse files
committed
feat(json-crdt-extensions): 🎸 improve slice type def types
1 parent d239803 commit 7248c8c

File tree

4 files changed

+46
-11
lines changed

4 files changed

+46
-11
lines changed

src/json-crdt-extensions/peritext/registry/SliceRegistry.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {PeritextMlElement} from '../block/types';
2+
import {NodeBuilder} from '../../../json-crdt-patch';
23
import type {JsonMlNode} from 'very-small-parser/lib/html/json-ml/types';
34
import type {FromHtmlConverter, SliceTypeDefinition, ToHtmlConverter} from './types';
45

@@ -7,7 +8,7 @@ export class SliceRegistry {
78
private toHtmlMap: Map<string | number, ToHtmlConverter> = new Map();
89
private fromHtmlMap: Map<string, FromHtmlConverter[]> = new Map();
910

10-
public add(def: SliceTypeDefinition<PeritextMlElement<any, any, any>>): this {
11+
public add<Type extends number | string, Schema extends NodeBuilder>(def: SliceTypeDefinition<Type, Schema>): void {
1112
const {type, toHtml, fromHtml} = def;
1213
this.map.set(type, def);
1314
if (toHtml) this.toHtmlMap.set(type, toHtml);
@@ -18,7 +19,6 @@ export class SliceRegistry {
1819
converters.push(converter);
1920
this.fromHtmlMap.set(htmlTag, converters);
2021
}
21-
return this;
2222
}
2323

2424
public toHtml(el: PeritextMlElement): JsonMlNode | undefined {
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import {s} from "../../../json-crdt-patch";
2+
import {JsonNodeView} from "../../../json-crdt/nodes";
13
import {PeritextMlElement} from "../block/types";
24
import {CommonSliceType} from "../slice";
35
import {SliceRegistry} from "./SliceRegistry";
4-
import {SliceTypeDefinition} from "./types";
56

67
/**
78
* Default annotation type registry.
@@ -10,5 +11,11 @@ export const registry = new SliceRegistry();
1011

1112
registry.add({
1213
type: CommonSliceType.a,
13-
toHtml: (element: PeritextMlElement<CommonSliceType.a, {}, true>) => ['a', element[1], element[2]],
14-
} as SliceTypeDefinition<PeritextMlElement<CommonSliceType.a, {href?: string, title?: string}, true>>);
14+
schema: s.obj({
15+
href: s.str(''),
16+
title: s.str(''),
17+
}),
18+
toHtml: (el) => {
19+
throw new Error('Not implemented');
20+
},
21+
});
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1+
import type {NodeBuilder} from '../../../json-crdt-patch';
2+
import type {JsonNodeView} from '../../../json-crdt/nodes';
3+
import {SchemaToJsonNode} from '../../../json-crdt/schema/types';
14
import type {PeritextMlElement} from '../block/types';
25
import type {JsonMlNode} from 'very-small-parser/lib/html/json-ml/types';
36

4-
export interface SliceTypeDefinition<El extends PeritextMlElement<any, any, any> = PeritextMlElement> {
5-
type: El[0];
6-
toHtml?: ToHtmlConverter<El>;
7+
export interface SliceTypeDefinition<Type extends number | string, Schema extends NodeBuilder> {
8+
type: Type;
9+
schema: Schema;
10+
toHtml?: ToHtmlConverter<PeritextMlElement<Type, JsonNodeView<SchemaToJsonNode<Schema>>, true>>;
711
fromHtml?: {
8-
[htmlTag: string]: FromHtmlConverter<El>;
12+
[htmlTag: string]: FromHtmlConverter<PeritextMlElement<Type, JsonNodeView<SchemaToJsonNode<Schema>>, true>>;
913
};
1014
}
1115

12-
export type ToHtmlConverter<El extends PeritextMlElement<any, any, any> = PeritextMlElement> =
16+
export type ToHtmlConverter<El extends PeritextMlElement<any, any, any>> =
1317
(element: El) => JsonMlNode;
1418

15-
export type FromHtmlConverter<El extends PeritextMlElement<any, any, any> = PeritextMlElement> =
19+
export type FromHtmlConverter<El extends PeritextMlElement<any, any, any>> =
1620
(jsonml: JsonMlNode) => El | undefined;

src/json-crdt-patch/builder/schema.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,30 @@ export namespace nodes {
132132
* age: s.con(0),
133133
* });
134134
* ```
135+
*
136+
* Specify optional keys as the second argument:
137+
*
138+
* ```ts
139+
* s.obj(
140+
* {
141+
* href: s.str('https://example.com'),
142+
* },
143+
* {
144+
* title: s.str(''),
145+
* },
146+
* )
147+
* ```
148+
*
149+
* Or, specify only the type, using the `optional` method:
150+
*
151+
* ```ts
152+
* s.obj({
153+
* href: s.str('https://example.com'),
154+
* })
155+
* .optional<nodes.obj({
156+
* title: nodes.str,
157+
* })>()
158+
* ```
135159
*/
136160
export class obj<
137161
T extends Record<string, NodeBuilder>,

0 commit comments

Comments
 (0)