From 727843268accce33bbcee21766f8799dbdc2cca0 Mon Sep 17 00:00:00 2001 From: Romain Menke Date: Fri, 30 Sep 2022 08:29:35 +0200 Subject: [PATCH] recalculate the insertion index after normalizing a node --- lib/container.js | 20 ++++++++++---------- test/container.test.ts | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/lib/container.js b/lib/container.js index d18a33845..39fe036f6 100644 --- a/lib/container.js +++ b/lib/container.js @@ -176,16 +176,16 @@ class Container extends Node { } insertBefore(exist, add) { - exist = this.index(exist) - + let existIndex = this.index(exist) let type = exist === 0 ? 'prepend' : false - let nodes = this.normalize(add, this.proxyOf.nodes[exist], type).reverse() - for (let node of nodes) this.proxyOf.nodes.splice(exist, 0, node) + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex], type).reverse() + existIndex = this.index(exist) + for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node) let index for (let id in this.indexes) { index = this.indexes[id] - if (exist <= index) { + if (existIndex <= index) { this.indexes[id] = index + nodes.length } } @@ -196,15 +196,15 @@ class Container extends Node { } insertAfter(exist, add) { - exist = this.index(exist) - - let nodes = this.normalize(add, this.proxyOf.nodes[exist]).reverse() - for (let node of nodes) this.proxyOf.nodes.splice(exist + 1, 0, node) + let existIndex = this.index(exist) + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse() + existIndex = this.index(exist) + for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node) let index for (let id in this.indexes) { index = this.indexes[id] - if (exist < index) { + if (existIndex < index) { this.indexes[id] = index + nodes.length } } diff --git a/test/container.test.ts b/test/container.test.ts index 419e06cc3..52f12ffb8 100755 --- a/test/container.test.ts +++ b/test/container.test.ts @@ -636,6 +636,24 @@ test('insertBefore() receives array', () => { is(a.toString(), 'a{ color: red; width: 1; height: 2; z-index: 1 }') }) +test('insertBefore() receives pre-existing child node - a', () => { + let a = parse('a{ align-items: start; color: red; z-index: 1 }') + let declA = (a.first as Rule).nodes[0]; + let declC = (a.first as Rule).nodes[2]; + declC.before(declA); + + is(a.toString(), 'a{ color: red; align-items: start; z-index: 1 }') +}) + +test('insertBefore() receives pre-existing child node - b', () => { + let a = parse('a{ align-items: start; color: red; z-index: 1 }') + let declA = (a.first as Rule).nodes[0]; + let declC = (a.first as Rule).nodes[2]; + declA.before(declC); + + is(a.toString(), 'a{ z-index: 1; align-items: start; color: red }') +}) + test('insertAfter() inserts child', () => { let rule = parse('a { a: 1; b: 2 }').first as Rule rule.insertAfter(0, { prop: 'c', value: '3' }) @@ -666,6 +684,24 @@ test('insertAfter() receives array', () => { is(a.toString(), 'a{ color: red; width: 1; height: 2; z-index: 1 }') }) +test('insertAfter() receives pre-existing child node - a', () => { + let a = parse('a{ align-items: start; color: red; z-index: 1 }') + let declA = (a.first as Rule).nodes[0]; + let declC = (a.first as Rule).nodes[2]; + declC.after(declA); + + is(a.toString(), 'a{ color: red; z-index: 1; align-items: start }') +}) + +test('insertAfter() receives pre-existing child node - b', () => { + let a = parse('a{ align-items: start; color: red; z-index: 1 }') + let declA = (a.first as Rule).nodes[0]; + let declC = (a.first as Rule).nodes[2]; + declA.after(declC); + + is(a.toString(), 'a{ align-items: start; z-index: 1; color: red }') +}) + test('removeChild() removes by index', () => { let rule = parse('a { a: 1; b: 2 }').first as Rule rule.removeChild(1)