78 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | /** | ||
|  |  * @license | ||
|  |  * Copyright Google Inc. All Rights Reserved. | ||
|  |  * | ||
|  |  * Use of this source code is governed by an MIT-style license that can be | ||
|  |  * found in the LICENSE file at https://angular.io/license
 | ||
|  |  */ | ||
|  | import {DepGraph} from 'dependency-graph'; | ||
|  | import {PartiallyOrderedTasks, Task} from '../../src/execution/tasks/api'; | ||
|  | import {EntryPoint} from '../../src/packages/entry_point'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Create a set of tasks and a graph of their interdependencies. | ||
|  |  * | ||
|  |  * NOTE 1: The first task for each entry-point generates typings (which is similar to what happens | ||
|  |  *         in the actual code). | ||
|  |  * NOTE 2: The `computeTaskDependencies()` implementation relies on the fact that tasks are sorted in such | ||
|  |  *         a way that a task can only depend upon earlier tasks (i.e. dependencies always come | ||
|  |  *         before dependents in the list of tasks). | ||
|  |  *         To preserve this attribute, you need to ensure that entry-points will only depend on | ||
|  |  *         entry-points with a lower index. Take this into account when defining `entryPointDeps`. | ||
|  |  *         (Failing to do so, will result in an error.) | ||
|  |  * | ||
|  |  * @param entryPointCount The number of different entry-points to mock. | ||
|  |  * @param tasksPerEntryPointCount The number of tasks to generate per entry-point (i.e. simulating | ||
|  |  *                                processing multiple format properties). | ||
|  |  * @param entryPointDeps An object mapping an entry-point to its dependencies. Keys are | ||
|  |  *                       entry-point indices and values are arrays of entry-point indices that the | ||
|  |  *                       entry-point corresponding to the key depends on. | ||
|  |  *                       For example, if entry-point #2 depends on entry-points #0 and #1, | ||
|  |  *                       `entryPointDeps` would be `{2: [0, 1]}`. | ||
|  |  * @return An object with the following properties: | ||
|  |  *         - `tasks`: The (partially ordered) list of generated mock tasks. | ||
|  |  *         - `graph`: The dependency graph for the generated mock entry-point. | ||
|  |  */ | ||
|  | export function createTasksAndGraph( | ||
|  |     entryPointCount: number, tasksPerEntryPointCount = 1, | ||
|  |     entryPointDeps: {[entryPointIndex: string]: number[]} = {}): | ||
|  |     {tasks: PartiallyOrderedTasks, graph: DepGraph<EntryPoint>} { | ||
|  |   const entryPoints: EntryPoint[] = []; | ||
|  |   const tasks: PartiallyOrderedTasks = [] as any; | ||
|  |   const graph = new DepGraph<EntryPoint>(); | ||
|  | 
 | ||
|  |   // Create the entry-points and the associated tasks.
 | ||
|  |   for (let epIdx = 0; epIdx < entryPointCount; epIdx++) { | ||
|  |     const entryPoint = { | ||
|  |       name: `entry-point-${epIdx}`, | ||
|  |       path: `/path/to/entry/point/${epIdx}`, | ||
|  |     } as EntryPoint; | ||
|  | 
 | ||
|  |     entryPoints.push(entryPoint); | ||
|  |     graph.addNode(entryPoint.path); | ||
|  | 
 | ||
|  |     for (let tIdx = 0; tIdx < tasksPerEntryPointCount; tIdx++) { | ||
|  |       tasks.push({ entryPoint, formatProperty: `prop-${tIdx}`, processDts: tIdx === 0 } as Task); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // Define entry-point interdependencies.
 | ||
|  |   for (const epIdx of Object.keys(entryPointDeps).map(strIdx => +strIdx)) { | ||
|  |     const fromPath = entryPoints[epIdx].path; | ||
|  |     for (const depIdx of entryPointDeps[epIdx]) { | ||
|  |       // Ensure that each entry-point only depends on entry-points at a lower index.
 | ||
|  |       if (depIdx >= epIdx) { | ||
|  |         throw Error( | ||
|  |             'Invalid `entryPointDeps`: Entry-points can only depend on entry-points at a lower ' + | ||
|  |             `index, but entry-point #${epIdx} depends on #${depIdx} in: ` + | ||
|  |             JSON.stringify(entryPointDeps, null, 2)); | ||
|  |       } | ||
|  | 
 | ||
|  |       const toPath = entryPoints[depIdx].path; | ||
|  |       graph.addDependency(fromPath, toPath); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return {tasks, graph}; | ||
|  | } |