forked from wayfair-archive/tungstenjs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack-helper.js
101 lines (89 loc) · 3.06 KB
/
webpack-helper.js
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
'use strict';
/* global process, __dirname */
var path = require('path');
var webpack = require('webpack');
function ensureLoader(loaders, test, loader) {
for (var i = 0; i < loaders.length; i++) {
var l = loaders[i];
if (l.test.source === test.source && l.loader === loader) {
return;
}
}
loaders.push({
test: test,
loader: loader
});
}
function processArg(arg) {
var parts = arg.split('=');
var data = {
name: parts[0]
};
if (parts[1]) {
data.value = parts[1];
}
return data;
}
function processArgs() {
var argData = {};
var args = process.argv;
for (var i = 0; i < args.length; i++) {
// Only process flags
if (args[i] && args[i].substr(0, 1) === '-') {
var arg = processArg(args[i]);
argData[arg.name] = arg.value;
}
}
return argData;
}
/**
* Extends an existing webpack config with necessary loaders for Tungsten
*
* @param {Object} config Base webpack config
* @param {Boolean} dev Whether to render in Dev mode (debugger, improved errors, etc)
* @param {Boolean} test Whether to render in Test mode (additional exposed functionality for tests)
*
* @return {Object} Updated webpack config object
*/
module.exports = function(config) {
config.resolveLoader = config.resolveLoader || {};
config.resolveLoader.modulesDirectories = config.resolveLoader.modulesDirectories || [];
config.resolveLoader.modulesDirectories.push(path.join(__dirname, 'precompile'));
config.module = config.module || {};
config.module.loaders = config.module.loaders || [];
config.module.preLoaders = config.module.preLoaders || [];
ensureLoader(config.module.loaders, /\.json$/, 'json-loader');
ensureLoader(config.module.loaders, /\.mustache$/, 'tungsten_template');
return config;
};
module.exports.compileSource = function(config, dev, test) {
config = module.exports(config, dev, test);
config.resolveLoader = config.resolveLoader || {};
config.resolveLoader.modulesDirectories.push(path.join(__dirname, 'node_modules'));
var args = processArgs();
// If dev is not explicitly set to a boolean, check for the command line flag
if (dev !== Boolean(dev)) {
dev = args.hasOwnProperty('--dev');
}
// If test is not explicitly set to a boolean, check for the command line flag
if (test !== Boolean(test)) {
test = args.hasOwnProperty('--test');
}
config.plugins = config.plugins || [];
config.plugins.push(new webpack.DefinePlugin({
TUNGSTENJS_VERSION: JSON.stringify(require('./package.json').version),
TUNGSTENJS_IS_TEST: test
}));
// Babel should be run on our code, but not node_modules
var folders = ['adaptors', 'examples', 'precompile', 'src', 'test'];
folders = folders.map(function(folder) {
var fullpath = path.join(__dirname, folder + '/').replace(/\\/g, '\\\\');
return fullpath + '.*\.js';
});
var babelRegexStr = '^(' + folders.join('|') + ')$';
ensureLoader(config.module.loaders, new RegExp(babelRegexStr), 'babel');
if (!dev) {
ensureLoader(config.module.preLoaders, /\.js$/, 'webpack-strip-block');
}
return config;
};