From 7ee06d8b6d3e7f44265e85de46de22e654c1e6ef Mon Sep 17 00:00:00 2001 From: Bunyanuch Saengnet <53788417+bunysae@users.noreply.github.com> Date: Mon, 11 May 2020 16:00:50 +0200 Subject: [PATCH] Reset depth when formatting differences Fixes #41. Co-authored-by: Mark Wubben --- lib/diff.js | 6 +++--- test/diff.js | 40 ++++++++++++++++++++++++++++++++++++ test/snapshots/diff.js.md | 24 ++++++++++++++++++++++ test/snapshots/diff.js.snap | Bin 4837 -> 4964 bytes 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/lib/diff.js b/lib/diff.js index cefa14c..efc6b25 100644 --- a/lib/diff.js +++ b/lib/diff.js @@ -75,7 +75,7 @@ function diffDescriptors (lhs, rhs, options) { const isCircular = descriptor => lhsCircular.has(descriptor) || rhsCircular.has(descriptor) - const format = (builder, subject, circular) => { + const format = (builder, subject, circular, depthOffset = 0) => { if (diffIndex >= 0 && !diffStack[diffIndex].shouldFormat(subject)) return if (circular.has(subject)) { @@ -113,7 +113,7 @@ function diffDescriptors (lhs, rhs, options) { const formatter = subject.formatShallow(themeUtils.applyModifiers(subject, theme), indent) const recursor = subject.createRecursor() - if (formatter.increaseIndent && maxDepth > 0 && indent.level === maxDepth) { + if (formatter.increaseIndent && maxDepth > 0 && indent.level === (maxDepth + depthOffset)) { const isEmpty = recursor() === null let formatted = !isEmpty && typeof formatter.maxDepth === 'function' ? formatter.maxDepth() @@ -374,7 +374,7 @@ function diffDescriptors (lhs, rhs, options) { } do { - format(builder, subject, circular) + format(builder, subject, circular, indent.level) subject = stack[topIndex].recursor() } while (subject !== null) } diff --git a/test/diff.js b/test/diff.js index a99151f..8a3e7bb 100644 --- a/test/diff.js +++ b/test/diff.js @@ -485,3 +485,43 @@ test('inverted diffs', t => { baz: 'qux\ncorge\nquux', }, { invert: true })) }) + +test('lists: effectively resets depth when formatting differences', t => { + const l1 = [ + { + b: 'b', + }, + { + d: 'bar', + e: { + f: 'f', + }, + }, + ] + const l2 = [ + { + b: 'b', + }, + ] + t.snapshot(_diff(l1, l2, { maxDepth: 1, theme })) +}) + +test('objects: effectively resets depth when formatting differences', t => { + const o1 = { + a: { + b: 'b', + }, + c: { + d: 'bar', + e: { + f: 'f', + }, + }, + } + const o2 = { + a: { + b: 'b', + }, + } + t.snapshot(_diff(o1, o2, { maxDepth: 1, theme })) +}) diff --git a/test/snapshots/diff.js.md b/test/snapshots/diff.js.md index 597ca63..e54fdc7 100644 --- a/test/snapshots/diff.js.md +++ b/test/snapshots/diff.js.md @@ -1146,3 +1146,27 @@ Generated by [AVA](https://avajs.dev). %diffGutters.actual#- % foo%property.separator#: %%string.line.open#'%%string.diff.insertLine.open%BAR%string.diff.insertLine.close%%string.line.close#'%%property.after#,%␊ %diffGutters.expected#+ % foo%property.separator#: %%string.line.open#'%%string.diff.deleteLine.open%bar%string.diff.deleteLine.close%%string.line.close#'%%property.after#,%␊ %diffGutters.padding# %%object.closeBracket#}%` + +## lists: effectively resets depth when formatting differences + +> Snapshot 1 + + `%diffGutters.padding# %%list.openBracket#[%␊ + %diffGutters.padding# % %object.ctor.open%Object%object.ctor.close% %object.openBracket#{% %maxDepth#…% %object.closeBracket#}%%item.after#,%␊ + %diffGutters.actual#- % %object.openBracket#{%␊ + %diffGutters.actual#- % d%property.separator#: %%string.line.open#'%%string.open%bar%string.close%%string.line.close#'%%property.after#,%␊ + %diffGutters.actual#- % e%property.separator#: %%object.ctor.open%Object%object.ctor.close% %object.openBracket#{% %maxDepth#…% %object.closeBracket#}%%property.after#,%␊ + %diffGutters.actual#- % %object.closeBracket#}%%item.after#,%␊ + %diffGutters.padding# %%list.closeBracket#]%` + +## objects: effectively resets depth when formatting differences + +> Snapshot 1 + + `%diffGutters.padding# %%object.openBracket#{%␊ + %diffGutters.padding# % a%property.separator#: %%object.ctor.open%Object%object.ctor.close% %object.openBracket#{% %maxDepth#…% %object.closeBracket#}%%property.after#,%␊ + %diffGutters.actual#- % c%property.separator#: %%object.openBracket#{%␊ + %diffGutters.actual#- % d%property.separator#: %%string.line.open#'%%string.open%bar%string.close%%string.line.close#'%%property.after#,%␊ + %diffGutters.actual#- % e%property.separator#: %%object.ctor.open%Object%object.ctor.close% %object.openBracket#{% %maxDepth#…% %object.closeBracket#}%%property.after#,%␊ + %diffGutters.actual#- % %object.closeBracket#}%%property.after#,%␊ + %diffGutters.padding# %%object.closeBracket#}%` diff --git a/test/snapshots/diff.js.snap b/test/snapshots/diff.js.snap index c0f50db25a77a330ec06c9c4f64f8d9ea374c3e8..7edc6c403836f01c08f722f9302931bd5905f3d2 100644 GIT binary patch literal 4964 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%0D_3|-qa zPzv?!mErx! zqYxKbP^z7!uC`)@?B9b1dzn0qKP1$+bUo;Vs78u_tF)Z?z!uA;a7zV2r_5{TvZcN3 z1za)8(RzlxtbnAw`X{}gdE6o%6=paE_neK6v8E2AeQUV_zVf=#!pD?O1 z^J!18F`=PXV`ujVUfLEl@@-Lzcw9ISh;obY4@``6`3NE>zR2>}8g(AKI{Nh^=o&oP zg1?4P#8j0Us)&9Ki4FRSf}L;V@&{gd?21X`1BNDl91#spqR8)$apcvE8ah?!6NxDD ze6LES#rIc>v=PWwq+YG2O}Wak2~ENp33vuQg@dhFq(_(_?a;Rss*F(HPNbk6(AzS; zB^xvb?Ar{ZjlGK7smjFw zq|xy;!EFkK+qJEsG3edE_SmFiH!x6izs*1qcpY{(x2GjRZ`v!_-?Y<&Q=m72;&FO2 zgR4bScwIrVYutTi-xD6gxCcDM#1%YWk|Dnik+UY5@@o<9PF7HrNQ3VY-W<{fd~PKQ z{Z#dDPPTqd2F|a^^I2}SEf+Dq@5EPf zuNX|26anuVJmyGsYQij1cYh$oRCTV1nq0A&@ zSo#rd22mrA3{@T}L&w*|SfZp5oq;f_o7b8wRB;0#&p+1uqsw{Yn z&VbWx;w6dXnQ(7k%0W{6&`;R&DU^qPjEqVfyWbG*O-%K6AI*tU*j>s zEmHHU^2o+Ha?`M+2-~eOvNj`Y3xk`yA9HSEBzZ=X7bDKCzlc$XqI59A^i!*E{rLSFatt_($d4*UkV2x_WuB6J>5KfF zFf5rFqIeme%m%4G(e*_hALEEW8h|4E@rl6R*rCY04L(tnWhbk7 z!9q$G-TYtNDywzDLP)IfJ_QT$5o?W#mzZ^SjW04^6&niIjws*yE*5+%25!h|Fh&Kj zsTlSkAaCa{=0{i%)A?R_6D}>XO@-#rGv>@e(OfI$?c;)xG{jEQ5d6p!#Yfe&oi}Ja zK*?I#j5k7n@#>I>i!L#L5HIEfmnjxoA$^9fJm8Om~!6$fa1A?!?SB8$G5a z#-t}Aa);l?!lcKzN)(+j#+drVdid(6O{VL2`d?o|o14aIw~rjDsi_j*7nf1yZ<-2f zA5qjoYbZ(D7z*cJm0>0kXC`)4$6I~1FFkc|dK|Q!?F^$DicXo;{-m|eG%MjCXkvmF z9u6KZrpGSFBsC}ai^Ksc}k!p2ukf9`zQLRFs_5>RfS*jQJnHsHp zMz%~o*3VyWuqNl1$Lquc6-edphXFNfIZsGJ@1W?Wh02t#U`2 zb%wB$QEAd>mn&Wj$2P8{_QaQm)aZ^gNt8Pa6JJdd)=;FoW>~s!IIX19ejP@q4fSfS zv9uJKOH0Z&&~-9H)?{f3t?#F5 zJcPtMN;>>-9Anc6{7|A<&M_MQBO3^=E-2bOPzF#gV-QFVR)i2Dd54_Pu8e-J>Xnv; z!J;x)HIi!j_CZ7Cs8p`!Yz4{Ciq>q8A&XSOotO`1a;V~rs|q3E!~sf4x@f*xhr~n_ zdEXT3x-bk=5UJIN3Zh!o>O+*q!=Ps6+JPKBc^}$|%9=22HW?lk1s*2aTeLPh%@_p? z8x6@qf23#DX#MP%es^dEEg?K>wXK4x-J>)jfEJ({c^|*8zkqBO&3s+aE40NdSEMeB zow9fwIF(Y8*Y?*8?bmS-%coFhW6{0OUdKxFcRO{W`qvh6an&!^YqjM6hHwZ__=D(* z&Q3Gm=fzp}&uhwQFi`D?8sz{gUI7nA!IhRioBXjJkLfT27TPHiqPd+0qVw9CqRc45 z@a6Hhh`?BNuBBDJ_IN@VJX~pkT)>Fi~70 zq%iRdCmSb}UZpHxgb)+OZm)5u462l-h=tjb^dFxe0rKPX-8fC~T91`^kY*?6;10Vr zrR{$qqmm=k512q`P%0C<^Z~y(Y*hBB)btUl8R^Lx>7$2@7@d`#TwIjr`#n)-5RhBg z4p7KCEI3)w@5_s??*@HLK#nn#n1qahpeP1J5_h)2mf!l>m+J)yvf34qGRU0ganmlR z?*l0QVC5sJlW@E7GO1HCf}kQml*d108>wsz6&qUkaZze%GX%qq%|lvfyNgVNVie(R zLXKGOAkXwC_%SIe}5X;-@`0C~L#TqLU9Cpeau2Szgo_pB8y)3njn)U$+ zzv04_GS)niON?vb05+p{(<9AHaArwEg=w2VUlGi$WZh)P5*}2Fv(bl)L;H zpz|q2S^iu^lWHx%h=w4i+3lXXX91nVU03o-)I8YF^}BW8&~49^w8E L+6&&&EffI&PP%Y7