2020-05-29 06:06:24 +02:00
|
|
|
import sass from 'sass'
|
2018-12-18 02:21:29 +01:00
|
|
|
import path from 'path'
|
|
|
|
import fs from 'fs'
|
2019-01-20 00:06:25 +01:00
|
|
|
import { promisify } from 'util'
|
2019-02-12 06:04:19 +01:00
|
|
|
import cssDedoupe from 'css-dedoupe'
|
|
|
|
import { TextDecoder } from 'text-encoding'
|
2018-12-18 02:21:29 +01:00
|
|
|
|
2019-01-20 00:06:25 +01:00
|
|
|
const writeFile = promisify(fs.writeFile)
|
|
|
|
const readdir = promisify(fs.readdir)
|
2018-01-14 02:41:15 +01:00
|
|
|
|
2019-01-19 22:32:36 +01:00
|
|
|
const globalScss = path.join(__dirname, '../src/scss/global.scss')
|
|
|
|
const defaultThemeScss = path.join(__dirname, '../src/scss/themes/_default.scss')
|
|
|
|
const customScrollbarScss = path.join(__dirname, '../src/scss/custom-scrollbars.scss')
|
|
|
|
const themesScssDir = path.join(__dirname, '../src/scss/themes')
|
2018-12-11 16:31:48 +01:00
|
|
|
const assetsDir = path.join(__dirname, '../static')
|
2018-01-14 02:41:15 +01:00
|
|
|
|
2018-11-24 09:41:36 +01:00
|
|
|
async function renderCss (file) {
|
2020-05-29 06:06:24 +02:00
|
|
|
return sass.renderSync({ file, outputStyle: 'compressed' }).css
|
2018-11-24 09:41:36 +01:00
|
|
|
}
|
2018-01-14 02:41:15 +01:00
|
|
|
|
2018-11-24 09:41:36 +01:00
|
|
|
async function compileGlobalSass () {
|
2019-08-03 22:49:37 +02:00
|
|
|
const mainStyle = (await Promise.all([defaultThemeScss, globalScss].map(renderCss))).join('')
|
|
|
|
const scrollbarStyle = (await renderCss(customScrollbarScss))
|
2018-01-14 02:41:15 +01:00
|
|
|
|
2018-12-18 02:21:29 +01:00
|
|
|
return `<style>\n${mainStyle}</style>\n` +
|
|
|
|
`<style media="all" id="theScrollbarStyle">\n${scrollbarStyle}</style>\n`
|
2018-01-14 02:41:15 +01:00
|
|
|
}
|
|
|
|
|
2018-02-09 07:29:29 +01:00
|
|
|
async function compileThemesSass () {
|
2020-01-12 19:19:29 +01:00
|
|
|
const files = (await readdir(themesScssDir)).filter(file => !path.basename(file).startsWith('_') && !path.basename(file).startsWith('.'))
|
2018-01-14 02:41:15 +01:00
|
|
|
await Promise.all(files.map(async file => {
|
2019-02-12 06:04:19 +01:00
|
|
|
let css = await renderCss(path.join(themesScssDir, file))
|
|
|
|
css = cssDedoupe(new TextDecoder('utf-8').decode(css)) // remove duplicate custom properties
|
2019-08-03 22:49:37 +02:00
|
|
|
const outputFilename = 'theme-' + path.basename(file).replace(/\.scss$/, '.css')
|
2019-02-12 06:04:19 +01:00
|
|
|
await writeFile(path.join(assetsDir, outputFilename), css, 'utf8')
|
2018-01-14 02:41:15 +01:00
|
|
|
}))
|
|
|
|
}
|
|
|
|
|
2018-12-18 02:21:29 +01:00
|
|
|
export async function buildSass () {
|
2019-08-03 22:49:37 +02:00
|
|
|
const [result] = await Promise.all([compileGlobalSass(), compileThemesSass()])
|
2018-12-18 02:21:29 +01:00
|
|
|
return result
|
2018-01-14 02:41:15 +01:00
|
|
|
}
|