55 loadGenerators ,
66 resolveGeneratorSpecifier ,
77} from './generators/loader.mjs' ;
8+ import { resolvePipeline } from './generators/pipeline.mjs' ;
89import logger from './logger/index.mjs' ;
910import createWorkerPool from './threading/index.mjs' ;
1011import createParallelWorker from './threading/parallel.mjs' ;
@@ -44,22 +45,24 @@ const createGenerator = () => {
4445 *
4546 * @param {string } specifier - Resolved generator specifier to schedule
4647 * @param {Map<string, GeneratorMetadata> } generators - Loaded generators
48+ * @param {Map<string, string | undefined> } inputOf - Each generator's
49+ * effective input generator (its dependency, unless another generator was
50+ * spliced in front of it via `dependent`)
4751 * @param {import('./utils/configuration/types').Configuration } configuration - Runtime options
4852 */
49- const scheduleGenerator = ( specifier , generators , configuration ) => {
53+ const scheduleGenerator = ( specifier , generators , inputOf , configuration ) => {
5054 if ( cache . has ( specifier ) ) {
5155 return ;
5256 }
5357
5458 const generator = generators . get ( specifier ) ;
5559 const { name, generate, hasParallelProcessor } = generator ;
5660
57- const dependsOn =
58- generator . dependsOn && resolveGeneratorSpecifier ( generator . dependsOn ) ;
61+ const dependsOn = inputOf . get ( specifier ) ;
5962
6063 // Schedule dependency first
6164 if ( dependsOn && ! cache . has ( dependsOn ) ) {
62- scheduleGenerator ( dependsOn , generators , configuration ) ;
65+ scheduleGenerator ( dependsOn , generators , inputOf , configuration ) ;
6366 }
6467
6568 generatorsLogger . debug ( `Scheduling "${ name } "` , {
@@ -104,8 +107,16 @@ const createGenerator = () => {
104107
105108 // Resolve shorthand names and load the full dependency closure up front,
106109 // so scheduling below is fully synchronous.
107- const targets = target . map ( resolveGeneratorSpecifier ) ;
108- const generators = await loadGenerators ( targets ) ;
110+ const generators = await loadGenerators (
111+ target . map ( resolveGeneratorSpecifier )
112+ ) ;
113+
114+ // Work out who reads from whom once generators declaring a `dependent`
115+ // have been spliced in, and which generators the run finally collects.
116+ const { targets, inputOf } = resolvePipeline (
117+ target . map ( resolveGeneratorSpecifier ) ,
118+ generators
119+ ) ;
109120
110121 generatorsLogger . debug ( `Starting pipeline` , {
111122 generators : targets . join ( ', ' ) ,
@@ -114,18 +125,14 @@ const createGenerator = () => {
114125
115126 // Compute consumer counts up front so dependencies can be evicted as soon
116127 // as their last consumer runs (must be ready before any generator starts).
117- cache . populateConsumerCounts ( targets , specifier => {
118- const { dependsOn } = generators . get ( specifier ) ;
119-
120- return dependsOn && resolveGeneratorSpecifier ( dependsOn ) ;
121- } ) ;
128+ cache . populateConsumerCounts ( targets , specifier => inputOf . get ( specifier ) ) ;
122129
123130 // Create worker pool
124131 pool = createWorkerPool ( threads ) ;
125132
126133 // Schedule all generators
127134 for ( const specifier of targets ) {
128- scheduleGenerator ( specifier , generators , configuration ) ;
135+ scheduleGenerator ( specifier , generators , inputOf , configuration ) ;
129136 }
130137
131138 // Start all collections in parallel (don't await sequentially). Consuming
0 commit comments