1 | "use strict";
|
---|
2 |
|
---|
3 | Object.defineProperty(exports, "__esModule", {
|
---|
4 | value: true
|
---|
5 | });
|
---|
6 | exports.default = void 0;
|
---|
7 |
|
---|
8 | var _isValidIdentifier = require("../validators/isValidIdentifier");
|
---|
9 |
|
---|
10 | var _generated = require("../builders/generated");
|
---|
11 |
|
---|
12 | var _default = valueToNode;
|
---|
13 | exports.default = _default;
|
---|
14 | const objectToString = Function.call.bind(Object.prototype.toString);
|
---|
15 |
|
---|
16 | function isRegExp(value) {
|
---|
17 | return objectToString(value) === "[object RegExp]";
|
---|
18 | }
|
---|
19 |
|
---|
20 | function isPlainObject(value) {
|
---|
21 | if (typeof value !== "object" || value === null || Object.prototype.toString.call(value) !== "[object Object]") {
|
---|
22 | return false;
|
---|
23 | }
|
---|
24 |
|
---|
25 | const proto = Object.getPrototypeOf(value);
|
---|
26 | return proto === null || Object.getPrototypeOf(proto) === null;
|
---|
27 | }
|
---|
28 |
|
---|
29 | function valueToNode(value) {
|
---|
30 | if (value === undefined) {
|
---|
31 | return (0, _generated.identifier)("undefined");
|
---|
32 | }
|
---|
33 |
|
---|
34 | if (value === true || value === false) {
|
---|
35 | return (0, _generated.booleanLiteral)(value);
|
---|
36 | }
|
---|
37 |
|
---|
38 | if (value === null) {
|
---|
39 | return (0, _generated.nullLiteral)();
|
---|
40 | }
|
---|
41 |
|
---|
42 | if (typeof value === "string") {
|
---|
43 | return (0, _generated.stringLiteral)(value);
|
---|
44 | }
|
---|
45 |
|
---|
46 | if (typeof value === "number") {
|
---|
47 | let result;
|
---|
48 |
|
---|
49 | if (Number.isFinite(value)) {
|
---|
50 | result = (0, _generated.numericLiteral)(Math.abs(value));
|
---|
51 | } else {
|
---|
52 | let numerator;
|
---|
53 |
|
---|
54 | if (Number.isNaN(value)) {
|
---|
55 | numerator = (0, _generated.numericLiteral)(0);
|
---|
56 | } else {
|
---|
57 | numerator = (0, _generated.numericLiteral)(1);
|
---|
58 | }
|
---|
59 |
|
---|
60 | result = (0, _generated.binaryExpression)("/", numerator, (0, _generated.numericLiteral)(0));
|
---|
61 | }
|
---|
62 |
|
---|
63 | if (value < 0 || Object.is(value, -0)) {
|
---|
64 | result = (0, _generated.unaryExpression)("-", result);
|
---|
65 | }
|
---|
66 |
|
---|
67 | return result;
|
---|
68 | }
|
---|
69 |
|
---|
70 | if (isRegExp(value)) {
|
---|
71 | const pattern = value.source;
|
---|
72 | const flags = value.toString().match(/\/([a-z]+|)$/)[1];
|
---|
73 | return (0, _generated.regExpLiteral)(pattern, flags);
|
---|
74 | }
|
---|
75 |
|
---|
76 | if (Array.isArray(value)) {
|
---|
77 | return (0, _generated.arrayExpression)(value.map(valueToNode));
|
---|
78 | }
|
---|
79 |
|
---|
80 | if (isPlainObject(value)) {
|
---|
81 | const props = [];
|
---|
82 |
|
---|
83 | for (const key of Object.keys(value)) {
|
---|
84 | let nodeKey;
|
---|
85 |
|
---|
86 | if ((0, _isValidIdentifier.default)(key)) {
|
---|
87 | nodeKey = (0, _generated.identifier)(key);
|
---|
88 | } else {
|
---|
89 | nodeKey = (0, _generated.stringLiteral)(key);
|
---|
90 | }
|
---|
91 |
|
---|
92 | props.push((0, _generated.objectProperty)(nodeKey, valueToNode(value[key])));
|
---|
93 | }
|
---|
94 |
|
---|
95 | return (0, _generated.objectExpression)(props);
|
---|
96 | }
|
---|
97 |
|
---|
98 | throw new Error("don't know how to turn this value into a node");
|
---|
99 | } |
---|