amend-bundle
Version:
Bundle all code from an amend container to one file
124 lines (104 loc) • 3.2 kB
JavaScript
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');