Add better tests and change the way data masking works.

master
Sir Robert Burbridge 2023-11-17 16:04:42 -05:00
parent c0b3478b00
commit f12afb753a
2 changed files with 77 additions and 14 deletions

View File

@ -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;

View File

@ -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"})
});
});