diff --git a/__tests__/src/getProp-parser-test.js b/__tests__/src/getProp-parser-test.js index fc2339b..5af7b26 100644 --- a/__tests__/src/getProp-parser-test.js +++ b/__tests__/src/getProp-parser-test.js @@ -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 (node && typeof node === 'object') { + return adjustNodeRangeStartAndEnd(mapValues(node, adjustNodeRangeStartAndEndRecursively)); + } + + return node; +} + function stripConstructors(value) { return JSON.parse(JSON.stringify(value)); } @@ -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: { @@ -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, }; } diff --git a/package.json b/package.json index 67b849f..d8ea7c6 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "test:watch": "npm run tests-only -- --watch" }, "devDependencies": { - "@babel/parser": "^7.9.6", + "@babel/core": "^7.10.2", + "@babel/parser": "^7.10.2", "babel-cli": "^6.26.0", "babel-core": "^6.26.3", "babel-eslint": "^10.1.0", @@ -26,10 +27,10 @@ "babel-preset-env": "^1.7.0", "babylon": "^6.18.0", "coveralls": "^3.1.0", - "eslint": "^6.8.0", - "eslint-config-airbnb-base": "^14.1.0", - "eslint-plugin-import": "^2.20.2", - "flow-parser": "^0.102.0", + "eslint": "^7.2.0", + "eslint-config-airbnb-base": "^14.2.0", + "eslint-plugin-import": "^2.21.2", + "flow-parser": "^0.126.1", "in-publish": "^2.0.1", "jest": "^20.0.4", "jest-cli": "^20.0.4", diff --git a/src/eventHandlers.js b/src/eventHandlers.js index 45baf36..959e08f 100644 --- a/src/eventHandlers.js +++ b/src/eventHandlers.js @@ -1,4 +1,3 @@ - /** * Common event handlers for JSX element event binding. */ diff --git a/src/getProp.js b/src/getProp.js index b34f635..fafd183 100644 --- a/src/getProp.js +++ b/src/getProp.js @@ -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, }; }