Ac turpis egestas maecenas pharetra convallis.

Tutorial
PublishedAt:

Urna molestie at elementum eu facilisis sed. Velit dignissim sodales ut eu sem integer. Vel turpis nunc eget lorem dolor sed viverra ipsum. Egestas maecenas pharetra convallis posuere morbi leo urna molestie. Lacus viverra vitae congue eu. Suspendisse ultrices gravida dictum fusce. Sit amet cursus sit amet dictum sit amet justo donec. Nibh sed pulvinar proin gravida. Gravida rutrum quisque non tellus orci. Netus et malesuada fames ac turpis egestas sed. At augue eget arcu dictum varius duis at consectetur. Arcu odio ut sem nulla pharetra. Nisi est sit amet facilisis. Consectetur lorem donec massa sapien faucibus. Viverra justo nec ultrices dui sapien eget mi proin. Dignissim suspendisse in est ante in. Feugiat vivamus at augue eget arcu dictum varius. Amet luctus venenatis lectus magna fringilla. Nisl suscipit adipiscing bibendum est ultricies integer quis.


At risus viverra adipiscing at in tellus integer feugiat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames. Sit amet facilisis magna etiam tempor orci eu lobortis elementum. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Dignissim suspendisse in est ante in. Tempor id eu nisl nunc. Commodo quis imperdiet massa tincidunt nunc. Enim ut tellus elementum sagittis vitae et leo duis. Volutpat est velit egestas dui id. In nulla posuere sollicitudin aliquam ultrices. Porttitor leo a diam sollicitudin tempor. Morbi non arcu risus quis varius. Sit amet cursus sit amet dictum sit. Ultricies leo integer malesuada nunc vel risus commodo viverra maecenas. Felis imperdiet proin fermentum leo vel orci porta non.


import path from 'path'

import fs from 'fs-extra'
import got from 'got'

import type { Manifest } from '../types'

type ExternalImagesDownloaderArgs = {
 terse?: boolean
 manifest: Manifest
 destDir: string
}

const externalImagesDownloader = async ({ terse = false, manifest, destDir }: ExternalImagesDownloaderArgs) => {
 if (!terse) {
  // eslint-disable-next-line no-console
  console.log('\n- Download external images -')
 }

 const promises: Promise<void>[] = []
 const downloadedImages: string[] = []

 for (const { src, externalUrl } of manifest) {
  if (externalUrl === undefined) continue

  if (downloadedImages.some((image) => image === externalUrl)) continue

  promises.push(
   (async () => {
    downloadedImages.push(externalUrl)

    const outputPath = path.join(destDir, src)
    await fs.ensureFile(outputPath)

    await new Promise((resolve, reject) => {
     try {
      const readStream = got.stream(externalUrl)
      const writeStream = fs.createWriteStream(outputPath)

      readStream.pipe(writeStream)

      writeStream.on('finish', () => {
       if (!terse) {
        // eslint-disable-next-line no-console
        console.log(`\`${externalUrl}\` has been downloaded.`)
       }
       resolve(undefined)
      })
     } catch (e) {
      reject(e)
     }
    })
   })()
  )
 }

 await Promise.all(promises)
}

export default externalImagesDownloader


Viverra vitae congue eu consequat ac felis donec et odio. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Nibh mauris cursus mattis molestie a iaculis at erat. Eros in cursus turpis massa tincidunt dui ut ornare. Amet aliquam id diam maecenas ultricies mi. Quam vulputate dignissim suspendisse in est ante in. Id donec ultrices tincidunt arcu non sodales neque sodales. Arcu cursus euismod quis viverra nibh. Interdum varius sit amet mattis vulputate enim nulla aliquet porttitor.


Non arcu risus quis varius quam quisque id diam. Ornare lectus sit amet est placerat in. Dapibus ultrices in iaculis nunc sed augue lacus viverra. Egestas integer eget aliquet nibh. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. Nisl purus in mollis nunc sed id semper risus. Bibendum est ultricies integer quis. Amet dictum sit amet justo. Nunc aliquet bibendum enim facilisis. Quis lectus nulla at volutpat diam ut venenatis. Venenatis a condimentum vitae sapien pellentesque habitant. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas. Sed blandit libero volutpat sed cras ornare arcu dui. Metus dictum at tempor commodo ullamcorper. Vitae et leo duis ut.


Cras pulvinar mattis nunc sed blandit libero. Luctus accumsan tortor posuere ac ut consequat semper viverra. Nunc sed velit dignissim sodales ut eu. Sit amet est placerat in egestas erat imperdiet sed. Nunc vel risus commodo viverra maecenas accumsan lacus. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Non odio euismod lacinia at quis risus. A lacus vestibulum sed arcu non. Fermentum odio eu feugiat pretium nibh ipsum consequat. Dolor sed viverra ipsum nunc aliquet bibendum enim. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Ac auctor augue mauris augue neque gravida. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Enim sit amet venenatis urna cursus eget nunc scelerisque. Ornare arcu dui vivamus arcu felis bibendum ut tristique.