From f12afb753afff75d2b06b05c01be7cc76db4b94a Mon Sep 17 00:00:00 2001 From: Sir Robert Burbridge Date: Fri, 17 Nov 2023 16:04:42 -0500 Subject: [PATCH] Add better tests and change the way data masking works. --- src/interpolate.mjs | 24 +++++++------- test/interpolate.test.mjs | 67 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/interpolate.mjs b/src/interpolate.mjs index f92b190..c2cf968 100644 --- a/src/interpolate.mjs +++ b/src/interpolate.mjs @@ -12,17 +12,15 @@ export function interpolate(node, rootData, options = {}) { return node; } -function getMaskedData(node, ancestors) { - let masked = { ...node.data }; +function getMaskedData(node, ancestors, mask = {}) { + var foo = Object.assign( + {}, + ...(ancestors.map((ancestor) => (ancestor?.data?.interp || {}))), + node?.data?.interp || {}, + mask + ); - for (let i = ancestors.length - 1; i >= 0; i--) { - const ancestor = ancestors[i]; - if (ancestor.data && ancestor.data.interp) { - masked.interp = { ...ancestor.data.interp, ...masked.interp }; - } - } - - return masked; + return foo; } function interpolateNode(node, ancestors) { @@ -33,11 +31,11 @@ function interpolateNode(node, ancestors) { if (typeof node.properties[key] === 'string') { node.properties[key] = interpolateString( node.properties[key], - data.interp + data ); } else if (Array.isArray(node.properties[key])) { node.properties[key] = node.properties[key].map( - (value) => interpolateString(value, data.interp) + (value) => interpolateString(value, data) ); } else { @@ -47,7 +45,7 @@ function interpolateNode(node, ancestors) { } if (node.type === 'text' && node.value) { - node.value = interpolateString(node.value, data.interp); + node.value = interpolateString(node.value, data); } return node; diff --git a/test/interpolate.test.mjs b/test/interpolate.test.mjs index 12a0f50..ca1590f 100644 --- a/test/interpolate.test.mjs +++ b/test/interpolate.test.mjs @@ -56,7 +56,7 @@ describe("interpolate()", () => { const node = { data: { interp: { test: 'value' } } }; const ancestors = [{ data: { interp: { parentValue: 'parent' } } }]; const maskedData = __testExports.getMaskedData(node, ancestors); - expect(maskedData.interp).toEqual({ parentValue: 'parent', test: 'value' }); + expect(maskedData).toEqual({ parentValue: 'parent', test: 'value' }); }); }); @@ -191,3 +191,68 @@ describe("interpolate()", () => { }) }); + +describe("getMaskedData()", () => { + it("should import", () => { + expect(__testExports.getMaskedData).toBeDefined(); + }) + + it("should shadow ancestor data with current node data", () => { + const maskedData = __testExports.getMaskedData( + { + data: { interp: { foo: "child" } }, + }, + // Give a list of ancestors. + [ + { data: { interp: { foo: "root" } } }, + { data: { interp: { foo: "parent" } } }, + ], + ); + + expect(maskedData).toEqual({foo: "child"}) + }); + + it("should shadow ancestor data with current node data", () => { + const maskedData = __testExports.getMaskedData( + { + data: { interp: { foo: "child" } }, + }, + // Give a list of ancestors. + [ + { data: { interp: { foo: "root" } } }, + { data: { interp: { foo: "parent" } } }, + ], + ); + + expect(maskedData).toEqual({foo: "child"}) + }); + + it("should shadow earlier ancestors with later ancestor data", () => { + const maskedData = __testExports.getMaskedData( + { + data: { interp: {} }, + }, + // Give a list of ancestors. + [ + { data: { interp: { foo: "root" } } }, + { data: { interp: { foo: "parent" } } }, + ], + ); + + expect(maskedData).toEqual({foo: "parent"}) + }); + + it("should shadow earlier ancestors without current data", () => { + const maskedData = __testExports.getMaskedData( + { data: {} }, + // Give a list of ancestors. + [ + { data: { interp: { foo: "root" } } }, + { data: { interp: { foo: "parent" } } }, + ], + ); + + expect(maskedData).toEqual({foo: "parent"}) + }); + +});