UNPKG

3.79 kBJavaScriptView Raw
1'use strict';
2
3var path = require('path');
4var fs = require('fs');
5var join = require('path').join;
6var format = require('util').format;
7var Package = require('father').SpmPackage;
8var glob = require('glob');
9var semver = require('semver');
10var chalk = require('chalk');
11var mixarg = require('mixarg');
12
13var util = module.exports = {};
14
15util.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
22util.isRelative = function(filepath) {
23 return filepath.charAt(0) === '.';
24};
25
26util.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 * getPkg with lastmodified cache.
38 */
39var pkgCache = {};
40util.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
69function getModuleDir(root) {
70 return fs.existsSync(join(root, 'spm_modules')) ? 'spm_modules' : 'sea-modules';
71}
72
73util.isCSSFile = function(file) {
74 return ['.css', '.less', '.styl', '.sass', '.scss']
75 .indexOf(path.extname(file)) > -1;
76};
77
78util.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
92util.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
99util.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
117util.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
128function getEntries(pkg) {
129 var entries = [];
130 // main
131 entries.push(join(pkg.dest, pkg.main));
132 // outputs
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 // unique
140 return entries.filter(function(item, index, arr) {
141 return index === arr.indexOf(item);
142 });
143}
144
145function 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}