2018-01-14 01:41:15 +00:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
|
|
const sass = require('node-sass')
|
|
|
|
const chokidar = require('chokidar')
|
|
|
|
const argv = require('yargs').argv
|
|
|
|
const path = require('path')
|
|
|
|
const debounce = require('lodash/debounce')
|
|
|
|
const fs = require('fs')
|
|
|
|
const pify = require('pify')
|
|
|
|
const writeFile = pify(fs.writeFile.bind(fs))
|
|
|
|
const readdir = pify(fs.readdir.bind(fs))
|
2018-01-14 22:29:32 +00:00
|
|
|
const readFile = pify(fs.readFile.bind(fs))
|
2018-01-14 01:41:15 +00:00
|
|
|
const render = pify(sass.render.bind(sass))
|
2018-01-14 02:59:49 +00:00
|
|
|
const now = require('performance-now')
|
2018-01-14 01:41:15 +00:00
|
|
|
|
|
|
|
const globalScss = path.join(__dirname, '../scss/global.scss')
|
|
|
|
const defaultThemeScss = path.join(__dirname, '../scss/themes/_default.scss')
|
2018-01-19 04:57:15 +00:00
|
|
|
const offlineThemeScss = path.join(__dirname, '../scss/themes/_offline.scss')
|
2018-01-14 22:29:32 +00:00
|
|
|
const html2xxFile = path.join(__dirname, '../templates/2xx.html')
|
2018-01-14 01:41:15 +00:00
|
|
|
const scssDir = path.join(__dirname, '../scss')
|
|
|
|
const themesScssDir = path.join(__dirname, '../scss/themes')
|
|
|
|
const assetsDir = path.join(__dirname, '../assets')
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
function doWatch () {
|
2018-01-14 02:59:49 +00:00
|
|
|
var start = now()
|
2018-01-14 01:41:15 +00:00
|
|
|
chokidar.watch(scssDir).on('change', debounce(() => {
|
2018-01-14 02:59:49 +00:00
|
|
|
console.log('Recompiling SCSS...')
|
|
|
|
Promise.all([
|
|
|
|
compileGlobalSass(),
|
|
|
|
compileThemesSass()
|
|
|
|
]).then(() => {
|
|
|
|
console.log('Recompiled SCSS in ' + (now() - start) + 'ms')
|
|
|
|
})
|
2018-01-14 01:41:15 +00:00
|
|
|
}, 500))
|
|
|
|
chokidar.watch()
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
async function compileGlobalSass () {
|
2018-01-14 01:41:15 +00:00
|
|
|
let results = await Promise.all([
|
2018-01-14 22:54:20 +00:00
|
|
|
render({file: defaultThemeScss, outputStyle: 'compressed'}),
|
2018-01-19 04:57:15 +00:00
|
|
|
render({file: globalScss, outputStyle: 'compressed'}),
|
|
|
|
render({file: offlineThemeScss, outputStyle: 'compressed'})
|
2018-01-14 01:41:15 +00:00
|
|
|
])
|
|
|
|
|
2018-01-14 22:29:32 +00:00
|
|
|
let css = results.map(_ => _.css).join('')
|
2018-01-14 01:41:15 +00:00
|
|
|
|
2018-01-14 22:29:32 +00:00
|
|
|
let html = await readFile(html2xxFile, 'utf8')
|
|
|
|
html = html.replace(/<style>[\s\S]+?<\/style>/,
|
|
|
|
`<style>\n/* auto-generated w/ build-sass.js */\n${css}\n</style>`)
|
|
|
|
|
|
|
|
await writeFile(html2xxFile, html, 'utf8')
|
2018-01-14 01:41:15 +00:00
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
async function compileThemesSass () {
|
2018-01-14 01:41:15 +00:00
|
|
|
let files = (await readdir(themesScssDir)).filter(file => !path.basename(file).startsWith('_'))
|
|
|
|
await Promise.all(files.map(async file => {
|
|
|
|
let res = await render({file: path.join(themesScssDir, file)})
|
2018-01-14 02:59:49 +00:00
|
|
|
let outputFilename = 'theme-' + path.basename(file).replace(/\.scss$/, '.css')
|
|
|
|
await writeFile(path.join(assetsDir, outputFilename), res.css, 'utf8')
|
2018-01-14 01:41:15 +00:00
|
|
|
}))
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
async function main () {
|
2018-01-14 01:41:15 +00:00
|
|
|
await Promise.all([compileGlobalSass(), compileThemesSass()])
|
|
|
|
if (argv.watch) {
|
|
|
|
doWatch()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Promise.resolve().then(main).catch(err => {
|
|
|
|
console.error(err)
|
|
|
|
process.exit(1)
|
2018-02-09 06:29:29 +00:00
|
|
|
})
|