'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));