// Generated by LiveScript 1.4.0
(function(){
  var Promise, ref$, list, experimental, libraryBlacklist, es5SpecialCase, banner, readFile, writeFile, unlink, basename, dirname, join, webpack, temp;
  Promise = require('../library/fn/promise');
  ref$ = require('./config'), list = ref$.list, experimental = ref$.experimental, libraryBlacklist = ref$.libraryBlacklist, es5SpecialCase = ref$.es5SpecialCase, banner = ref$.banner;
  ref$ = require('fs'), readFile = ref$.readFile, writeFile = ref$.writeFile, unlink = ref$.unlink;
  ref$ = require('path'), basename = ref$.basename, dirname = ref$.dirname, join = ref$.join;
  webpack = require('webpack');
  temp = require('temp');
  module.exports = function(arg$){
    var modules, ref$, blacklist, library, umd, this$ = this;
    modules = (ref$ = arg$.modules) != null
      ? ref$
      : [], blacklist = (ref$ = arg$.blacklist) != null
      ? ref$
      : [], library = (ref$ = arg$.library) != null ? ref$ : false, umd = (ref$ = arg$.umd) != null ? ref$ : true;
    return new Promise(function(resolve, reject){
      (function(){
        var i$, x$, ref$, len$, y$, ns, name, j$, len1$, TARGET, this$ = this;
        if (this.exp) {
          for (i$ = 0, len$ = (ref$ = experimental).length; i$ < len$; ++i$) {
            x$ = ref$[i$];
            this[x$] = true;
          }
        }
        if (this.es5) {
          for (i$ = 0, len$ = (ref$ = es5SpecialCase).length; i$ < len$; ++i$) {
            y$ = ref$[i$];
            this[y$] = true;
          }
        }
        for (ns in this) {
          if (this[ns]) {
            for (i$ = 0, len$ = (ref$ = list).length; i$ < len$; ++i$) {
              name = ref$[i$];
              if (name.indexOf(ns + ".") === 0 && !in$(name, experimental)) {
                this[name] = true;
              }
            }
          }
        }
        if (library) {
          blacklist = blacklist.concat(libraryBlacklist);
        }
        for (i$ = 0, len$ = blacklist.length; i$ < len$; ++i$) {
          ns = blacklist[i$];
          for (j$ = 0, len1$ = (ref$ = list).length; j$ < len1$; ++j$) {
            name = ref$[j$];
            if (name === ns || name.indexOf(ns + ".") === 0) {
              this[name] = false;
            }
          }
        }
        TARGET = temp.path({
          suffix: '.js'
        });
        webpack({
          entry: list.filter(function(it){
            return this$[it];
          }).map(function(it){
            if (library) {
              return join(__dirname, '..', 'library', 'modules', it);
            } else {
              return join(__dirname, '..', 'modules', it);
            }
          }),
          output: {
            path: dirname(TARGET),
            filename: basename("./" + TARGET)
          }
        }, function(err, info){
          if (err) {
            return reject(err);
          }
          readFile(TARGET, function(err, script){
            if (err) {
              return reject(err);
            }
            unlink(TARGET, function(err){
              var exportScript;
              if (err) {
                return reject(err);
              }
              if (umd) {
                exportScript = "// CommonJS export\nif (typeof module != 'undefined' && module.exports) module.exports = __e;\n// RequireJS export\nelse if (typeof define == 'function' && define.amd) define(function () { return __e; });\n// Export to global object\nelse __g.core = __e;";
              } else {
                exportScript = "";
              }
              resolve("" + banner + "\n!function(__e, __g, undefined){\n'use strict';\n" + script + "\n" + exportScript + "\n}(1, 1);");
            });
          });
        });
      }.call(modules.reduce(function(memo, it){
        memo[it] = true;
        return memo;
      }, {})));
    });
  };
  function in$(x, xs){
    var i = -1, l = xs.length >>> 0;
    while (++i < l) if (x === xs[i]) return true;
    return false;
  }
}).call(this);
