Skip to content

Commit

Permalink
feat: Provide both range and start & end property on Node
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelDeBoey committed May 18, 2020
1 parent 0f3f065 commit b039d1a
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 16 deletions.
53 changes: 48 additions & 5 deletions __tests__/src/getProp-parser-test.js
Expand Up @@ -61,10 +61,50 @@ function actualTest(parserName, test) {

assert.deepStrictEqual(
adjustLocations(sourceResult, offset),
targetResult,
adjustRangeStartAndEnd(targetResult),
);
}

function adjustRangeStartAndEnd({ name, value: { expression, ...value }, ...node }) {
return {
...adjustNodeRangeStartAndEnd(node),
name: adjustNodeRangeStartAndEnd(name),
value: {
...adjustNodeRangeStartAndEnd(value),
...(expression
? { expression: adjustNodeRangeStartAndEndRecursively(expression) }
: {}
),
},
};
}

function adjustNodeRangeStartAndEnd(node) {
if (!node.loc) {
return node;
}

const [start, end] = node.range || [node.start, node.end];
return {
...node,
end,
range: [start, end],
start,
};
}

function adjustNodeRangeStartAndEndRecursively(node) {
if (Array.isArray(node)) {
return node.map(adjustNodeRangeStartAndEndRecursively);
}

if (Boolean(node) && typeof node === 'object') {
return adjustNodeRangeStartAndEnd(mapValues(node, adjustNodeRangeStartAndEndRecursively));
}

return node;
}

function stripConstructors(value) {
return JSON.parse(JSON.stringify(value));
}
Expand Down Expand Up @@ -96,12 +136,14 @@ function adjustLocations(node, { keyOffset, valueOffset }) {
}

function adjustNodeLocations(node, { startOffset, endOffset }) {
if (!node.loc) return node;
if (!node.loc) {
return node;
}

const [start, end] = node.range || [];
return {
...node,
...(node.start !== undefined ? { start: node.start + startOffset } : {}),
...(node.end !== undefined ? { end: node.end + endOffset } : {}),
end: node.end + endOffset,
loc: {
...node.loc,
start: {
Expand All @@ -113,7 +155,8 @@ function adjustNodeLocations(node, { startOffset, endOffset }) {
column: node.loc.end.column + endOffset,
},
},
...(node.range !== undefined ? { range: [start + startOffset, end + endOffset] } : {}),
range: [start + startOffset, end + endOffset],
start: node.start + startOffset,
};
}

Expand Down
42 changes: 31 additions & 11 deletions src/getProp.js
Expand Up @@ -42,23 +42,43 @@ function propertyToJSXAttribute(node) {
type: 'JSXAttribute',
name: { type: 'JSXIdentifier', name: key.name, ...getBaseProps(key) },
value: value.type === 'Literal'
? value
: { type: 'JSXExpressionContainer', expression: value, ...getBaseProps(value) },
? adjustRangeStartAndEndOfNode(value)
: {
type: 'JSXExpressionContainer',
expression: adjustExpressionRangeStartAndEnd(value),
...getBaseProps(value),
},
...getBaseProps(node),
};
}

function getBaseProps({
start,
end,
loc,
range,
}) {
function adjustRangeStartAndEndOfNode(node) {
const [start, end] = node.range || [node.start, node.end];

return {
...node,
end,
range: [start, end],
start,
};
}

function adjustExpressionRangeStartAndEnd({ expressions, quasis, ...expression }) {
return {
...adjustRangeStartAndEndOfNode(expression),
...(expressions ? { expressions: expressions.map(adjustRangeStartAndEndOfNode) } : {}),
...(quasis ? { quasis: quasis.map(adjustRangeStartAndEndOfNode) } : {}),
};
}

function getBaseProps({ loc, ...node }) {
const { end, range, start } = adjustRangeStartAndEndOfNode(node);

return {
end,
loc: getBaseLocation(loc),
...(start !== undefined ? { start } : {}),
...(end !== undefined ? { end } : {}),
...(range !== undefined ? { range } : {}),
range,
start,
};
}

Expand Down

0 comments on commit b039d1a

Please sign in to comment.