UNPKG

1.73 kBJavaScriptView Raw
1var thr = require('through2')
2var duplexer = require('duplexer2')
3var merge = require('merge-stream')
4var reverse = require('reversepoint')
5var combine = require('stream-combiner2')
6var source = require('vinyl-source-stream')
7var depsTopoSort = require('deps-topo-sort2')
8
9var addCommon = require('./common')
10var Groups = require('./groups')
11
12module.exports = function (opts) {
13 return combine.obj(depsTopoSort(), reverse(), createGroups(opts))
14}
15
16function createGroups(opts) {
17 var wait = thr.obj()
18 var output = merge(wait)
19 var groupStream = new Groups({
20 basedir: opts.basedir,
21 groupFilter: opts.groupFilter,
22 })
23 var rows = []
24
25 groupStream.once('groups', function (groupsMap) {
26 groupsMap = addCommon(groupsMap, opts.common)
27
28 var groups = Object.keys(groupsMap)
29 var pipelines = Object.create(null)
30 var moduleMap = Object.create(null)
31
32 groups.forEach(function (bundleID) {
33 groupsMap[bundleID].forEach(function (moduleID) {
34 moduleMap[moduleID] = moduleMap[moduleID] || Object.create(null)
35 moduleMap[moduleID][bundleID] = true
36 })
37
38 pipelines[bundleID] = opts.pack(bundleID)
39 output.add(
40 pipelines[bundleID].pipe(source(bundleID))
41 )
42 })
43
44 rows.forEach(function (row) {
45 groups.forEach(function (bundleID) {
46 if (moduleMap[row.id][bundleID]) {
47 pipelines[bundleID].write(row)
48 }
49 })
50 })
51 rows.length = 0
52
53 groupStream.once('end', function () {
54 groups.forEach(function (bundleID) {
55 pipelines[bundleID].end()
56 })
57 wait.end()
58 })
59 })
60
61 groupStream.on('data', function (row) {
62 rows.push(row)
63 })
64
65 return duplexer({ objectMode: true }, groupStream, output)
66}
67