UNPKG

5.05 kBJavaScriptView Raw
1"use strict";
2
3function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
4
5var FALLBACK_HANDLER = Symbol("fallback handler");
6
7module.exports = function (_ref) {
8 var t = _ref.types;
9
10 var undef = t.unaryExpression("void", t.numericLiteral(0));
11
12 function isUndef(ob) {
13 return ob === undefined || t.isIdentifier(ob, { name: "undefined" }) || t.isUnaryExpression(ob, { operator: "void" });
14 }
15
16 function defaultZero(cb) {
17 return function () {
18 var i = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : t.numericLiteral(0);
19
20 if (t.isNumericLiteral(i)) {
21 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
22 args[_key - 1] = arguments[_key];
23 }
24
25 return cb.call.apply(cb, [this, this, i.value].concat(args));
26 }
27 };
28 }
29
30 return {
31 ArrayExpression: {
32 members: {
33 length() {
34 return t.numericLiteral(this.elements.length);
35 },
36 [FALLBACK_HANDLER](i) {
37 if (typeof i === "number" || i.match(/^\d+$/)) {
38 return this.elements[i] || undef;
39 }
40 }
41 },
42 calls: {
43 concat() {
44 var _elements;
45
46 for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
47 args[_key2] = arguments[_key2];
48 }
49
50 return t.arrayExpression((_elements = this.elements).concat.apply(_elements, _toConsumableArray(args.map(function (arg) {
51 if (t.isArrayExpression(arg)) return arg.elements;
52 return arg;
53 }))));
54 },
55 join() {
56 var sep = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : t.stringLiteral(",");
57
58 if (!t.isStringLiteral(sep)) return;
59 var bad = false;
60 var str = this.elements.map(function (el) {
61 if (!t.isLiteral(el)) {
62 bad = true;
63 return;
64 }
65 return el.value;
66 }).join(sep.value);
67 return bad ? undefined : t.stringLiteral(str);
68 },
69 push() {
70 return t.numericLiteral(this.elements.length + arguments.length);
71 },
72 shift() {
73 if (this.elements.length === 0) {
74 return undef;
75 }
76 return t.numericLiteral(this.elements.length - 1);
77 },
78 slice() {
79 var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : t.numericLiteral(0);
80 var end = arguments[1];
81
82 if (!t.isNumericLiteral(start) || end && !t.isNumericLiteral(end)) {
83 return;
84 }
85 return t.arrayExpression(this.elements.slice(start.value, end && end.value));
86 },
87 pop() {
88 return this.elements[this.elements.length - 1] || undef;
89 },
90 reverse() {
91 return t.arrayExpression(this.elements.reverse());
92 },
93 splice(start, end) {
94 var _elements$slice;
95
96 if (!t.isNumericLiteral(start) || end && !t.isNumericLiteral(end)) {
97 return;
98 }
99
100 for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
101 args[_key3 - 2] = arguments[_key3];
102 }
103
104 if (end) {
105 args.unshift(end.value);
106 }
107 return t.arrayExpression((_elements$slice = this.elements.slice()).splice.apply(_elements$slice, [start.value].concat(args)));
108 }
109 }
110 },
111 StringLiteral: {
112 members: {
113 length() {
114 return t.numericLiteral(this.value.length);
115 },
116 [FALLBACK_HANDLER](i) {
117 if (typeof i === "number" || i.match(/^\d+$/)) {
118 var ch = this.value[i];
119 return ch ? t.stringLiteral(ch) : undef;
120 }
121 }
122 },
123 calls: {
124 split() {
125 var sep = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undef;
126
127 var realSep = null;
128 if (t.isStringLiteral(sep)) {
129 realSep = sep.value;
130 }
131 if (isUndef(sep)) {
132 realSep = sep;
133 }
134 if (realSep !== null) {
135 return t.arrayExpression(this.value.split(realSep).map(function (str) {
136 return t.stringLiteral(str);
137 }));
138 }
139 },
140 charAt: defaultZero(function (_ref2, i) {
141 var value = _ref2.value;
142 return t.stringLiteral(value.charAt(i));
143 }),
144 charCodeAt: defaultZero(function (_ref3, i) {
145 var value = _ref3.value;
146 return t.numericLiteral(value.charCodeAt(i));
147 }),
148 codePointAt: defaultZero(function (_ref4, i) {
149 var value = _ref4.value;
150 return t.numericLiteral(value.codePointAt(i));
151 })
152 }
153 }
154 };
155};
156module.exports.FALLBACK_HANDLER = FALLBACK_HANDLER;
\No newline at end of file