#!/usr/bin/env node require('dotenv').config({silent: true}); var debug = require('debug')('ems:precompile'); var path = require('path'); var fs = require('fs'); var program = require('commander'); var damnUtils = require('damn-utils'); var async = require('async'); var _ = require("lodash"); var ems = require(path.resolve(__dirname, '..')); var pkg = require(path.resolve(__dirname, '..', 'package.json')); program .version(pkg.version) .usage('') .option('-s, --source-maps', 'write sourcemap files') .option('-e, --embed-mapping-comments', 'embed sourcemap url into created files') .option('-c, --compress', 'create gzipped files') .on('--help', function(){ console.log(' Examples:'); console.log(''); console.log(' $ ems precompile'); console.log(' $ ems precompile my-spa-application'); console.log(' $ ems precompile /path/to/my-spa-application'); console.log(''); }) .parse(process.argv); debug('start precompile'); // Setup NODE ENV to production debug('set env to production'); process.env.NODE_ENV = 'production'; var target = program.args[0] || process.cwd(); var targetPath = path.resolve(process.cwd(), target); debug('setup target: %s', targetPath); debug('check target'); if(fs.existsSync(targetPath)) { debug('target exists'); debug('load target app'); var app = require(targetPath); run(false); run(true); if(app.config.precompile.views) { precompileViews(); } } else { debug('target does not exist'); console.error('Target application '+target+' does not exists'); } function run(production) { bootstrap(production); precompile(production); } function bootstrap(production) { const bootstrapConf = { assets: { production: production }, precompile: { options: { sourceMaps: program.sourceMaps, embedMappingComments: program.embedMappingComments, compress: program.compress } } }; debug('start app bootstrap with some conf', bootstrapConf); app.bootstrap(bootstrapConf); } function precompile(production) { var manifest = new app.assetPipeline.Mincer.Manifest( app.assetPipeline.environment, app.config.precompile.target ); var files = app.config.precompile.files || []; if(app.config.precompile.fonts) { files = _.concat(files, ems.getPrecompileFonts()); } if(app.config.precompile.images) { files = _.concat(files, ems.getPrecompileImages()); } var data = manifest.compile(files, app.config.precompile.options); _.forEach(data.assets, function (compiled, raw) { if(production) { ems.utils.log('create', compiled); } }); } function precompileViews() { app.locals.pretty = true; app.assetPipeline.assets()(null, app, function() {}); app.config.precompile.updateAppBeforePrecompileViews(app); function render(args, next) { app.render(args.file, {}, function(err, html) { if(err) { throw err; } ems.utils.write(args.target, html); next(); }); } var actions = []; for(var i = 0; i < app.config.precompile.viewFiles.length; i++) { var file = app.config.precompile.viewFiles[i]; actions.push(damnUtils.async.bootstrapAction(render, { file: file, target: path.resolve( app.config.precompile.viewsTarget, file+'.html' ) })); } async.series(actions, function(err) { if(err) { throw err; } }); }