diff --git a/src/structs/AbstractItem.js b/src/structs/AbstractItem.js index c5be85f2..1cd1cc45 100644 --- a/src/structs/AbstractItem.js +++ b/src/structs/AbstractItem.js @@ -421,6 +421,13 @@ export class AbstractItem extends AbstractStruct { if (r.right !== null) { r.right.left = r } + if (r.left === null) { + if (r.parentSub === null) { + r.parent._start = r + } else { + r.parent._map.set(r.parentSub, r) + } + } } replaceStruct(y.store, this, r) return r diff --git a/src/utils/Y.js b/src/utils/Y.js index 63c6a2cc..6d9432b2 100644 --- a/src/utils/Y.js +++ b/src/utils/Y.js @@ -12,7 +12,8 @@ import { YText, YMap, YXmlFragment, - YEvent, ItemDeleted, GC, AbstractStruct // eslint-disable-line + ItemDeleted, + YEvent, GC, AbstractStruct // eslint-disable-line } from '../internals.js' import { Observable } from 'lib0/observable.js' @@ -121,7 +122,7 @@ export class Y extends Observable { if (deleteItem.clock + deleteItem.len < struct.id.clock) { break } - if (struct.deleted && struct instanceof AbstractItem) { + if (struct.deleted && struct instanceof AbstractItem && (struct.constructor !== ItemDeleted || (struct.parent._item !== null && struct.parent._item.deleted))) { // check if we can GC replacedItems.add(struct.gc(this)) } diff --git a/tests/index.js b/tests/index.js index 6241d0dd..ca509794 100644 --- a/tests/index.js +++ b/tests/index.js @@ -5,10 +5,17 @@ import * as text from './y-text.tests.js' import * as xml from './y-xml.tests.js' import { runTests } from 'lib0/testing.js' -import { isBrowser } from 'lib0/environment.js' +import { isBrowser, isNode } from 'lib0/environment.js' import * as log from 'lib0/logging.js' if (isBrowser) { log.createVConsole(document.body) } -runTests({ map, array, text, xml }) +runTests({ + map, array, text, xml +}).then(success => { + /* istanbul ignore next */ + if (isNode) { + process.exit(success ? 0 : 1) + } +})