51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Duplicate the code from `run-async.js` but as synchronous functions
 | |
| export const pushChunksSync = (getChunksSync, getChunksArguments, transformStream, done) => {
 | |
| 	try {
 | |
| 		for (const chunk of getChunksSync(...getChunksArguments)) {
 | |
| 			transformStream.push(chunk);
 | |
| 		}
 | |
| 
 | |
| 		done();
 | |
| 	} catch (error) {
 | |
| 		done(error);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| // Run synchronous generators with `execaSync()`
 | |
| export const runTransformSync = (generators, chunks) => [
 | |
| 	...chunks.flatMap(chunk => [...transformChunkSync(chunk, generators, 0)]),
 | |
| 	...finalChunksSync(generators),
 | |
| ];
 | |
| 
 | |
| export const transformChunkSync = function * (chunk, generators, index) {
 | |
| 	if (index === generators.length) {
 | |
| 		yield chunk;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	const {transform = identityGenerator} = generators[index];
 | |
| 	for (const transformedChunk of transform(chunk)) {
 | |
| 		yield * transformChunkSync(transformedChunk, generators, index + 1);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| export const finalChunksSync = function * (generators) {
 | |
| 	for (const [index, {final}] of Object.entries(generators)) {
 | |
| 		yield * generatorFinalChunksSync(final, Number(index), generators);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| const generatorFinalChunksSync = function * (final, index, generators) {
 | |
| 	if (final === undefined) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	for (const finalChunk of final()) {
 | |
| 		yield * transformChunkSync(finalChunk, generators, index + 1);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| const identityGenerator = function * (chunk) {
 | |
| 	yield chunk;
 | |
| };
 |