@rtif-sdk/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/apply.d.ts +31 -0
- package/dist/apply.d.ts.map +1 -0
- package/dist/apply.js +604 -0
- package/dist/apply.js.map +1 -0
- package/dist/error.d.ts +19 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +21 -0
- package/dist/error.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +58 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +6 -0
- package/dist/model.js.map +1 -0
- package/dist/normalize.d.ts +40 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +74 -0
- package/dist/normalize.js.map +1 -0
- package/dist/operations.d.ts +90 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +6 -0
- package/dist/operations.js.map +1 -0
- package/dist/queries.d.ts +68 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +159 -0
- package/dist/queries.js.map +1 -0
- package/dist/resolve.d.ts +58 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +90 -0
- package/dist/resolve.js.map +1 -0
- package/dist/serialization.d.ts +89 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/serialization.js +39 -0
- package/dist/serialization.js.map +1 -0
- package/dist/validate.d.ts +38 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +93 -0
- package/dist/validate.js.map +1 -0
- package/package.json +25 -0
package/dist/apply.js
ADDED
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operation application — the single pure function that transforms documents.
|
|
3
|
+
* See docs/spec/operations.md for specification.
|
|
4
|
+
*/
|
|
5
|
+
import { RtifError } from './error.js';
|
|
6
|
+
import { normalizeSpans } from './normalize.js';
|
|
7
|
+
import { blockTextLength, resolve } from './resolve.js';
|
|
8
|
+
/**
|
|
9
|
+
* Apply an operation to a document, returning the new document and its inverse.
|
|
10
|
+
*
|
|
11
|
+
* - Immutable: returns a new Document, never mutates in place.
|
|
12
|
+
* - Deterministic: same (doc, op) → same (doc', inverse) on every platform.
|
|
13
|
+
* - Normalizes affected blocks before returning.
|
|
14
|
+
*
|
|
15
|
+
* @param doc - The document to transform
|
|
16
|
+
* @param op - The operation to apply
|
|
17
|
+
* @returns The new document and the inverse operation
|
|
18
|
+
* @throws {RtifError} If the operation is invalid
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const { doc: newDoc, inverse } = apply(doc, { type: 'insert_text', offset: 0, text: 'hi' });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function apply(doc, op) {
|
|
26
|
+
switch (op.type) {
|
|
27
|
+
case 'insert_text':
|
|
28
|
+
return applyInsertText(doc, op);
|
|
29
|
+
case 'delete_text':
|
|
30
|
+
return applyDeleteText(doc, op);
|
|
31
|
+
case 'split_block':
|
|
32
|
+
return applySplitBlock(doc, op);
|
|
33
|
+
case 'merge_block':
|
|
34
|
+
return applyMergeBlock(doc, op);
|
|
35
|
+
case 'set_span_marks':
|
|
36
|
+
return applySetSpanMarks(doc, op);
|
|
37
|
+
case 'set_block_attrs':
|
|
38
|
+
return applySetBlockAttrs(doc, op);
|
|
39
|
+
case 'set_block_type':
|
|
40
|
+
return applySetBlockType(doc, op);
|
|
41
|
+
case 'set_meta':
|
|
42
|
+
return applySetMeta(doc, op);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Insert text into a block's spans at the given local offset.
|
|
47
|
+
* Returns new spans array (not yet normalized).
|
|
48
|
+
*/
|
|
49
|
+
function insertTextIntoSpans(spans, localOffset, text) {
|
|
50
|
+
// Special case: empty block (single empty span)
|
|
51
|
+
if (spans.length === 1 && spans[0].text === '' && localOffset === 0) {
|
|
52
|
+
return [{
|
|
53
|
+
text,
|
|
54
|
+
...(spans[0].marks && Object.keys(spans[0].marks).length > 0
|
|
55
|
+
? { marks: { ...spans[0].marks } }
|
|
56
|
+
: {}),
|
|
57
|
+
}];
|
|
58
|
+
}
|
|
59
|
+
let remaining = localOffset;
|
|
60
|
+
const result = [];
|
|
61
|
+
for (let i = 0; i < spans.length; i++) {
|
|
62
|
+
const span = spans[i];
|
|
63
|
+
if (remaining > span.text.length) {
|
|
64
|
+
// Haven't reached the target span yet
|
|
65
|
+
result.push(copySpan(span));
|
|
66
|
+
remaining -= span.text.length;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// This is the target span — insert text here
|
|
70
|
+
const before = span.text.slice(0, remaining);
|
|
71
|
+
const after = span.text.slice(remaining);
|
|
72
|
+
result.push({
|
|
73
|
+
text: before + text + after,
|
|
74
|
+
...(span.marks && Object.keys(span.marks).length > 0
|
|
75
|
+
? { marks: { ...span.marks } }
|
|
76
|
+
: {}),
|
|
77
|
+
});
|
|
78
|
+
// Copy remaining spans
|
|
79
|
+
for (let j = i + 1; j < spans.length; j++) {
|
|
80
|
+
result.push(copySpan(spans[j]));
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Apply insert_text: insert text at the given absolute offset.
|
|
89
|
+
*/
|
|
90
|
+
function applyInsertText(doc, op) {
|
|
91
|
+
const { blockIndex, localOffset } = resolve(doc, op.offset);
|
|
92
|
+
const block = doc.blocks[blockIndex];
|
|
93
|
+
const newSpans = normalizeSpans(insertTextIntoSpans(block.spans, localOffset, op.text));
|
|
94
|
+
const newBlock = {
|
|
95
|
+
id: block.id,
|
|
96
|
+
type: block.type,
|
|
97
|
+
spans: newSpans,
|
|
98
|
+
...(block.attrs ? { attrs: { ...block.attrs } } : {}),
|
|
99
|
+
};
|
|
100
|
+
const newBlocks = doc.blocks.map((b, i) => (i === blockIndex ? newBlock : b));
|
|
101
|
+
const inverse = {
|
|
102
|
+
type: 'delete_text',
|
|
103
|
+
offset: op.offset,
|
|
104
|
+
count: op.text.length,
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
doc: { ...doc, blocks: newBlocks },
|
|
108
|
+
inverse,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Apply delete_text: delete `count` characters starting at the given absolute offset.
|
|
113
|
+
* Currently only supports single-block deletion (does not cross block boundaries).
|
|
114
|
+
*/
|
|
115
|
+
function applyDeleteText(doc, op) {
|
|
116
|
+
const { blockIndex, localOffset } = resolve(doc, op.offset);
|
|
117
|
+
const block = doc.blocks[blockIndex];
|
|
118
|
+
const bLen = blockTextLength(block);
|
|
119
|
+
if (op.count < 0) {
|
|
120
|
+
throw new RtifError('INVALID_COUNT', `delete_text count must be non-negative, got ${op.count}`);
|
|
121
|
+
}
|
|
122
|
+
if (localOffset + op.count > bLen) {
|
|
123
|
+
throw new RtifError('INVALID_COUNT', `delete_text range [${op.offset}, ${op.offset + op.count}) exceeds block text length`);
|
|
124
|
+
}
|
|
125
|
+
// Collect the deleted text for the inverse
|
|
126
|
+
const fullText = block.spans.map((s) => s.text).join('');
|
|
127
|
+
const deletedText = fullText.slice(localOffset, localOffset + op.count);
|
|
128
|
+
// Delete range from spans
|
|
129
|
+
const newSpans = normalizeSpans(deleteFromSpans(block.spans, localOffset, op.count));
|
|
130
|
+
const newBlock = {
|
|
131
|
+
id: block.id,
|
|
132
|
+
type: block.type,
|
|
133
|
+
spans: newSpans,
|
|
134
|
+
...(block.attrs ? { attrs: { ...block.attrs } } : {}),
|
|
135
|
+
};
|
|
136
|
+
const newBlocks = doc.blocks.map((b, i) => (i === blockIndex ? newBlock : b));
|
|
137
|
+
const inverse = {
|
|
138
|
+
type: 'insert_text',
|
|
139
|
+
offset: op.offset,
|
|
140
|
+
text: deletedText,
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
doc: { ...doc, blocks: newBlocks },
|
|
144
|
+
inverse,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Delete `count` characters starting at `localOffset` within a span array.
|
|
149
|
+
* Returns new spans (not yet normalized).
|
|
150
|
+
*/
|
|
151
|
+
function deleteFromSpans(spans, localOffset, count) {
|
|
152
|
+
const result = [];
|
|
153
|
+
let remaining = localOffset;
|
|
154
|
+
let toDelete = count;
|
|
155
|
+
for (const span of spans) {
|
|
156
|
+
if (toDelete === 0) {
|
|
157
|
+
// Past deletion range — copy span as-is
|
|
158
|
+
result.push(copySpan(span));
|
|
159
|
+
}
|
|
160
|
+
else if (remaining >= span.text.length) {
|
|
161
|
+
// Haven't reached deletion start — copy span, subtract from remaining
|
|
162
|
+
result.push(copySpan(span));
|
|
163
|
+
remaining -= span.text.length;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// Deletion overlaps this span
|
|
167
|
+
const deleteStart = remaining;
|
|
168
|
+
const deleteEnd = Math.min(span.text.length, deleteStart + toDelete);
|
|
169
|
+
const deleted = deleteEnd - deleteStart;
|
|
170
|
+
const before = span.text.slice(0, deleteStart);
|
|
171
|
+
const after = span.text.slice(deleteEnd);
|
|
172
|
+
const newText = before + after;
|
|
173
|
+
if (newText.length > 0) {
|
|
174
|
+
result.push({
|
|
175
|
+
text: newText,
|
|
176
|
+
...(span.marks && Object.keys(span.marks).length > 0
|
|
177
|
+
? { marks: { ...span.marks } }
|
|
178
|
+
: {}),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
toDelete -= deleted;
|
|
182
|
+
remaining = 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Split a span array at a local offset into two halves.
|
|
189
|
+
* Returns [leftSpans, rightSpans], each normalized.
|
|
190
|
+
*/
|
|
191
|
+
function splitSpansAt(spans, localOffset) {
|
|
192
|
+
const left = [];
|
|
193
|
+
const right = [];
|
|
194
|
+
let remaining = localOffset;
|
|
195
|
+
for (let i = 0; i < spans.length; i++) {
|
|
196
|
+
const span = spans[i];
|
|
197
|
+
if (remaining >= span.text.length) {
|
|
198
|
+
// Entire span goes to the left side
|
|
199
|
+
left.push(copySpan(span));
|
|
200
|
+
remaining -= span.text.length;
|
|
201
|
+
}
|
|
202
|
+
else if (remaining > 0) {
|
|
203
|
+
// Split this span
|
|
204
|
+
left.push({
|
|
205
|
+
text: span.text.slice(0, remaining),
|
|
206
|
+
...(span.marks && Object.keys(span.marks).length > 0
|
|
207
|
+
? { marks: { ...span.marks } }
|
|
208
|
+
: {}),
|
|
209
|
+
});
|
|
210
|
+
right.push({
|
|
211
|
+
text: span.text.slice(remaining),
|
|
212
|
+
...(span.marks && Object.keys(span.marks).length > 0
|
|
213
|
+
? { marks: { ...span.marks } }
|
|
214
|
+
: {}),
|
|
215
|
+
});
|
|
216
|
+
remaining = 0;
|
|
217
|
+
// Rest goes to right
|
|
218
|
+
for (let j = i + 1; j < spans.length; j++) {
|
|
219
|
+
right.push(copySpan(spans[j]));
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// remaining === 0: everything from here goes to the right
|
|
225
|
+
for (let j = i; j < spans.length; j++) {
|
|
226
|
+
right.push(copySpan(spans[j]));
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return [normalizeSpans(left), normalizeSpans(right)];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Apply split_block: split a block at the given offset into two blocks.
|
|
235
|
+
* The original block keeps the content before the offset.
|
|
236
|
+
* The new block gets the content from the offset onwards.
|
|
237
|
+
*/
|
|
238
|
+
function applySplitBlock(doc, op) {
|
|
239
|
+
const { blockIndex, localOffset } = resolve(doc, op.offset);
|
|
240
|
+
const block = doc.blocks[blockIndex];
|
|
241
|
+
const [leftSpans, rightSpans] = splitSpansAt(block.spans, localOffset);
|
|
242
|
+
const newBlockId = op.newBlockId ?? `${block.id}_split`;
|
|
243
|
+
const leftBlock = {
|
|
244
|
+
id: block.id,
|
|
245
|
+
type: block.type,
|
|
246
|
+
spans: leftSpans,
|
|
247
|
+
...(block.attrs ? { attrs: { ...block.attrs } } : {}),
|
|
248
|
+
};
|
|
249
|
+
const rightBlock = {
|
|
250
|
+
id: newBlockId,
|
|
251
|
+
type: op._mergedBlockType ?? block.type,
|
|
252
|
+
spans: rightSpans,
|
|
253
|
+
...(op._mergedBlockAttrs ? { attrs: { ...op._mergedBlockAttrs } } : {}),
|
|
254
|
+
};
|
|
255
|
+
const newBlocks = [
|
|
256
|
+
...doc.blocks.slice(0, blockIndex),
|
|
257
|
+
leftBlock,
|
|
258
|
+
rightBlock,
|
|
259
|
+
...doc.blocks.slice(blockIndex + 1),
|
|
260
|
+
];
|
|
261
|
+
// Inverse: compute the absolute offset for the split point in the new doc
|
|
262
|
+
// This is the same as the original offset
|
|
263
|
+
const inverse = {
|
|
264
|
+
type: 'merge_block',
|
|
265
|
+
blockId: newBlockId,
|
|
266
|
+
};
|
|
267
|
+
return {
|
|
268
|
+
doc: { ...doc, blocks: newBlocks },
|
|
269
|
+
inverse,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Apply merge_block: merge a block with the previous block.
|
|
274
|
+
* The merged block's spans are appended to the previous block's spans.
|
|
275
|
+
* The merged block is removed.
|
|
276
|
+
*/
|
|
277
|
+
function applyMergeBlock(doc, op) {
|
|
278
|
+
const blockIndex = doc.blocks.findIndex((b) => b.id === op.blockId);
|
|
279
|
+
if (blockIndex === -1) {
|
|
280
|
+
throw new RtifError('BLOCK_NOT_FOUND', `Block '${op.blockId}' not found`);
|
|
281
|
+
}
|
|
282
|
+
if (blockIndex === 0) {
|
|
283
|
+
throw new RtifError('INVALID_DOCUMENT', `Cannot merge the first block '${op.blockId}' — no previous block exists`);
|
|
284
|
+
}
|
|
285
|
+
const prevBlock = doc.blocks[blockIndex - 1];
|
|
286
|
+
const mergedBlock = doc.blocks[blockIndex];
|
|
287
|
+
// Compute the absolute offset of the merge point (end of prevBlock)
|
|
288
|
+
// for the inverse split_block operation
|
|
289
|
+
let mergeOffset = 0;
|
|
290
|
+
for (let i = 0; i < blockIndex - 1; i++) {
|
|
291
|
+
mergeOffset += blockTextLength(doc.blocks[i]) + 1; // +1 for virtual \n
|
|
292
|
+
}
|
|
293
|
+
mergeOffset += blockTextLength(prevBlock);
|
|
294
|
+
// Concatenate spans and normalize
|
|
295
|
+
const combinedSpans = normalizeSpans([
|
|
296
|
+
...prevBlock.spans,
|
|
297
|
+
...mergedBlock.spans,
|
|
298
|
+
]);
|
|
299
|
+
const newBlock = {
|
|
300
|
+
id: prevBlock.id,
|
|
301
|
+
type: prevBlock.type,
|
|
302
|
+
spans: combinedSpans,
|
|
303
|
+
...(prevBlock.attrs ? { attrs: { ...prevBlock.attrs } } : {}),
|
|
304
|
+
};
|
|
305
|
+
const newBlocks = [
|
|
306
|
+
...doc.blocks.slice(0, blockIndex - 1),
|
|
307
|
+
newBlock,
|
|
308
|
+
...doc.blocks.slice(blockIndex + 1),
|
|
309
|
+
];
|
|
310
|
+
const inverse = {
|
|
311
|
+
type: 'split_block',
|
|
312
|
+
offset: mergeOffset,
|
|
313
|
+
newBlockId: mergedBlock.id,
|
|
314
|
+
_mergedBlockType: mergedBlock.type,
|
|
315
|
+
...(mergedBlock.attrs ? { _mergedBlockAttrs: { ...mergedBlock.attrs } } : {}),
|
|
316
|
+
};
|
|
317
|
+
return {
|
|
318
|
+
doc: { ...doc, blocks: newBlocks },
|
|
319
|
+
inverse,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Apply set_span_marks: apply/remove marks on a range of text [offset, offset + count).
|
|
324
|
+
* Splits spans at the range boundaries, merges marks per span, and normalizes.
|
|
325
|
+
*/
|
|
326
|
+
function applySetSpanMarks(doc, op) {
|
|
327
|
+
if (op.count < 0) {
|
|
328
|
+
throw new RtifError('INVALID_COUNT', `set_span_marks count must be non-negative, got ${op.count}`);
|
|
329
|
+
}
|
|
330
|
+
if (op.count === 0) {
|
|
331
|
+
// No-op: return a copy of the doc
|
|
332
|
+
return {
|
|
333
|
+
doc: { ...doc, blocks: [...doc.blocks] },
|
|
334
|
+
inverse: { type: 'set_span_marks', offset: op.offset, count: 0, marks: {} },
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
const { blockIndex, localOffset } = resolve(doc, op.offset);
|
|
338
|
+
const block = doc.blocks[blockIndex];
|
|
339
|
+
const bLen = blockTextLength(block);
|
|
340
|
+
if (localOffset + op.count > bLen) {
|
|
341
|
+
throw new RtifError('INVALID_COUNT', `set_span_marks range [${op.offset}, ${op.offset + op.count}) exceeds block text length`);
|
|
342
|
+
}
|
|
343
|
+
const rangeStart = localOffset;
|
|
344
|
+
const rangeEnd = localOffset + op.count;
|
|
345
|
+
// Collect previous mark values from the first affected span for the inverse
|
|
346
|
+
const prevMarks = {};
|
|
347
|
+
let prevCollected = false;
|
|
348
|
+
const newSpans = [];
|
|
349
|
+
let pos = 0;
|
|
350
|
+
for (const span of block.spans) {
|
|
351
|
+
const spanStart = pos;
|
|
352
|
+
const spanEnd = pos + span.text.length;
|
|
353
|
+
pos = spanEnd;
|
|
354
|
+
if (spanEnd <= rangeStart || spanStart >= rangeEnd) {
|
|
355
|
+
// Span is entirely outside the affected range
|
|
356
|
+
newSpans.push(copySpan(span));
|
|
357
|
+
}
|
|
358
|
+
else if (spanStart >= rangeStart && spanEnd <= rangeEnd) {
|
|
359
|
+
// Span is entirely within the affected range
|
|
360
|
+
if (!prevCollected) {
|
|
361
|
+
collectPrevMarks(span, op.marks, prevMarks);
|
|
362
|
+
prevCollected = true;
|
|
363
|
+
}
|
|
364
|
+
newSpans.push(mergeMarksOnSpan(span, op.marks));
|
|
365
|
+
}
|
|
366
|
+
else if (spanStart < rangeStart && spanEnd > rangeEnd) {
|
|
367
|
+
// Range is entirely within this span — split into 3 parts
|
|
368
|
+
newSpans.push(makeSpan(span.text.slice(0, rangeStart - spanStart), span.marks));
|
|
369
|
+
if (!prevCollected) {
|
|
370
|
+
collectPrevMarks(span, op.marks, prevMarks);
|
|
371
|
+
prevCollected = true;
|
|
372
|
+
}
|
|
373
|
+
const middle = makeSpan(span.text.slice(rangeStart - spanStart, rangeEnd - spanStart), span.marks);
|
|
374
|
+
newSpans.push(mergeMarksOnSpan(middle, op.marks));
|
|
375
|
+
newSpans.push(makeSpan(span.text.slice(rangeEnd - spanStart), span.marks));
|
|
376
|
+
}
|
|
377
|
+
else if (spanStart < rangeStart) {
|
|
378
|
+
// Span overlaps the start of the range — split into 2
|
|
379
|
+
newSpans.push(makeSpan(span.text.slice(0, rangeStart - spanStart), span.marks));
|
|
380
|
+
if (!prevCollected) {
|
|
381
|
+
collectPrevMarks(span, op.marks, prevMarks);
|
|
382
|
+
prevCollected = true;
|
|
383
|
+
}
|
|
384
|
+
const tail = makeSpan(span.text.slice(rangeStart - spanStart), span.marks);
|
|
385
|
+
newSpans.push(mergeMarksOnSpan(tail, op.marks));
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
// spanEnd > rangeEnd — Span overlaps the end of the range — split into 2
|
|
389
|
+
if (!prevCollected) {
|
|
390
|
+
collectPrevMarks(span, op.marks, prevMarks);
|
|
391
|
+
prevCollected = true;
|
|
392
|
+
}
|
|
393
|
+
const head = makeSpan(span.text.slice(0, rangeEnd - spanStart), span.marks);
|
|
394
|
+
newSpans.push(mergeMarksOnSpan(head, op.marks));
|
|
395
|
+
newSpans.push(makeSpan(span.text.slice(rangeEnd - spanStart), span.marks));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const normalized = normalizeSpans(newSpans);
|
|
399
|
+
const newBlock = {
|
|
400
|
+
id: block.id,
|
|
401
|
+
type: block.type,
|
|
402
|
+
spans: normalized,
|
|
403
|
+
...(block.attrs ? { attrs: { ...block.attrs } } : {}),
|
|
404
|
+
};
|
|
405
|
+
const newBlocks = doc.blocks.map((b, i) => (i === blockIndex ? newBlock : b));
|
|
406
|
+
// Build inverse marks
|
|
407
|
+
const inverseMarks = {};
|
|
408
|
+
for (const key of Object.keys(op.marks)) {
|
|
409
|
+
if (op.marks[key] === null) {
|
|
410
|
+
// We removed this mark — inverse restores the previous value (if it existed)
|
|
411
|
+
if (key in prevMarks) {
|
|
412
|
+
inverseMarks[key] = prevMarks[key];
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
// We added/changed this mark — inverse restores original or removes
|
|
417
|
+
if (key in prevMarks) {
|
|
418
|
+
inverseMarks[key] = prevMarks[key];
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
inverseMarks[key] = null;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const inverse = {
|
|
426
|
+
type: 'set_span_marks',
|
|
427
|
+
offset: op.offset,
|
|
428
|
+
count: op.count,
|
|
429
|
+
marks: inverseMarks,
|
|
430
|
+
};
|
|
431
|
+
return {
|
|
432
|
+
doc: { ...doc, blocks: newBlocks },
|
|
433
|
+
inverse,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Collect previous mark values from a span for the keys being modified.
|
|
438
|
+
* Only records each key once (from the first affected span).
|
|
439
|
+
*/
|
|
440
|
+
function collectPrevMarks(span, opMarks, prevMarks) {
|
|
441
|
+
for (const key of Object.keys(opMarks)) {
|
|
442
|
+
if (!(key in prevMarks) && span.marks && key in span.marks) {
|
|
443
|
+
prevMarks[key] = span.marks[key];
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Apply marks to a span via shallow merge. Null values remove keys.
|
|
449
|
+
*/
|
|
450
|
+
function mergeMarksOnSpan(span, marks) {
|
|
451
|
+
const newMarks = { ...(span.marks ?? {}) };
|
|
452
|
+
for (const [key, value] of Object.entries(marks)) {
|
|
453
|
+
if (value === null) {
|
|
454
|
+
delete newMarks[key];
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
newMarks[key] = value;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return {
|
|
461
|
+
text: span.text,
|
|
462
|
+
...(Object.keys(newMarks).length > 0 ? { marks: newMarks } : {}),
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
/** Create a span with text and optional marks (copies marks). */
|
|
466
|
+
function makeSpan(text, marks) {
|
|
467
|
+
return {
|
|
468
|
+
text,
|
|
469
|
+
...(marks && Object.keys(marks).length > 0 ? { marks: { ...marks } } : {}),
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
/** Create a shallow copy of a span. */
|
|
473
|
+
function copySpan(span) {
|
|
474
|
+
return {
|
|
475
|
+
text: span.text,
|
|
476
|
+
...(span.marks && Object.keys(span.marks).length > 0
|
|
477
|
+
? { marks: { ...span.marks } }
|
|
478
|
+
: {}),
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Apply set_block_attrs: shallow-merge attrs onto a block.
|
|
483
|
+
* Keys set to `null` are removed. If all attrs are removed, the block's
|
|
484
|
+
* `attrs` property becomes `undefined`.
|
|
485
|
+
*/
|
|
486
|
+
function applySetBlockAttrs(doc, op) {
|
|
487
|
+
const blockIndex = doc.blocks.findIndex((b) => b.id === op.blockId);
|
|
488
|
+
if (blockIndex === -1) {
|
|
489
|
+
throw new RtifError('BLOCK_NOT_FOUND', `Block '${op.blockId}' not found`);
|
|
490
|
+
}
|
|
491
|
+
const block = doc.blocks[blockIndex];
|
|
492
|
+
const prevAttrs = block.attrs;
|
|
493
|
+
// Shallow merge: start with existing attrs (if any), apply changes
|
|
494
|
+
const merged = { ...(prevAttrs ?? {}) };
|
|
495
|
+
for (const [key, value] of Object.entries(op.attrs)) {
|
|
496
|
+
if (value === null) {
|
|
497
|
+
delete merged[key];
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
merged[key] = value;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// If no attrs remain, omit the property entirely
|
|
504
|
+
const newAttrs = Object.keys(merged).length > 0 ? merged : undefined;
|
|
505
|
+
const newBlock = {
|
|
506
|
+
id: block.id,
|
|
507
|
+
type: block.type,
|
|
508
|
+
spans: block.spans.map((s) => copySpan(s)),
|
|
509
|
+
...(newAttrs ? { attrs: newAttrs } : {}),
|
|
510
|
+
};
|
|
511
|
+
const newBlocks = doc.blocks.map((b, i) => (i === blockIndex ? newBlock : b));
|
|
512
|
+
// Build inverse: for each key in op.attrs, record the previous value
|
|
513
|
+
// (or null if the key didn't exist, meaning the inverse should remove it)
|
|
514
|
+
const inverseAttrs = {};
|
|
515
|
+
for (const key of Object.keys(op.attrs)) {
|
|
516
|
+
if (prevAttrs && key in prevAttrs) {
|
|
517
|
+
inverseAttrs[key] = prevAttrs[key];
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
inverseAttrs[key] = null;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const inverse = {
|
|
524
|
+
type: 'set_block_attrs',
|
|
525
|
+
blockId: op.blockId,
|
|
526
|
+
attrs: inverseAttrs,
|
|
527
|
+
};
|
|
528
|
+
return {
|
|
529
|
+
doc: { ...doc, blocks: newBlocks },
|
|
530
|
+
inverse,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Apply set_block_type: change a block's type string.
|
|
535
|
+
* The block retains its id, spans, and attrs — only `type` changes.
|
|
536
|
+
*/
|
|
537
|
+
function applySetBlockType(doc, op) {
|
|
538
|
+
if (!op.blockType) {
|
|
539
|
+
throw new RtifError('INVALID_DOCUMENT', `set_block_type blockType must be a non-empty string`);
|
|
540
|
+
}
|
|
541
|
+
const blockIndex = doc.blocks.findIndex((b) => b.id === op.blockId);
|
|
542
|
+
if (blockIndex === -1) {
|
|
543
|
+
throw new RtifError('BLOCK_NOT_FOUND', `Block '${op.blockId}' not found`);
|
|
544
|
+
}
|
|
545
|
+
const block = doc.blocks[blockIndex];
|
|
546
|
+
const prevType = block.type;
|
|
547
|
+
const newBlock = {
|
|
548
|
+
id: block.id,
|
|
549
|
+
type: op.blockType,
|
|
550
|
+
spans: block.spans.map((s) => copySpan(s)),
|
|
551
|
+
...(block.attrs ? { attrs: { ...block.attrs } } : {}),
|
|
552
|
+
};
|
|
553
|
+
const newBlocks = doc.blocks.map((b, i) => (i === blockIndex ? newBlock : b));
|
|
554
|
+
const inverse = {
|
|
555
|
+
type: 'set_block_type',
|
|
556
|
+
blockId: op.blockId,
|
|
557
|
+
blockType: prevType,
|
|
558
|
+
};
|
|
559
|
+
return {
|
|
560
|
+
doc: { ...doc, blocks: newBlocks },
|
|
561
|
+
inverse,
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Apply set_meta: shallow-merge meta onto the document.
|
|
566
|
+
* Keys set to `null` are removed. If all meta keys are removed,
|
|
567
|
+
* the document's `meta` property becomes `undefined`.
|
|
568
|
+
*/
|
|
569
|
+
function applySetMeta(doc, op) {
|
|
570
|
+
const prevMeta = doc.meta;
|
|
571
|
+
// Shallow merge: start with existing meta (if any), apply changes
|
|
572
|
+
const merged = { ...(prevMeta ?? {}) };
|
|
573
|
+
for (const [key, value] of Object.entries(op.meta)) {
|
|
574
|
+
if (value === null) {
|
|
575
|
+
delete merged[key];
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
merged[key] = value;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
// If no meta keys remain, omit the property entirely
|
|
582
|
+
const newMeta = Object.keys(merged).length > 0 ? merged : undefined;
|
|
583
|
+
// Build inverse: for each key in op.meta, record the previous value
|
|
584
|
+
const inverseMeta = {};
|
|
585
|
+
for (const key of Object.keys(op.meta)) {
|
|
586
|
+
if (prevMeta && key in prevMeta) {
|
|
587
|
+
inverseMeta[key] = prevMeta[key];
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
inverseMeta[key] = null;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
const inverse = {
|
|
594
|
+
type: 'set_meta',
|
|
595
|
+
meta: inverseMeta,
|
|
596
|
+
};
|
|
597
|
+
const newDoc = {
|
|
598
|
+
version: doc.version,
|
|
599
|
+
blocks: [...doc.blocks],
|
|
600
|
+
...(newMeta ? { meta: newMeta } : {}),
|
|
601
|
+
};
|
|
602
|
+
return { doc: newDoc, inverse };
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"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"}
|
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error class for RTIF domain errors.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* throw new RtifError('OFFSET_OUT_OF_RANGE', 'Offset 42 exceeds document length 30');
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
/** Error codes for RTIF operations */
|
|
10
|
+
export type RtifErrorCode = 'OFFSET_OUT_OF_RANGE' | 'BLOCK_NOT_FOUND' | 'INVALID_COUNT' | 'INVALID_DOCUMENT';
|
|
11
|
+
/**
|
|
12
|
+
* Domain error thrown by RTIF core functions.
|
|
13
|
+
* Always prefer this over generic `Error`.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RtifError extends Error {
|
|
16
|
+
readonly code: RtifErrorCode;
|
|
17
|
+
constructor(code: RtifErrorCode, message: string);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sCAAsC;AACtC,MAAM,MAAM,aAAa,GACrB,qBAAqB,GACrB,iBAAiB,GACjB,eAAe,GACf,kBAAkB,CAAC;AAEvB;;;GAGG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;gBAEjB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;CAKjD"}
|
package/dist/error.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error class for RTIF domain errors.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* throw new RtifError('OFFSET_OUT_OF_RANGE', 'Offset 42 exceeds document length 30');
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Domain error thrown by RTIF core functions.
|
|
11
|
+
* Always prefer this over generic `Error`.
|
|
12
|
+
*/
|
|
13
|
+
export class RtifError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
constructor(code, message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'RtifError';
|
|
18
|
+
this.code = code;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=error.js.map
|