From 1846a1fa2ca9e4917dbf8a32bf234556e6d5fa98 Mon Sep 17 00:00:00 2001 From: rr- Date: Sun, 27 Mar 2016 20:29:47 +0200 Subject: front/build: replace npm scripts with 1 script --- scripts/build-frontend.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++ scripts/host-waitress | 30 +++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 scripts/build-frontend.js create mode 100755 scripts/host-waitress (limited to 'scripts') diff --git a/scripts/build-frontend.js b/scripts/build-frontend.js new file mode 100644 index 0000000..3da863c --- /dev/null +++ b/scripts/build-frontend.js @@ -0,0 +1,83 @@ +'use strict'; + +const glob = require('glob'); +const fs = require('fs'); + +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*/); + + return config; +} + +function bundleHtml() { + const minify = require('html-minifier').minify; + const html = fs.readFileSync('./static/html/index.htm', 'utf-8'); + fs.writeFileSync( + './public/index.htm', + minify(html, {removeComments: true, collapseWhitespace: true})); + console.info('Bundled HTML'); +} + +function bundleCss() { + const minify = require('cssmin'); + glob('static/**/*.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('./static/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( + './static/js/.config.autogen.json', JSON.stringify(config)); +} + +const config = getConfig(); +bundleConfig(config); +bundleHtml(); +bundleCss(); +bundleJs(); diff --git a/scripts/host-waitress b/scripts/host-waitress new file mode 100755 index 0000000..8b369ff --- /dev/null +++ b/scripts/host-waitress @@ -0,0 +1,30 @@ +#!/bin/python3 + +''' +Script facade for direct execution with waitress WSGI server. +Note that szurubooru can be also run using ``python -m szurubooru``, when in +the repository's root directory. +''' + +import argparse +import os.path +import sys +import waitress + +sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.path.pardir)) +from szurubooru.app import create_app + +def main(): + parser = argparse.ArgumentParser('Starts szurubooru using waitress.') + parser.add_argument( + '-p', '--port', + type=int, help='port to listen on', default=6666) + parser.add_argument( + '--host', help='IP to listen on', default='0.0.0.0') + args = parser.parse_args() + + app = create_app() + waitress.serve(app, host=args.host, port=args.port) + +if __name__ == '__main__': + main() -- cgit v1.3