1require! {
2  '../library/fn/promise': Promise
3  './config': {list, experimental, libraryBlacklist, es5SpecialCase, banner}
4  fs: {readFile, writeFile, unlink}
5  path: {basename, dirname, join}
6  webpack, temp
7}
8
9module.exports = ({modules = [], blacklist = [], library = no, umd = on})->
10  resolve, reject <~! new Promise _
11  let @ = modules.reduce ((memo, it)-> memo[it] = on; memo), {}
12    if @exp => for experimental => @[..] = on
13    if @es5 => for es5SpecialCase => @[..] = on
14    for ns of @
15      if @[ns]
16        for name in list
17          if name.indexOf("#ns.") is 0 and name not in experimental
18            @[name] = on
19
20    if library => blacklist ++= libraryBlacklist
21    for ns in blacklist
22      for name in list
23        if name is ns or name.indexOf("#ns.") is 0
24          @[name] = no
25
26    TARGET = temp.path {suffix: '.js'}
27
28    err, info <~! webpack do
29      entry: list.filter(~> @[it]).map ~>
30        if library => join __dirname, '..', 'library', 'modules', it
31        else join __dirname, '..', 'modules', it
32      output:
33        path: dirname TARGET
34        filename: basename "./#TARGET"
35    if err => return reject err
36
37    err, script <~! readFile TARGET
38    if err => return reject err
39
40    err <~! unlink TARGET
41    if err => return reject err
42
43    if umd
44      exportScript = """
45        // CommonJS export
46        if (typeof module != 'undefined' && module.exports) module.exports = __e;
47        // RequireJS export
48        else if (typeof define == 'function' && define.amd) define(function () { return __e; });
49        // Export to global object
50        else __g.core = __e;
51        """
52    else
53      exportScript = ""
54
55    resolve """
56      #banner
57      !function(__e, __g, undefined){
58      'use strict';
59      #script
60      #exportScript
61      }(1, 1);
62      """