diff options
Diffstat (limited to 'chromium/third_party/node/node_modules/@babel/types/lib/converters/valueToNode.js')
-rw-r--r-- | chromium/third_party/node/node_modules/@babel/types/lib/converters/valueToNode.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/chromium/third_party/node/node_modules/@babel/types/lib/converters/valueToNode.js b/chromium/third_party/node/node_modules/@babel/types/lib/converters/valueToNode.js new file mode 100644 index 00000000000..b3e531b3551 --- /dev/null +++ b/chromium/third_party/node/node_modules/@babel/types/lib/converters/valueToNode.js @@ -0,0 +1,99 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _isValidIdentifier = require("../validators/isValidIdentifier"); + +var _generated = require("../builders/generated"); + +var _default = valueToNode; +exports.default = _default; +const objectToString = Function.call.bind(Object.prototype.toString); + +function isRegExp(value) { + return objectToString(value) === "[object RegExp]"; +} + +function isPlainObject(value) { + if (typeof value !== "object" || value === null || Object.prototype.toString.call(value) !== "[object Object]") { + return false; + } + + const proto = Object.getPrototypeOf(value); + return proto === null || Object.getPrototypeOf(proto) === null; +} + +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 (isRegExp(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 (isPlainObject(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"); +}
\ No newline at end of file |