UNPKG

5.47 kBJavaScriptView Raw
1var undef, util = require('util'),
2 path = require('path'),
3 fs = require('fs'),
4 vm = require('vm'),
5 i8n = require('inflection');
6
7exports.html_tag_params = function(params, override) {
8 var maybe_params = '';
9 safe_merge(params, override);
10 for (var key in params) {
11 if (params[key] != undef) {
12 maybe_params += ' ' + key + '="' + params[key].toString().replace(/&/g, '&').replace(/"/g, '"') + '"';
13 }
14 }
15 return maybe_params;
16};
17
18var safe_merge = exports.safe_merge = function(merge_what) {
19 merge_what = merge_what || {};
20 Array.prototype.slice.call(arguments).forEach(function(merge_with, i) {
21 if (i === 0) {
22 return;
23 }
24 for (var key in merge_with) {
25 if (!merge_with.hasOwnProperty(key) || key in merge_what) continue;
26 merge_what[key] = merge_with[key];
27 }
28 });
29 return merge_what;
30};
31
32exports.humanize = function(underscored) {
33 var res = underscored.replace(/_/g, ' ');
34 return res[0].toUpperCase() + res.substr(1);
35};
36
37exports.camelize = function(underscored, upcaseFirstLetter) {
38 var res = '';
39 underscored.split('_').forEach(function(part) {
40 res += part[0].toUpperCase() + part.substr(1);
41 });
42 return upcaseFirstLetter ? res : res[0].toLowerCase() + res.substr(1);
43};
44
45exports.classify = function(str) {
46 return exports.camelize(exports.singularize(str));
47};
48
49exports.underscore = function(camelCaseStr) {
50 var initialUnderscore = camelCaseStr.match(/^_/) ? '_' : '';
51 var str = camelCaseStr
52 .replace(/^_([A-Z])/g, '$1')
53 .replace(/([A-Z])/g, '_$1')
54 .replace(/^_/, initialUnderscore);
55 return str.toLowerCase();
56};
57
58exports.singularize = function singularize(str, singular) {
59 return i8n.singularize(str, singular);
60};
61
62exports.pluralize = function pluralize(str, plural) {
63 return i8n.pluralize(str, plural);
64};
65
66// Stylize a string
67function stylize(str, style) {
68 if (typeof window !== 'undefined') {
69 return str;
70 }
71 var styles = {
72 'bold' : [1, 22],
73 'italic' : [3, 23],
74 'underline' : [4, 24],
75 'cyan' : [96, 39],
76 'blue' : [34, 39],
77 'yellow' : [33, 39],
78 'green' : [32, 39],
79 'red' : [31, 39],
80 'grey' : [90, 39],
81 'green-hi' : [92, 32]
82 };
83 var s = styles[style];
84 return '\033[' + s[0] + 'm' + str + '\033[' + s[1] + 'm';
85}
86
87var $ = function(str) {
88 str = new(String)(str);
89
90 ['bold', 'grey', 'yellow', 'red', 'green', 'cyan', 'blue', 'italic', 'underline'].forEach(function(style) {
91 Object.defineProperty(str, style, {
92 get: function() {
93 return $(stylize(this, style));
94 }
95 });
96 });
97 return str;
98};
99stylize.$ = $;
100exports.stylize = stylize;
101
102var addCoverage = exports.addCoverage = function(code, filename) {
103 if (!global.__cov) return code;
104 return require('semicov').addCoverage(code, filename);
105};
106
107// cache for source code
108var cache = {};
109// cache for compiled scripts
110var scriptCache = {};
111
112function addSpaces(str, len, to_start) {
113 var str_len = str.length;
114 for (var i = str_len; i < len; i += 1) {
115 if (!to_start) {
116 str += ' ';
117 } else {
118 str = ' ' + str;
119 }
120 }
121 return str;
122}
123exports.addSpaces = addSpaces;
124
125function readYaml(file) {
126 try {
127 var yaml = require(['yaml', 'js'].join('-'));
128 var obj = yaml.load(fs.readFileSync(file).toString());
129 if (obj && obj.shift) {
130 obj = obj.shift();
131 }
132 return obj;
133 } catch (e) {
134 console.log('Error in reading', file);
135 console.log(e.message);
136 console.log(e.stack);
137 }
138}
139exports.readYaml = readYaml;
140
141exports.existsSync = fs.existsSync || path.existsSync;
142
143function recursivelyWalkDir(directory, filter, callback) {
144 if(!callback) { callback = filter; filter = null; }
145 var results = [];
146 fs.readdir(directory, function(err, list) {
147 if (err) return callback(err);
148 var pending = list.length;
149 if (!pending) return callback(null, results);
150
151 list.forEach(function(file) {
152 file = directory + '/' + file;
153 fs.stat(file, function(err, stat) {
154 if (stat && stat.isDirectory()) {
155 recursivelyWalkDir(file, filter, function(err, res) {
156 results = results.concat(res);
157 if (!--pending) callback(null, results);
158 });
159 } else {
160 results.push(file);
161 if (!--pending) callback(null, results);
162 }
163 });
164 });
165 });
166}
167exports.recursivelyWalkDir = recursivelyWalkDir;
168
169function ensureDirectoryExists(directory, root) {
170 var dirs = directory.split('/'), dir = dirs.shift();
171 root = (root || '') + dir + '/';
172
173 try { fs.mkdirSync(root); }
174 catch (e) {
175 if(!fs.statSync(root).isDirectory()) throw new Error(e);
176 }
177
178 return !dirs.length || ensureDirectoryExists(dirs.join('/'), root);
179}
180exports.ensureDirectoryExists = ensureDirectoryExists;
181
182exports.inherits = function(constructor, superConstructor, includeClassMethods) {
183 util.inherits(constructor, superConstructor);
184 if (includeClassMethods) {
185 Object.keys(superConstructor).forEach(function(key) {
186 constructor[key] = superConstructor[key];
187 });
188 }
189};