Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
136 lines (111 loc) · 3.14 KB
/
Copy pathindex.js
File metadata and controls
136 lines (111 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
'use strict';
var path = require('path');
var defaults = require('lodash.defaults');
var through = require('through2');
var requirejs = require('requirejs');
var chalk = require('chalk');
var Vinyl = require('vinyl');
var log = require('fancy-log');
var PluginError = require('plugin-error');
var applySourceMap = require('vinyl-sourcemaps-apply');
var PLUGIN_NAME = 'gulp-requirejs-optimize';
function pathToModuleId(path) {
// replace Windows path separators to make sure this is a valid module ID
path = path.replace(/\\/g, '/');
// remove the file extension if this is a .js file
var filenameEndIndex = path.length - 3;
var extensionIndex = path.indexOf('.js', filenameEndIndex);
if (extensionIndex !== -1 && extensionIndex === filenameEndIndex) {
path = path.substring(0, filenameEndIndex);
}
return path;
}
module.exports = function(options) {
requirejs.define('node/print', [], function() {
return function(msg) {
if (msg.substring(0, 5) === 'Error') {
log(chalk.red(msg));
} else {
log(msg);
}
};
});
options = options || {};
var generateOptions;
if (typeof options === 'function') {
generateOptions = options;
} else {
generateOptions = function() {
return options;
};
}
var error;
return through.obj(function(file, enc, cb) {
if (file.isNull()) {
cb(null, file);
return;
}
if (file.isStream()) {
cb(new PluginError(PLUGIN_NAME, 'Streaming not supported'));
return;
}
var optimizeOptions = generateOptions(file);
if (typeof optimizeOptions !== 'object') {
cb(new PluginError(PLUGIN_NAME, 'Options function must produce an options object'));
return;
}
var sourceMapPresent = Boolean(file.sourceMap);
var logLevelPresent = Boolean(optimizeOptions.logLevel);
optimizeOptions = defaults({}, optimizeOptions, {
logLevel: 2,
baseUrl: file.base,
out: file.relative,
generateSourceMaps: sourceMapPresent
});
if (optimizeOptions.generateSourceMaps) {
defaults(optimizeOptions, {
preserveLicenseComments: false
});
}
if (!optimizeOptions.include && !optimizeOptions.name) {
optimizeOptions.include = pathToModuleId(file.relative);
}
if (typeof optimizeOptions.out !== 'string') {
cb(new PluginError(PLUGIN_NAME, 'If `out` is supplied, it must be a string'));
return;
}
var out = optimizeOptions.out;
optimizeOptions.out = function(text, sourceMapText) {
if (sourceMapPresent) {
// uglify adds its own sourceMappingURL comment which will get duplicated by gulp-sourcemaps
text = text.replace(/\/\/# sourceMappingURL=.*$/, '');
}
var outfile = new Vinyl({
path: out,
contents: new Buffer(text)
});
if (sourceMapText) {
applySourceMap(outfile, sourceMapText);
}
cb(null, outfile);
};
var target;
if (optimizeOptions.logLevel < 2) {
target = path.resolve(file.path);
} else {
target = file.relative;
}
if (!logLevelPresent || optimizeOptions.logLevel < 2) {
log('Optimizing ' + chalk.magenta(target));
}
requirejs.optimize(optimizeOptions, null, function(err) {
error = err;
cb();
});
}, function(cb) {
if (error) {
cb(new PluginError(PLUGIN_NAME, error));
}
cb();
});
};