From 04e8781ac249f67ce42446ae1ac6a32eb3c673f6 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Wed, 5 May 2021 15:53:45 -0400 Subject: [PATCH 1/3] Avoid direct pushes to map items in parse Avoid skipping e.g. sort and overwrite behavior --- src/compose/resolve-block-map.ts | 4 ++-- src/compose/resolve-flow-collection.ts | 2 +- src/doc/createNode.ts | 2 +- src/schema/common/map.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compose/resolve-block-map.ts b/src/compose/resolve-block-map.ts index 9fc8f7fe..837f61d3 100644 --- a/src/compose/resolve-block-map.ts +++ b/src/compose/resolve-block-map.ts @@ -94,7 +94,7 @@ export function resolveBlockMap( ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep, null, valueProps, onError) offset = valueNode.range[2] - map.items.push(new Pair(keyNode, valueNode)) + map.add(new Pair(keyNode, valueNode), ctx.schema.merge) } else { // key with no value if (implicitKey) @@ -107,7 +107,7 @@ export function resolveBlockMap( if (keyNode.comment) keyNode.comment += '\n' + valueProps.comment else keyNode.comment = valueProps.comment } - map.items.push(new Pair(keyNode)) + map.add(new Pair(keyNode), ctx.schema.merge) } } diff --git a/src/compose/resolve-flow-collection.ts b/src/compose/resolve-flow-collection.ts index 00ad2859..3f97e33e 100644 --- a/src/compose/resolve-flow-collection.ts +++ b/src/compose/resolve-flow-collection.ts @@ -173,7 +173,7 @@ export function resolveFlowCollection( else { const map = new YAMLMap(ctx.schema) map.flow = true - map.items.push(pair) + map.add(pair, ctx.schema.merge) ;(coll as YAMLSeq).items.push(map) } offset = valueNode ? valueNode.range[2] : valueProps.end diff --git a/src/doc/createNode.ts b/src/doc/createNode.ts index b2a0f2bc..db2e4e06 100644 --- a/src/doc/createNode.ts +++ b/src/doc/createNode.ts @@ -39,7 +39,7 @@ export function createNode( if (isNode(value)) return value as Node if (isPair(value)) { const map = ctx.schema[MAP].createNode?.(ctx.schema, null, ctx) as YAMLMap - map.items.push(value) + map.add(value) return map } if ( diff --git a/src/schema/common/map.ts b/src/schema/common/map.ts index aab66b10..4f0dd50f 100644 --- a/src/schema/common/map.ts +++ b/src/schema/common/map.ts @@ -12,7 +12,7 @@ function createMap(schema: Schema, obj: unknown, ctx: CreateNodeContext) { if (typeof replacer === 'function') value = replacer.call(obj, key, value) else if (Array.isArray(replacer) && !replacer.includes(key)) return if (value !== undefined || keepUndefined) - map.items.push(createPair(key, value, ctx)) + map.add(createPair(key, value, ctx), schema.merge) } if (obj instanceof Map) { for (const [key, value] of obj) add(key, value) From cb33883b6b2ea4b5676eb6b561c46bc92853cc17 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Wed, 5 May 2021 16:00:59 -0400 Subject: [PATCH 2/3] Update expected test result for merged parse --- tests/doc/anchors.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/doc/anchors.js b/tests/doc/anchors.js index dcc04876..e30fbdb2 100644 --- a/tests/doc/anchors.js +++ b/tests/doc/anchors.js @@ -245,7 +245,7 @@ y: { k0: 'v1', k1: 'v1' }, { k1: 'v2', k2: 'v2' } ], - y: { k0: 'v0', k1: 'v1', k2: 'v2' } + y: { k0: 'v0', k1: 'v2', k2: 'v2' } } const expMap = new Map([ @@ -266,7 +266,7 @@ y: 'y', new Map([ ['k0', 'v0'], - ['k1', 'v1'], + ['k1', 'v2'], ['k2', 'v2'] ]) ] From 23b87d018ac7e51ed35c56f4903e4dc9730835c9 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Wed, 5 May 2021 16:04:02 -0400 Subject: [PATCH 3/3] Add test case for sortMapEntries from parseDocument --- tests/doc/stringify.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/doc/stringify.js b/tests/doc/stringify.js index 14f988bc..95d5f7b0 100644 --- a/tests/doc/stringify.js +++ b/tests/doc/stringify.js @@ -588,6 +588,10 @@ describe('sortMapEntries', () => { doc.set('bb', 4) expect(String(doc)).toBe('a: 1\nb: 2\nbb: 4\nc: 3\n') }) + test('parseDocument', () => { + const doc = YAML.parseDocument(YAML.stringify(obj), { sortMapEntries: true }) + expect(String(doc)).toBe('a: 1\nb: 2\nc: 3\n') + }) }) describe('custom indent', () => {