181 lines
4 KiB
JavaScript
181 lines
4 KiB
JavaScript
const fs = require('fs')
|
|
const cp = require('child_process')
|
|
const process = require('process')
|
|
const deasync = require('deasync')
|
|
const exec = cp.execSync
|
|
|
|
const less = require('less')
|
|
const CleanCSS = require('clean-css')
|
|
const html = require('html-minifier')
|
|
|
|
|
|
const red = '\033[1;31m'
|
|
const green = '\033[1;32m'
|
|
const yellow = '\033[1;33m'
|
|
const blue = '\033[1;34m'
|
|
|
|
const bold = '\033[1m'
|
|
const reset = '\033[0m'
|
|
|
|
|
|
const minjs = 'script.min.js'
|
|
const mincss = 'style.min.css'
|
|
const minhtml = 'index.html'
|
|
const root = ['.domains']
|
|
|
|
|
|
main()
|
|
|
|
|
|
function main() {
|
|
switch (process.argv[2]) {
|
|
|
|
case 'build':
|
|
const dir = process.argv[3]
|
|
if (dir)
|
|
buildOne(dir)
|
|
else
|
|
buildAll()
|
|
break
|
|
|
|
case 'archive':
|
|
archive()
|
|
break
|
|
|
|
case 'clean':
|
|
clean()
|
|
break
|
|
|
|
default:
|
|
print('Available actions:', true)
|
|
printList([
|
|
'build',
|
|
'build <dir>',
|
|
'archive',
|
|
'clean',
|
|
])
|
|
break
|
|
}
|
|
}
|
|
|
|
|
|
function buildAll() {
|
|
buildOne('.')
|
|
}
|
|
|
|
function buildOne(dir) {
|
|
print(`${bold}Building:${reset} ${dir}`)
|
|
fs.mkdirSync(`dist/${dir}`, {recursive: true})
|
|
print('Minifying JS')
|
|
minifyJs(dir)
|
|
print('Rendering LESS')
|
|
renderLess(dir)
|
|
print('Minifying CSS')
|
|
minifyCss(dir)
|
|
print('Converting paths in HTML')
|
|
convertPathsHtml(dir)
|
|
print('Minifying HTML')
|
|
minifyHtml(dir)
|
|
}
|
|
|
|
function minifyJs(dir) {
|
|
const orderFile = `${dir}/js/order.json`
|
|
let order
|
|
if (fs.existsSync(orderFile)) {
|
|
order = JSON.parse(fs.readFileSync(orderFile))
|
|
}
|
|
else {
|
|
print(
|
|
'Unable to find order.json, skipping',
|
|
false, '!', yellow,
|
|
)
|
|
return
|
|
}
|
|
exec(
|
|
`node_modules/.bin/terser -o "dist/${dir}/${minjs}" ` +
|
|
order.map(js => `"${dir}/js/${js}"`).join(' ')
|
|
)
|
|
}
|
|
|
|
function renderLess(dir) {
|
|
const content = deasync(less.render)(
|
|
fs.readFileSync(`${dir}/styles.less`).toString()
|
|
)
|
|
fs.writeFileSync(
|
|
`dist/${dir}/${mincss}`,
|
|
content.css,
|
|
)
|
|
}
|
|
|
|
function minifyCss(dir) {
|
|
const renderedCss = `dist/${dir}/${mincss}`
|
|
const content = new CleanCSS().minify(
|
|
fs.readFileSync(renderedCss)
|
|
).styles
|
|
fs.writeFileSync(renderedCss, content)
|
|
}
|
|
|
|
function convertPathsHtml(dir) {
|
|
const scriptRegex = /(?:<script src=['"]?js\/\w+\.js['"]?><\/script>[\s\r\n]*)+/gm
|
|
const content = fs.readFileSync(`${dir}/index.html`)
|
|
.toString()
|
|
.replace(
|
|
'<script src="https://cdn.jsdelivr.net/npm/less"></script>',
|
|
''
|
|
)
|
|
.replace(
|
|
'<link rel="stylesheet/less" type="text/css" href="styles.less" />',
|
|
`<link rel="stylesheet" href="${mincss}" />`
|
|
)
|
|
.replace(
|
|
scriptRegex,
|
|
`<script src="${minjs}"></script>`
|
|
)
|
|
fs.writeFileSync(`dist/${dir}/${minhtml}`, content)
|
|
}
|
|
|
|
function minifyHtml(dir) {
|
|
const convertedHtml = `dist/${dir}/${minhtml}`
|
|
const content = html.minify(
|
|
fs.readFileSync(convertedHtml).toString(),
|
|
{
|
|
collapseBooleanAttributes: true,
|
|
collapseInlineTagWhitespace: true,
|
|
collapseWhitespace: true,
|
|
removeAttributeQuotes: true,
|
|
removeComments: true,
|
|
removeScriptTypeAttributes: true,
|
|
removeStyleLinkTypeAttributes: true,
|
|
useShortDoctype: true,
|
|
keepClosingSlash: false,
|
|
}
|
|
)
|
|
fs.writeFileSync(convertedHtml, content)
|
|
}
|
|
|
|
|
|
function archive() {
|
|
exec('7z a dist.zip dist/*')
|
|
}
|
|
|
|
function clean() {
|
|
exec('rm -rf dist/ dist.zip')
|
|
}
|
|
|
|
|
|
function print(
|
|
str,
|
|
title = false,
|
|
symbol = '*',
|
|
color = blue,
|
|
) {
|
|
console.log(
|
|
`${color}[${symbol}]${reset} ` +
|
|
`${title ? bold : ""}${str}${reset}`
|
|
)
|
|
}
|
|
|
|
function printList(arr) {
|
|
for (let item of arr)
|
|
console.log(` ${item}`)
|
|
}
|