forked from thednp/bootstrap.native
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-module.js
126 lines (118 loc) · 4.11 KB
/
build-module.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
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
var fs = require('fs');
var uglify = require('uglify-js');
var pack = require('./package.json');
var version = 'v' + pack.version;
var license = pack.license + '-License';
var libPath = __dirname + '/lib';
var { getModuleNames, error } = require('./lib/helpers');
module.exports = (options) => {
// Arguments Sanity Check:
if (options.only && options.ignore) {
error('Error: You cannot specify both --only and --ignore.');
}
if (options.only) options.only = getModuleNames(options.only);
if (options.ignore) options.ignore = getModuleNames(options.ignore);
// Get a list of all modules:
var allModules = fs.readdirSync(`${libPath}/V3/`).filter(item => /-native\.js$/.test(item));
// Get a list of modules to include:
var modules = [];
if (options.only) { // If --only, use that for modules
modules = options.only.filter(function (item) {
// Validate module names:
var valid = getModuleNames(allModules).some(name => name === item);
if (!valid) {
console.warn(`Warning: ${item} is not a valid module name, continuing`);
}
return valid;
});
} else if (options.ignore) { // If --ignore, filter allModules
// Filter allModules:
modules = getModuleNames(allModules).filter(function (item) {
// If not in ignore list, return true:
return options.ignore.every(ignoreItem => ignoreItem !== item);
});
} else { // If neither --ignore or --only, use allModules
modules = getModuleNames(allModules);
}
// If modules is an empty array, abort
// This could happen if you passed non-module values to --only
if (modules.length === 0) {
error(`Error: No valid module names, aborting`);
}
// Use console.warn to avoid writing to stdout
console.warn(`Building Native JavaScript for Bootstrap 3 ${version} ..`);
if (options.minify) {
console.warn('Minified Build');
} else {
console.warn('Unminified Build');
}
console.warn(`Included modules:
${modules.join('\n ')}`);
// Load modules:
// Use Promises to avoid race conditions
var promises = [];
modules.forEach(function (name, i) {
promises[i] = new Promise(function (resolve, reject) {
fs.readFile(`${libPath}/V3/${name.toLowerCase()}-native.js`, 'utf8', function (err, contents) {
if (err) reject(err);
resolve(contents);
});
});
});
// When all modules are loaded, make bundle:
var result = Promise.all(promises)
.then(function (modules) {
var header = '// Native Javascript for Bootstrap 3 ' + version + ' | © dnp_theme | ' + license + '\n';
var bundle = wrap(modules.join(''));
if (options.minify) {
bundle = uglify.minify(bundle, {fromString: true}).code;
}
var output = header + bundle + '\n';
process.stdout.on('error', function (err) {
throw err; // Will be caught below
});
if (options.cli) {
process.stdout.write(output, 'utf8');
}
return output;
})
.catch(error);
function wrap(main) {
var utils = fs.readFileSync(`${libPath}/V3/utils.js`, 'utf8').split('\n').join('\n ');
var init = fs.readFileSync(`${libPath}/V3/utils-init.js`, 'utf8').split('\n').join('\n ');
main = main.split('\n').join('\n ');
// Initialize arrays:
// Arrays will be used in the template literal below
var rootAttachments = [];
var returns = [];
// Populate arrays:
modules.forEach(function (name) {
rootAttachments.push(`root.${name} = bsn.${name};`);
returns.push(`${name}: ${name}`);
});
// Custom UMD Template:
return `(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD support:
define([], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS-like:
module.exports = factory();
} else {
// Browser globals (root is window)
var bsn = factory();
${rootAttachments.join('\n ')/* add indentation */}
}
}(this, function () {
${utils}
BSN.version = '${pack.version}';
${main}
${init}
return {
${returns.join(',\n ')/* add indentation and comma */}
};
}));`;
// End of Template
}
return result;
}