run-sync.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // Duplicate the code from `run-async.js` but as synchronous functions
  2. export const pushChunksSync = (getChunksSync, getChunksArguments, transformStream, done) => {
  3. try {
  4. for (const chunk of getChunksSync(...getChunksArguments)) {
  5. transformStream.push(chunk);
  6. }
  7. done();
  8. } catch (error) {
  9. done(error);
  10. }
  11. };
  12. // Run synchronous generators with `execaSync()`
  13. export const runTransformSync = (generators, chunks) => [
  14. ...chunks.flatMap(chunk => [...transformChunkSync(chunk, generators, 0)]),
  15. ...finalChunksSync(generators),
  16. ];
  17. export const transformChunkSync = function * (chunk, generators, index) {
  18. if (index === generators.length) {
  19. yield chunk;
  20. return;
  21. }
  22. const {transform = identityGenerator} = generators[index];
  23. for (const transformedChunk of transform(chunk)) {
  24. yield * transformChunkSync(transformedChunk, generators, index + 1);
  25. }
  26. };
  27. export const finalChunksSync = function * (generators) {
  28. for (const [index, {final}] of Object.entries(generators)) {
  29. yield * generatorFinalChunksSync(final, Number(index), generators);
  30. }
  31. };
  32. const generatorFinalChunksSync = function * (final, index, generators) {
  33. if (final === undefined) {
  34. return;
  35. }
  36. for (const finalChunk of final()) {
  37. yield * transformChunkSync(finalChunk, generators, index + 1);
  38. }
  39. };
  40. const identityGenerator = function * (chunk) {
  41. yield chunk;
  42. };