Source: compile/sass.js

/** @module compile/sass */

import fsPromises from 'fs/promises'
import { pathToFileURL } from 'url'
import * as sass from 'sass'
import { getFileList } from '../utils/fs.js'
import * as ui from '../utils/ui.js'
import { getThemeOptions } from '../utils/options.js'

/**
 * #### Compile Scss task
 * @async
 * @param {boolean} [hideStatus] - hide status messages
 * @returns undefined
 */
async function compileScss (hideStatus) {
  try {
    const timeStart = ui.startTask('compileScss')
    const options = getThemeOptions()
    const scssSrc = `${options.vendorSrc}/scss`
    const scssDest = `${options.vendorDest}/css`
    const fileList = []

    await fsPromises.mkdir(scssDest, { recursive: true })
    const files = await getFileList(`${scssSrc}/*.scss`, { objectMode: true })

    if (files !== undefined) {
      for await (const file of files) {
        const scssResult = await sass.compileAsync(file.path, {
          importers: [{
            // an importer that redirects relative URLs starting with "~" to
            // `node_modules`.
            findFileUrl (url) {
              if (!url.startsWith('~')) return null
              return new URL(url.substring(1), pathToFileURL('node_modules/'))
            }
          }]
        })

        const fileName = `${file.name.slice(0, -5)}.css`
        await fsPromises.writeFile(`${scssDest}/${fileName}`, scssResult.css)
        const fileStats = await fsPromises.stat(`${scssDest}/${fileName}`)
        file.size = ui.convertFileSize(fileStats.size)
        file.dist = `${scssDest}/${fileName}`
        fileList.push(file)
      }
    }

    hideStatus || ui.endTask({ files: fileList, taskName: 'compileScss', timeStart })
  } catch (error) {
    console.error(error)
  }
}

export { compileScss }

Table of contents