1 | 'use strict';
|
2 |
|
3 | var path = require('path');
|
4 | var fs = require('fs');
|
5 | var join = require('path').join;
|
6 | var format = require('util').format;
|
7 | var Package = require('father').SpmPackage;
|
8 | var glob = require('glob');
|
9 | var semver = require('semver');
|
10 | var chalk = require('chalk');
|
11 | var mixarg = require('mixarg');
|
12 |
|
13 | var util = module.exports = {};
|
14 |
|
15 | util.template = function(format, data) {
|
16 | if (!format) return '';
|
17 | return format.replace(/{{([a-z]*)}}/g, function(all, match) {
|
18 | return data[match] || '';
|
19 | });
|
20 | };
|
21 |
|
22 | util.isRelative = function(filepath) {
|
23 | return filepath.charAt(0) === '.';
|
24 | };
|
25 |
|
26 | util.define = function(id, str) {
|
27 | if (!str) {
|
28 | str = id;
|
29 | id = '';
|
30 | }
|
31 | id = id ? '\'' + id.replace(/\.js$/, '') + '\', ' : '';
|
32 | return format('define(%sfunction(require, exports, module){\n%s\n});\n',
|
33 | id, String(str));
|
34 | };
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | var pkgCache = {};
|
40 | util.getPackage = function(root) {
|
41 | var file = join(root, 'package.json');
|
42 | if (!fs.existsSync(file)) {
|
43 | return null;
|
44 | }
|
45 | var mtime = +new Date(fs.statSync(file).mtime);
|
46 | var data = pkgCache[root];
|
47 | if (!data || data.mtime !== mtime) {
|
48 | var pkg;
|
49 | try {
|
50 | var originPkg = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
51 | var args = mixarg(originPkg && originPkg.spm && originPkg.spm.buildArgs || '');
|
52 | pkg = new Package(root, {
|
53 | moduleDir: getModuleDir(root),
|
54 | skip: Object.keys(getGlobal(args.global))
|
55 | });
|
56 | } catch(e) {
|
57 | console.error(chalk.red('Package Parse Error:'), e.message);
|
58 | return null;
|
59 | }
|
60 |
|
61 | data = pkgCache[root] = {
|
62 | mtime: mtime,
|
63 | pkg: pkg
|
64 | };
|
65 | }
|
66 | return data.pkg;
|
67 | };
|
68 |
|
69 | function getModuleDir(root) {
|
70 | return fs.existsSync(join(root, 'spm_modules')) ? 'spm_modules' : 'sea-modules';
|
71 | }
|
72 |
|
73 | util.isCSSFile = function(file) {
|
74 | return ['.css', '.less', '.styl', '.sass', '.scss']
|
75 | .indexOf(path.extname(file)) > -1;
|
76 | };
|
77 |
|
78 | util.getModifiedTime = function getModifiedTime(file) {
|
79 | var ftime = mtime(file.path);
|
80 | var ptime = mtime(join(file.base, 'package.json'));
|
81 | return Math.max(ftime, ptime);
|
82 |
|
83 | function mtime(filepath) {
|
84 | if (fs.existsSync(filepath)) {
|
85 | return new Date(fs.statSync(filepath).mtime);
|
86 | } else {
|
87 | return 0;
|
88 | }
|
89 | }
|
90 | };
|
91 |
|
92 | util.isModified = function(headers, modifiedTime) {
|
93 | if (!headers || !headers['if-modified-since']) {
|
94 | return true;
|
95 | }
|
96 | return modifiedTime > +new Date(+headers['if-modified-since']);
|
97 | };
|
98 |
|
99 | util.isStandalone = function(file) {
|
100 | if (path.extname(file.path) !== '.js') {
|
101 | return false;
|
102 | }
|
103 |
|
104 | var pkg = file.pkg;
|
105 | var spm = pkg.origin.spm || {};
|
106 | var buildArgs = spm.buildArgs || '';
|
107 | if (['standalone', 'umd'].indexOf(buildArgs.include) === -1 &&
|
108 | !spm.standalone && !spm.umd &&
|
109 | !buildArgs.standalone && !buildArgs.umd) {
|
110 | return false;
|
111 | }
|
112 |
|
113 | var entries = getEntries(pkg);
|
114 | return entries.indexOf(file.path) > -1;
|
115 | };
|
116 |
|
117 | util.matchNameVersion = function(pathname) {
|
118 | var m = pathname.match(/^\/(.+?)\/(.+?)\/(.*)/);
|
119 | if (m && m[0] && semver.valid(m[2])) {
|
120 | return {
|
121 | name: m[1],
|
122 | version: m[2],
|
123 | file: m[3]
|
124 | };
|
125 | }
|
126 | };
|
127 |
|
128 | function getEntries(pkg) {
|
129 | var entries = [];
|
130 |
|
131 | entries.push(join(pkg.dest, pkg.main));
|
132 |
|
133 | (pkg.origin.spm.output || []).forEach(function(output) {
|
134 | var items = glob.sync(output, {cwd:pkg.dest});
|
135 | items.forEach(function(item) {
|
136 | entries.push(join(pkg.dest, item));
|
137 | });
|
138 | });
|
139 |
|
140 | return entries.filter(function(item, index, arr) {
|
141 | return index === arr.indexOf(item);
|
142 | });
|
143 | }
|
144 |
|
145 | function getGlobal(str) {
|
146 | if (({}).toString.call(str) === '[object Object]') return str;
|
147 | if (typeof str !== 'string') return {};
|
148 |
|
149 | var ret = {};
|
150 | str.split(/\s*,\s*/).forEach(function(item) {
|
151 | var m = item.split(':');
|
152 | ret[m[0]] = m[1];
|
153 | });
|
154 | return ret;
|
155 | }
|