--- /dev/null
+'use strict';
+
+var _ = require('lodash'),
+ async = require('async'),
+ glob = require('glob'),
+ path = require('path');
+
+var file = require('../common/file'),
+ mapping = require('../common/mapping');
+
+var templatePath = path.join(__dirname, 'template/modules'),
+ template = file.globTemplate(path.join(templatePath, '*.jst'));
+
+var aryMethods = _.union(
+ mapping.aryMethod[1],
+ mapping.aryMethod[2],
+ mapping.aryMethod[3],
+ mapping.aryMethod[4]
+);
+
+var categories = [
+ 'array',
+ 'collection',
+ 'date',
+ 'function',
+ 'lang',
+ 'math',
+ 'number',
+ 'object',
+ 'seq',
+ 'string',
+ 'util'
+];
+
+var ignored = [
+ '_*.js',
+ 'core.js',
+ 'core.min.js',
+ 'fp.js',
+ 'index.js',
+ 'lodash.js',
+ 'lodash.min.js'
+];
+
+function isAlias(funcName) {
+ return _.has(mapping.aliasToReal, funcName);
+}
+
+function isCategory(funcName) {
+ return _.includes(categories, funcName);
+}
+
+function isThru(funcName) {
+ return !_.includes(aryMethods, funcName);
+}
+
+function getTemplate(moduleName) {
+ var data = {
+ 'name': _.result(mapping.aliasToReal, moduleName, moduleName),
+ 'mapping': mapping
+ };
+
+ if (isAlias(moduleName)) {
+ return template.alias(data);
+ }
+ if (isCategory(moduleName)) {
+ return template.category(data);
+ }
+ if (isThru(moduleName)) {
+ return template.thru(data);
+ }
+ return template.module(data);
+}
+
+/*----------------------------------------------------------------------------*/
+
+function onComplete(error) {
+ if (error) {
+ throw error;
+ }
+}
+
+function build(target) {
+ target = path.resolve(target);
+
+ var fpPath = path.join(target, 'fp');
+
+ // Glob existing lodash module paths.
+ var modulePaths = glob.sync(path.join(target, '*.js'), {
+ 'nodir': true,
+ 'ignore': ignored.map(function(filename) {
+ return path.join(target, filename);
+ })
+ });
+
+ // Add FP alias and remapped module paths.
+ _.each([mapping.aliasToReal, mapping.remap], function(data) {
+ _.forOwn(data, function(realName, alias) {
+ var modulePath = path.join(target, alias + '.js');
+ if (!_.includes(modulePaths, modulePath)) {
+ modulePaths.push(modulePath);
+ }
+ });
+ });
+
+ var actions = modulePaths.map(function(modulePath) {
+ var moduleName = path.basename(modulePath, '.js');
+ return file.write(path.join(fpPath, moduleName + '.js'), getTemplate(moduleName));
+ });
+
+ actions.unshift(file.copy(path.join(__dirname, '../../fp'), fpPath));
+ actions.push(file.write(path.join(fpPath, '_falseOptions.js'), template._falseOptions()));
+ actions.push(file.write(path.join(fpPath, '_util.js'), template._util()));
+ actions.push(file.write(path.join(target, 'fp.js'), template.fp()));
+ actions.push(file.write(path.join(fpPath, 'convert.js'), template.convert()));
+
+ async.series(actions, onComplete);
+}
+
+build(_.last(process.argv));