UNPKG

8.21 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.canCompile = canCompile;
5exports.list = list;
6exports.regexify = regexify;
7exports.arrayify = arrayify;
8exports.booleanify = booleanify;
9exports.shouldIgnore = shouldIgnore;
10exports.template = template;
11exports.parseTemplate = parseTemplate;
12// istanbul ignore next
13
14function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }
15
16// istanbul ignore next
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
19
20var _lodashStringEscapeRegExp = require("lodash/string/escapeRegExp");
21
22var _lodashStringEscapeRegExp2 = _interopRequireDefault(_lodashStringEscapeRegExp);
23
24var _lodashStringStartsWith = require("lodash/string/startsWith");
25
26var _lodashStringStartsWith2 = _interopRequireDefault(_lodashStringStartsWith);
27
28var _lodashLangCloneDeep = require("lodash/lang/cloneDeep");
29
30var _lodashLangCloneDeep2 = _interopRequireDefault(_lodashLangCloneDeep);
31
32var _lodashLangIsBoolean = require("lodash/lang/isBoolean");
33
34var _lodashLangIsBoolean2 = _interopRequireDefault(_lodashLangIsBoolean);
35
36var _messages = require("./messages");
37
38var messages = _interopRequireWildcard(_messages);
39
40var _minimatch = require("minimatch");
41
42var _minimatch2 = _interopRequireDefault(_minimatch);
43
44var _lodashCollectionContains = require("lodash/collection/contains");
45
46var _lodashCollectionContains2 = _interopRequireDefault(_lodashCollectionContains);
47
48var _traversal = require("./traversal");
49
50var _traversal2 = _interopRequireDefault(_traversal);
51
52var _lodashLangIsString = require("lodash/lang/isString");
53
54var _lodashLangIsString2 = _interopRequireDefault(_lodashLangIsString);
55
56var _lodashLangIsRegExp = require("lodash/lang/isRegExp");
57
58var _lodashLangIsRegExp2 = _interopRequireDefault(_lodashLangIsRegExp);
59
60var _lodashLangIsEmpty = require("lodash/lang/isEmpty");
61
62var _lodashLangIsEmpty2 = _interopRequireDefault(_lodashLangIsEmpty);
63
64var _helpersParse = require("./helpers/parse");
65
66var _helpersParse2 = _interopRequireDefault(_helpersParse);
67
68var _path = require("path");
69
70var _path2 = _interopRequireDefault(_path);
71
72var _lodashObjectHas = require("lodash/object/has");
73
74var _lodashObjectHas2 = _interopRequireDefault(_lodashObjectHas);
75
76var _fs = require("fs");
77
78var _fs2 = _interopRequireDefault(_fs);
79
80var _types = require("./types");
81
82var t = _interopRequireWildcard(_types);
83
84var _slash = require("slash");
85
86var _slash2 = _interopRequireDefault(_slash);
87
88var _pathExists = require("path-exists");
89
90var _pathExists2 = _interopRequireDefault(_pathExists);
91
92var _util = require("util");
93
94exports.inherits = _util.inherits;
95exports.inspect = _util.inspect;
96
97/**
98 * Test if a filename ends with a compilable extension.
99 */
100
101function canCompile(filename, altExts) {
102 var exts = altExts || canCompile.EXTENSIONS;
103 var ext = _path2["default"].extname(filename);
104 return _lodashCollectionContains2["default"](exts, ext);
105}
106
107/**
108 * Default set of compilable extensions.
109 */
110
111canCompile.EXTENSIONS = [".js", ".jsx", ".es6", ".es"];
112
113/**
114 * Create an array from any value, splitting strings by ",".
115 */
116
117function list(val) {
118 if (!val) {
119 return [];
120 } else if (Array.isArray(val)) {
121 return val;
122 } else if (typeof val === "string") {
123 return val.split(",");
124 } else {
125 return [val];
126 }
127}
128
129/**
130 * Create a RegExp from a string, array, or regexp.
131 */
132
133function regexify(val) {
134 if (!val) return new RegExp(/.^/);
135
136 if (Array.isArray(val)) val = new RegExp(val.map(_lodashStringEscapeRegExp2["default"]).join("|"), "i");
137
138 if (_lodashLangIsString2["default"](val)) {
139 // normalise path separators
140 val = _slash2["default"](val);
141
142 // remove starting wildcards or relative separator if present
143 if (_lodashStringStartsWith2["default"](val, "./") || _lodashStringStartsWith2["default"](val, "*/")) val = val.slice(2);
144 if (_lodashStringStartsWith2["default"](val, "**/")) val = val.slice(3);
145
146 var regex = _minimatch2["default"].makeRe(val, { nocase: true });
147 return new RegExp(regex.source.slice(1, -1), "i");
148 }
149
150 if (_lodashLangIsRegExp2["default"](val)) return val;
151
152 throw new TypeError("illegal type for regexify");
153}
154
155/**
156 * Create an array from a boolean, string, or array, mapped by and optional function.
157 */
158
159function arrayify(val, mapFn) {
160 if (!val) return [];
161 if (_lodashLangIsBoolean2["default"](val)) return arrayify([val], mapFn);
162 if (_lodashLangIsString2["default"](val)) return arrayify(list(val), mapFn);
163
164 if (Array.isArray(val)) {
165 if (mapFn) val = val.map(mapFn);
166 return val;
167 }
168
169 return [val];
170}
171
172/**
173 * Makes boolean-like strings into booleans.
174 */
175
176function booleanify(val) {
177 if (val === "true") return true;
178 if (val === "false") return false;
179 return val;
180}
181
182/**
183 * Tests if a filename should be ignored based on "ignore" and "only" options.
184 */
185
186function shouldIgnore(filename, ignore, only) {
187 filename = _slash2["default"](filename);
188
189 if (only) {
190 var _arr = only;
191
192 for (var _i = 0; _i < _arr.length; _i++) {
193 var pattern = _arr[_i];
194 if (_shouldIgnore(pattern, filename)) return false;
195 }
196 return true;
197 } else if (ignore.length) {
198 var _arr2 = ignore;
199
200 for (var _i2 = 0; _i2 < _arr2.length; _i2++) {
201 var pattern = _arr2[_i2];
202 if (_shouldIgnore(pattern, filename)) return true;
203 }
204 }
205
206 return false;
207}
208
209/**
210 * Returns result of calling function with filename if pattern is a function.
211 * Otherwise returns result of matching pattern Regex with filename.
212 */
213
214function _shouldIgnore(pattern, filename) {
215 if (typeof pattern === "function") {
216 return pattern(filename);
217 } else {
218 return pattern.test(filename);
219 }
220}
221
222/**
223 * A visitor for Babel templates, replaces placeholder references.
224 */
225
226var templateVisitor = {
227
228 /**
229 * 360 NoScope PWNd
230 */
231 noScope: true,
232
233 enter: function enter(node, parent, scope, nodes) {
234 if (t.isExpressionStatement(node)) {
235 node = node.expression;
236 }
237
238 if (t.isIdentifier(node) && _lodashObjectHas2["default"](nodes, node.name)) {
239 this.skip();
240 this.replaceInline(nodes[node.name]);
241 }
242 },
243
244 exit: function exit(node) {
245 _traversal2["default"].clearNode(node);
246 }
247};
248
249/**
250 * Create an instance of a template to use in a transformer.
251 */
252
253function template(name, nodes, keepExpression) {
254 var ast = exports.templates[name];
255 if (!ast) throw new ReferenceError("unknown template " + name);
256
257 if (nodes === true) {
258 keepExpression = true;
259 nodes = null;
260 }
261
262 ast = _lodashLangCloneDeep2["default"](ast);
263
264 if (!_lodashLangIsEmpty2["default"](nodes)) {
265 _traversal2["default"](ast, templateVisitor, null, nodes);
266 }
267
268 if (ast.body.length > 1) return ast.body;
269
270 var node = ast.body[0];
271
272 if (!keepExpression && t.isExpressionStatement(node)) {
273 return node.expression;
274 } else {
275 return node;
276 }
277}
278
279/**
280 * Parse a template.
281 */
282
283function parseTemplate(loc, code) {
284 var ast = _helpersParse2["default"](code, { filename: loc, looseModules: true }).program;
285 ast = _traversal2["default"].removeProperties(ast);
286 return ast;
287}
288
289/**
290 * Load templates from transformation/templates directory.
291 */
292
293function loadTemplates() {
294 var templates = {};
295
296 var templatesLoc = _path2["default"].join(__dirname, "transformation/templates");
297 if (!_pathExists2["default"].sync(templatesLoc)) {
298 throw new ReferenceError(messages.get("missingTemplatesDirectory"));
299 }
300
301 var _arr3 = _fs2["default"].readdirSync(templatesLoc);
302
303 for (var _i3 = 0; _i3 < _arr3.length; _i3++) {
304 var name = _arr3[_i3];
305 if (name[0] === ".") return;
306
307 var key = _path2["default"].basename(name, _path2["default"].extname(name));
308 var loc = _path2["default"].join(templatesLoc, name);
309 var code = _fs2["default"].readFileSync(loc, "utf8");
310
311 templates[key] = parseTemplate(loc, code);
312 }
313
314 return templates;
315}
316
317try {
318 exports.templates = require("../templates.json");
319} catch (err) {
320 if (err.code !== "MODULE_NOT_FOUND") throw err;
321 exports.templates = loadTemplates();
322}
\No newline at end of file