| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = valueToNode; |
| |
| var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject")); |
| |
| var _isRegExp = _interopRequireDefault(require("lodash/isRegExp")); |
| |
| var _isValidIdentifier = _interopRequireDefault(require("../validators/isValidIdentifier")); |
| |
| var _generated = require("../builders/generated"); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function valueToNode(value) { |
| if (value === undefined) { |
| return (0, _generated.identifier)("undefined"); |
| } |
| |
| if (value === true || value === false) { |
| return (0, _generated.booleanLiteral)(value); |
| } |
| |
| if (value === null) { |
| return (0, _generated.nullLiteral)(); |
| } |
| |
| if (typeof value === "string") { |
| return (0, _generated.stringLiteral)(value); |
| } |
| |
| if (typeof value === "number") { |
| let result; |
| |
| if (Number.isFinite(value)) { |
| result = (0, _generated.numericLiteral)(Math.abs(value)); |
| } else { |
| let numerator; |
| |
| if (Number.isNaN(value)) { |
| numerator = (0, _generated.numericLiteral)(0); |
| } else { |
| numerator = (0, _generated.numericLiteral)(1); |
| } |
| |
| result = (0, _generated.binaryExpression)("/", numerator, (0, _generated.numericLiteral)(0)); |
| } |
| |
| if (value < 0 || Object.is(value, -0)) { |
| result = (0, _generated.unaryExpression)("-", result); |
| } |
| |
| return result; |
| } |
| |
| if ((0, _isRegExp.default)(value)) { |
| const pattern = value.source; |
| const flags = value.toString().match(/\/([a-z]+|)$/)[1]; |
| return (0, _generated.regExpLiteral)(pattern, flags); |
| } |
| |
| if (Array.isArray(value)) { |
| return (0, _generated.arrayExpression)(value.map(valueToNode)); |
| } |
| |
| if ((0, _isPlainObject.default)(value)) { |
| const props = []; |
| |
| for (const key of Object.keys(value)) { |
| let nodeKey; |
| |
| if ((0, _isValidIdentifier.default)(key)) { |
| nodeKey = (0, _generated.identifier)(key); |
| } else { |
| nodeKey = (0, _generated.stringLiteral)(key); |
| } |
| |
| props.push((0, _generated.objectProperty)(nodeKey, valueToNode(value[key]))); |
| } |
| |
| return (0, _generated.objectExpression)(props); |
| } |
| |
| throw new Error("don't know how to turn this value into a node"); |
| } |