summaryrefslogtreecommitdiff
path: root/client/build.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/build.js')
-rw-r--r--client/build.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/client/build.js b/client/build.js
new file mode 100644
index 0000000..eb32e9b
--- /dev/null
+++ b/client/build.js
@@ -0,0 +1,119 @@
+'use strict';
+
+const fs = require('fs');
+const glob = require('glob');
+const path = require('path');
+const util = require('util');
+const execSync = require('child_process').execSync;
+
+function getVersion() {
+ return execSync('git describe --always --dirty --long --tags').toString();
+}
+
+function getConfig() {
+ const ini = require('ini');
+ const merge = require('merge');
+ const camelcaseKeys = require('camelcase-keys');
+
+ function parseIniFile(path) {
+ let result = ini.parse(fs.readFileSync(path, 'utf-8')
+ .replace(/#.+$/gm, '')
+ .replace(/\s+$/gm, ''));
+ Object.keys(result).map((key, _) => {
+ result[key] = camelcaseKeys(result[key]);
+ });
+ return result;
+ }
+
+ let config = parseIniFile('../config.ini.dist');
+
+ try {
+ const localConfig = parseIniFile('../config.ini');
+ config = merge.recursive(config, localConfig);
+ } catch (e) {
+ console.warn('Local config does not exist, ignoring');
+ }
+
+ delete config.basic.secret;
+ delete config.smtp;
+ delete config.database;
+ config.service.userRanks = config.service.userRanks.split(/,\s*/);
+ config.service.tagCategories = config.service.tagCategories.split(/,\s*/);
+ config.meta = {
+ version: getVersion(),
+ buildDate: new Date().toUTCString(),
+ };
+
+ return config;
+}
+
+function bundleHtml(config) {
+ const minify = require('html-minifier').minify;
+ const baseHtml = fs.readFileSync('./html/index.htm', 'utf-8');
+ glob('./html/**/*.hbs', {}, (er, files) => {
+ let templatesHtml = '';
+ for (const file of files) {
+ templatesHtml += util.format(
+ '<template id=\'%s-template\'>%s</template>',
+ path.basename(file, '.hbs').replace('_', '-'),
+ fs.readFileSync(file));
+ }
+
+ const finalHtml = baseHtml
+ .replace(/(<\/head>)/, templatesHtml + '$1')
+ .replace(
+ /(<title>)(.*)(<\/title>)/,
+ util.format('$1%s$3', config.basic.name));
+
+ fs.writeFileSync(
+ './public/index.htm',
+ minify(
+ finalHtml, {
+ removeComments: true,
+ collapseWhitespace: true,
+ conservativeCollapse: true}));
+ console.info('Bundled HTML');
+ });
+}
+
+function bundleCss() {
+ const minify = require('csso').minify;
+ glob('./css/**/*.css', {}, (er, files) => {
+ let css = '';
+ for (const file of files) {
+ css += fs.readFileSync(file);
+ }
+ fs.writeFileSync('./public/bundle.min.css', minify(css));
+ console.info('Bundled CSS');
+ });
+}
+
+function bundleJs() {
+ const browserify = require('browserify');
+ const uglifyjs = require('uglify-js');
+ glob('./js/**/*.js', {}, function(er, files) {
+ const outputFile = fs.createWriteStream('./public/bundle.min.js');
+ browserify().add(files).bundle().pipe(outputFile);
+ outputFile.on('finish', function() {
+ const result = uglifyjs.minify('./public/bundle.min.js');
+ fs.writeFileSync('./public/bundle.min.js', result.code);
+ console.info('Bundled JS');
+ });
+ });
+}
+
+function bundleConfig(config) {
+ fs.writeFileSync(
+ './js/.config.autogen.json', JSON.stringify(config));
+}
+
+function copyFile(source, target) {
+ fs.createReadStream(source).pipe(fs.createWriteStream(target));
+}
+
+const config = getConfig();
+bundleConfig(config);
+bundleHtml(config);
+bundleCss();
+bundleJs();
+copyFile('./img/favicon.png', './public/favicon.png');