UNPKG

amend-bundle

Version:

Bundle all code from an amend container to one file

124 lines (104 loc) 3.2 kB
require('node-jsx').install({extension: '.jsx'}) //require('clear-console')() var path = require('path') var childProcess = require('child_process') var fs = require('fs') var R = require('ramda') var RF = require('ramda-fantasy') var Future = RF.Future var amend = require('amend') var findPath = require('amend/dist/find-module').path; var findModule = require('amend/dist/find-module').instance; var getConfigPaths = require('amend/dist/get-conf-paths')(findPath, findModule); var evaluateType = require('amend/dist/evaluate-type') var ject = R.curry(require('ject')) var babel = require('babel') var uglify = require('uglify-js') var numCPUs = require('os').cpus().length; console.log(numCPUs) console.time('k'); var readFile = function(file) { return new Future(function(reject, resolve) { fs.readFile(file, 'utf-8', function(e, res) { if (e) { reject(e) } else { resolve(res); } }); }); } var replaceExports = R.curry(function(name, content) { var declaration = 'var ' + name; return R.replace('module.exports', declaration, content) }); var requireModule = function(p) { var o = { name: R.head(p), moduleName: R.last(p) } return Future.of(ject("var {{name}} = require('{{moduleName}}')\n", o)); } function shouldInclude(p) { return p.isLocal; } function readAndReplace(p) { var filePath = p.path; var name = p.key; return readFile(filePath).map(replaceExports(name)).chain(doBabel).map(doMinify); } var getType = R.curry(function(baseDir, mod) { if (typeof mod === 'string') { if (mod[0] === '.') { return evaluateType(mod, require(path.join(baseDir, mod))) } else { return 'value'; } } else { return mod.value } }); var registrationTemplate = "di.{{type}}('{{name}}', {{name}})" function createContainerOutput(acc, item) { var o = { name: item.key, type: 'factory' } var current = ject(registrationTemplate, o) return R.join('\n', [ acc, current ]); } var tapLog = R.tap(console.log); var types = R.reduce(createContainerOutput, "var Container = require('amend').Container;\nvar di = new Container();") function notJSON(p) { return R.strIndexOf('.json', p.path) === -1 } function doBabel(code) { return Future.of(babel.transform(code, {}).code); } function doMinify(code) { return uglify.minify(code, { fromString: true }); } var resolvePath = R.adjust(require.resolve, 1) var joinem = R.compose( R.map(R.join('\n')), R.commute(Future.of), R.map(R.ifElse(shouldInclude, readAndReplace, requireModule)), R.map(R.evolve({ path: require.resolve})) ) var template = '(function() {\n{{code}}\ndi.loadAll()\n})()' function loadParent(parentConf) { return require(path.join(parentConf.nodeModule, parentConf.configFile)) } module.exports = function(baseDir, config) { var di = amend.fromNodeConfig({ config: config, baseDir: process.cwd() }); var paths = getConfigPaths(baseDir, config).filter(R.both(R.prop('isLocal'), notJSON)); var diCreation = types(paths) return joinem(paths) .map(R.concat(R.__, diCreation)) .map(R.createMapEntry('code')) .map(ject(template)); } var amendConfig = require('./login-config');