UNPKG

3.31 kBJavaScriptView Raw
1var minimatch = require('minimatch'),
2 fs = require('fs'),
3 path = require('path'),
4 _ = require('lodash');
5
6
7function getBowerRoot(opts) {
8 if(!opts._bowerRoot) {
9 opts._bowerRoot = './bower_components';
10 var bowerrc;
11 if(opts.bowerComponents) {
12 opts._bowerRoot = opts.bowerComponents;
13 } else if(fs.existsSync('./.bowerrc')) {
14 bowerrc = JSON.parse(require('fs').readFileSync('./.bowerrc', {encoding: 'utf8'}));
15 if(bowerrc && bowerrc.directory) {
16 opts._bowerRoot = path.join('.', bowerrc.directory);
17 }
18 }
19 }
20 return opts._bowerRoot;
21}
22
23module.exports = util = {
24
25 /**
26 * Matchers for various tags and CSS properties that we might replace
27 */
28 matchers: [
29 // script with quoted src
30 { pattern: /(<script\s[^>]*?src=["'])([\s\S]+?)(["'][^>]*>\s*<\/script>)/gi, fallback: true },
31 // script with unquoted src
32 { pattern: /(<script\s[^>]*?src=)([\s\S]+?)((?:>|\s[^>]*>)\s*<\/script>)/gi, fallback: true },
33
34 // link with quoted href and optional end tag
35 { pattern: /(<link\s[^>]*?href=["'])([\s\S]+?)(["'][^>]*>(?:\s*<\/link>)?)/gi, fallback: true },
36 // link with unquoted href and optional end tag
37 { pattern: /(<link\s[^>]*?href=)([\s\S]+?)((?:>|\s[^>]*>)(?:\s*<\/link>)?)/gi, fallback: true },
38
39 // img with quoted src
40 { pattern: /(<img\s[^>]*?src=["'])(.+?)(["'][^>]*>)/gi, fallback: false },
41 // img with unquoted src
42 { pattern: /(<img\s[^>]*?src=)(.+?)((?:>|\s[^>]*>))/gi, fallback: false },
43
44 // URL matcher for CSS
45 { pattern: /(url\(['"]?)(.+?)(['"]?\))/gi, fallback: false }
46 ],
47
48 findFileInfo: function(url, opts) {
49 try {
50 url = decodeURIComponent(url);
51 } catch(e) {
52 //Invalid URL ignore
53 return;
54 }
55 url = path.join(opts.relativeRoot, url);
56 return _.find(opts.files, function(fileInfo) {
57 return minimatch(url, fileInfo.file);
58 });
59 },
60
61 getFilenameMin: function(url, opts) {
62 url = path.basename(url);
63 if(opts.allowRev) {
64 url = url.replace(/-\w{8}(\..+)$/, '$1');
65 }
66 url = url.replace(/(\.min)?(\..+)$/, '.min$2');
67 return url;
68 },
69
70 getVersionInfo: function(fileInfo, opts) {
71 var pkg = fileInfo.package;
72 if(!pkg) return {};
73 if(!opts._versionInfoCache) opts._versionInfoCache = {};
74 if(!opts._versionInfoCache[pkg]) {
75 var packageInfo = fileInfo, version, versionClean, packageRoot = path.join(process.cwd(), getBowerRoot(opts), pkg);
76 if(!packageInfo.version && fs.existsSync(path.join(packageRoot, 'bower.json'))) {
77 packageInfo = require(path.join(packageRoot, 'bower.json'));
78 }
79 if(!packageInfo.version && fs.existsSync(path.join(packageRoot, '.bower.json'))) {
80 packageInfo = require(path.join(packageRoot, '.bower.json'));
81 }
82 if(!packageInfo.version) {
83 throw new Error('Unable to load version from bower.json for package "'+pkg+'". Looked under "'+packageRoot+'"');
84 }
85 version = (packageInfo.version || '0.0.0').match(/(\w+)?(?:\.(\w+))?(?:\.(\w+))?/);
86 versionClean = version[1] || 0;
87 if(version[2].length > 0) {
88 versionClean += '.' + version[2];
89 }
90 if(version[3].length > 0) {
91 versionClean += '.' + version[3];
92 }
93 opts._versionInfoCache[pkg] = {
94 version: versionClean,
95 versionFull: packageInfo.version || '0.0.0',
96 major: version[1] || 0,
97 minor: version[2] || 0,
98 patch: version[3] || 0
99 };
100 }
101 return opts._versionInfoCache[pkg];
102 }
103};