diff --git a/packages/babel-types/src/converters/valueToNode.js b/packages/babel-types/src/converters/valueToNode.js index 85aca82e0a..a4f195765c 100644 --- a/packages/babel-types/src/converters/valueToNode.js +++ b/packages/babel-types/src/converters/valueToNode.js @@ -12,6 +12,8 @@ import { arrayExpression, objectProperty, objectExpression, + unaryExpression, + binaryExpression, } from "../builders/generated"; export default function valueToNode(value: any): Object { @@ -37,7 +39,27 @@ export default function valueToNode(value: any): Object { // numbers if (typeof value === "number") { - return numericLiteral(value); + let result; + if (Number.isFinite(value)) { + result = numericLiteral(Math.abs(value)); + } else { + let numerator; + if (Number.isNaN(value)) { + // NaN + numerator = numericLiteral(0); + } else { + // Infinity / -Infinity + numerator = numericLiteral(1); + } + + result = binaryExpression("/", numerator, numericLiteral(0)); + } + + if (value < 0 || Object.is(value, -0)) { + result = unaryExpression("-", result); + } + + return result; } // regexes diff --git a/packages/babel-types/test/converters.js b/packages/babel-types/test/converters.js index f3966c7f3a..29c9abb378 100644 --- a/packages/babel-types/test/converters.js +++ b/packages/babel-types/test/converters.js @@ -19,8 +19,29 @@ describe("converters", function() { describe("valueToNode", function() { it("number", function() { expect(t.valueToNode(Math.PI)).toEqual(t.numericLiteral(Math.PI)); - expect(t.valueToNode(-Infinity)).toEqual(t.numericLiteral(-Infinity)); - expect(t.valueToNode(NaN)).toEqual(t.numericLiteral(NaN)); + expect(t.valueToNode(-Math.PI)).toEqual( + t.unaryExpression("-", t.numericLiteral(Math.PI)), + ); + expect(t.valueToNode(0)).toEqual(t.numericLiteral(0)); + expect(t.valueToNode(-0)).toEqual( + t.unaryExpression("-", t.numericLiteral(0)), + ); + expect(t.valueToNode(NaN)).toEqual( + t.binaryExpression("/", t.numericLiteral(0), t.numericLiteral(0)), + ); + expect(t.valueToNode(-NaN)).toEqual( + t.binaryExpression("/", t.numericLiteral(0), t.numericLiteral(0)), + ); + + expect(t.valueToNode(Infinity)).toEqual( + t.binaryExpression("/", t.numericLiteral(1), t.numericLiteral(0)), + ); + expect(t.valueToNode(-Infinity)).toEqual( + t.unaryExpression( + "-", + t.binaryExpression("/", t.numericLiteral(1), t.numericLiteral(0)), + ), + ); }); it("string", function() { expect(t.valueToNode('This is a "string"')).toEqual(