1 | var minimatch = require('minimatch'),
|
2 | fs = require('fs'),
|
3 | path = require('path'),
|
4 | _ = require('lodash');
|
5 |
|
6 |
|
7 | function 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 |
|
23 | module.exports = util = {
|
24 |
|
25 | |
26 |
|
27 |
|
28 | matchers: [
|
29 |
|
30 | { pattern: /(<script\s[^>]*?src=["'])([\s\S]+?)(["'][^>]*>\s*<\/script>)/gi, fallback: true },
|
31 |
|
32 | { pattern: /(<script\s[^>]*?src=)([\s\S]+?)((?:>|\s[^>]*>)\s*<\/script>)/gi, fallback: true },
|
33 |
|
34 |
|
35 | { pattern: /(<link\s[^>]*?href=["'])([\s\S]+?)(["'][^>]*>(?:\s*<\/link>)?)/gi, fallback: true },
|
36 |
|
37 | { pattern: /(<link\s[^>]*?href=)([\s\S]+?)((?:>|\s[^>]*>)(?:\s*<\/link>)?)/gi, fallback: true },
|
38 |
|
39 |
|
40 | { pattern: /(<img\s[^>]*?src=["'])(.+?)(["'][^>]*>)/gi, fallback: false },
|
41 |
|
42 | { pattern: /(<img\s[^>]*?src=)(.+?)((?:>|\s[^>]*>))/gi, fallback: false },
|
43 |
|
44 |
|
45 | { pattern: /(url\(['"]?)(.+?)(['"]?\))/gi, fallback: false }
|
46 | ],
|
47 |
|
48 | findFileInfo: function(url, opts) {
|
49 | try {
|
50 | url = decodeURIComponent(url);
|
51 | } catch(e) {
|
52 |
|
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 | };
|