11var parallel = require ( 'async-collection' ) . parallel
2+ var splicer = require ( 'labeled-stream-splicer' )
23var fromString = require ( 'from2-string' )
34var stream = require ( 'readable-stream' )
45var parse = require ( 'fast-json-parse' )
@@ -67,6 +68,9 @@ var placeholder = null
6768Documentify . prototype . transform = function ( transform , opts ) {
6869 var self = this
6970 opts = opts || { }
71+
72+ if ( ! opts . order ) opts = Object . assign ( { } , opts , { order : 'main' } )
73+
7074 if ( typeof transform === 'string' ) {
7175 var index = this . transforms . length
7276 var basedir = opts . basedir || this . basedir
@@ -91,6 +95,24 @@ Documentify.prototype.transform = function (transform, opts) {
9195 return this
9296}
9397
98+ Documentify . prototype . createPipeline = function ( ) {
99+ var pipeline = splicer ( [
100+ 'start' , [ ] ,
101+ 'main' , [ ] ,
102+ 'end' , [ ]
103+ ] )
104+
105+ this . transforms . forEach ( function ( tuple ) {
106+ var fn = tuple [ 0 ]
107+ var opts = tuple [ 1 ]
108+ var label = opts && opts . order
109+ var transform = fn ( opts )
110+ pipeline . get ( label ) . push ( transform )
111+ } )
112+
113+ return pipeline
114+ }
115+
94116Documentify . prototype . bundle = function ( ) {
95117 var pts = new stream . PassThrough ( )
96118 var self = this
@@ -109,16 +131,9 @@ Documentify.prototype.bundle = function () {
109131 ]
110132 parallel ( tasks , function ( err ) {
111133 if ( err ) return pts . emit ( 'error' , err )
112- var args = self . transforms . reduce ( function ( arr , tuple ) {
113- var fn = tuple [ 0 ]
114- var opts = tuple [ 1 ] || { }
115- var transform = fn ( opts )
116- arr . push ( transform )
117- return arr
118- } , [ source ] )
119-
120- args . push ( pts )
121- pump . apply ( pump , args )
134+ var pipeline = self . createPipeline ( )
135+
136+ pump ( source , pipeline , pts )
122137 } )
123138 }
124139
@@ -159,6 +174,9 @@ Documentify.prototype.bundle = function () {
159174 opts = transform [ 1 ]
160175 }
161176
177+ // Run package.json transforms first by default.
178+ if ( ! opts . order ) opts . order = 'start'
179+
162180 return function ( done ) {
163181 resolve ( name , { basedir : basedir } , function ( err , resolved ) {
164182 if ( err ) return done ( err )
0 commit comments