dc09.ru-old/dc09.js

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}`)
}