UNPKG

4.1 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4var path = require('path');
5var debug = require('debug')('base:generators');
6var utils = require('lazy-cache')(require);
7var fn = require;
8require = utils; // eslint-disable-line
9
10/**
11 * Utils
12 */
13
14require('async-each-series', 'eachSeries');
15require('base-compose', 'compose');
16require('base-cwd', 'cwd');
17require('base-data', 'data');
18require('base-env', 'env');
19require('base-option', 'option');
20require('base-pkg', 'pkg');
21require('base-plugins', 'plugins');
22require('base-task', 'task');
23require('define-property', 'define');
24require('extend-shallow', 'extend');
25require('global-modules', 'gm');
26require('is-valid-app', 'isValid');
27require('is-valid-instance');
28require('kind-of', 'typeOf');
29require('mixin-deep', 'merge');
30require = fn; // eslint-disable-line
31
32/**
33 * Cache lookups
34 */
35
36var lookupCache = {};
37
38/**
39 * Returns true if a task or array of tasks is valid
40 */
41
42utils.isValidTasks = function(val) {
43 if (!val) return false;
44 if (utils.isString(val)) {
45 return !/\W/.test(val);
46 }
47 if (!Array.isArray(val)) {
48 return false;
49 }
50 return val.every(function(str) {
51 return utils.isString(str) && !/\W/.test(str);
52 });
53};
54
55utils.isGenerator = function(val) {
56 return utils.isApp(val, 'Generator');
57};
58
59utils.isApp = function(val, ctorName) {
60 return utils.isObject(val) && val['is' + ctorName] === true;
61};
62
63/**
64 * Return true if `val` is a string with length greater than zero.
65 */
66
67utils.isString = function(val) {
68 return val && typeof val === 'string';
69};
70
71/**
72 * Create an array of tasks
73 */
74
75utils.toArray = function(val) {
76 if (Array.isArray(val)) {
77 return val.reduce(function(acc, str) {
78 return acc.concat(utils.toArray(str));
79 }, []);
80 }
81 if (utils.isString(val)) {
82 return val.split(',');
83 }
84 return [];
85};
86
87/**
88 * Cast `val` to an array
89 */
90
91utils.arrayify = function(val) {
92 return val ? (Array.isArray(val) ? val : [val]) : [];
93};
94
95/**
96 * Returns true if `val` is an object
97 */
98
99utils.isObject = function(val) {
100 return utils.typeOf(val) === 'object';
101};
102
103/**
104 * Return true if `filepath` exists on the file system
105 */
106
107utils.exists = function(name) {
108 if (lookupCache.hasOwnProperty(name)) {
109 return lookupCache[name];
110 }
111
112 function set(name, fp) {
113 if (name) lookupCache[name] = true;
114 if (fp) lookupCache[fp] = true;
115 }
116
117 try {
118 fs.lstatSync(name);
119 set(name);
120 return true;
121 } catch (err) {};
122
123 try {
124 var fp = path.resolve('node_modules', name);
125 if (lookupCache[fp]) return true;
126
127 fs.lstatSync(fp);
128 set(name, fp);
129 return true;
130 } catch (err) {}
131
132 try {
133 fp = path.resolve(utils.gm, name);
134 if (lookupCache[fp]) return true;
135 fs.lstatSync(fp);
136 set(name, fp);
137 return true;
138 } catch (err) {}
139
140 lookupCache[name] = false;
141 return false;
142};
143
144/**
145 * Handle generator errors
146 */
147
148utils.handleError = function(app, name, next) {
149 return function(err) {
150 if (!err) {
151 next();
152 return;
153 }
154
155 var msg = utils.formatError(err, app, name);
156 if (!msg) {
157 next();
158 return;
159 }
160
161 if (msg instanceof Error) {
162 next(err);
163 return;
164 }
165
166 next(new Error(msg));
167 };
168};
169
170utils.formatError = function(err, app, name) {
171 if (err instanceof Error) {
172 var match = /task "(.*?)" is not registered/.exec(err.message);
173 if (!match) {
174 return err;
175 }
176
177 var taskname = match[1];
178 if (taskname === 'default') {
179 return;
180 }
181
182 if (~name.indexOf(':')) {
183 var segs = name.split(':');
184 taskname = segs[1];
185 name = segs[0];
186 }
187 }
188
189 var msg = 'Cannot find ';
190 var gen = app.getGenerator(name);
191 if (gen && name !== taskname) {
192 msg += 'task: "' + taskname + (name !== 'this' ? '" in generator' : '');
193 } else {
194 // don't error when a `default` generator is not defined
195 if (name === 'default') {
196 return;
197 }
198 msg += 'generator';
199 }
200
201 msg += (name !== 'this' ? ': "' + name + '"' : '');
202
203 var cwd = app.get('options.cwd');
204 if (cwd) msg += ' in "' + cwd + '"';
205 return msg;
206};
207
208/**
209 * Expose `utils`
210 */
211
212module.exports = utils;