fuse.js 6.24 KB
Newer Older
NGPixel's avatar
NGPixel committed
1 2 3 4 5
'use strict'

/**
 * FUSEBOX
 *
6
 * Client & Server compiler / bundler / watcher
NGPixel's avatar
NGPixel committed
7 8
 */

9 10 11
const colors = require('colors/safe')
const fsbx = require('fuse-box')
const nodemon = require('nodemon')
12 13 14
const babel = require('babel-core')
const uglify = require('uglify-es')
const fs = require('fs-extra')
NGPixel's avatar
NGPixel committed
15

16
// ======================================================
NGPixel's avatar
NGPixel committed
17
// Parse cmd arguments
18
// ======================================================
NGPixel's avatar
NGPixel committed
19 20

const args = require('yargs')
21 22 23 24 25 26 27 28 29 30 31 32 33
  .option('d', {
    alias: 'dev',
    describe: 'Start in Developer mode',
    type: 'boolean'
  })
  .option('c', {
    alias: 'dev-configure',
    describe: 'Start in Configure Developer mode',
    type: 'boolean'
  })
  .help('h')
  .alias('h', 'help')
  .argv
NGPixel's avatar
NGPixel committed
34

35
let mode = 'build'
36
const dev = args.d || args.c
37 38 39 40 41 42 43 44 45 46
if (args.d) {
  console.info(colors.bgWhite.black(' Starting Fuse in DEVELOPER mode... '))
  mode = 'dev'
} else if (args.c) {
  console.info(colors.bgWhite.black(' Starting Fuse in CONFIGURE DEVELOPER mode... '))
  mode = 'dev-configure'
} else {
  console.info(colors.bgWhite.black(' Starting Fuse in BUILD mode... '))
}

47 48 49 50 51 52 53 54 55
// ======================================================
// BUILD VARS
// ======================================================

const ALIASES = {
  'brace-ext-modelist': 'brace/ext/modelist.js',
  'simplemde': 'simplemde/dist/simplemde.min.js',
  'socket-io-client': 'socket.io-client/dist/socket.io.js',
  'vue': (dev) ? 'vue/dist/vue.js' : 'vue/dist/vue.min.js',
NGPixel's avatar
NGPixel committed
56 57
  'vue-lodash': 'vue-lodash/dist/vue-lodash.min.js',
  'vue-resource': (dev) ? 'vue-resource/dist/vue-resource.js' : 'vue-resource/dist/vue-resource.es2015.js'
58 59 60
}
const SHIMS = {
  jquery: {
61
    source: '../node_modules/jquery/dist/jquery.js',
62
    exports: '$'
NGPixel's avatar
NGPixel committed
63 64
  },
  diff2html: {
65
    source: '../node_modules/diff2html/dist/diff2html.min.js',
NGPixel's avatar
NGPixel committed
66 67 68
    exports: 'Diff2Html'
  },
  diff2htmlui: {
69
    source: '../node_modules/diff2html/dist/diff2html-ui.min.js',
NGPixel's avatar
NGPixel committed
70
    exports: 'Diff2HtmlUI'
71 72 73
  }
}

74 75 76
// ======================================================
// Global Tasks
// ======================================================
NGPixel's avatar
NGPixel committed
77

78
console.info(colors.white('└── ') + colors.green('Running global tasks...'))
79
let globalTasks = require('./fuse_tasks')
80 81 82 83 84 85

// ======================================================
// Fuse Tasks
// ======================================================

globalTasks.then(() => {
86
  let fuse = fsbx.FuseBox.init({
87 88
    homeDir: '../client',
    output: '../assets/js/$name.js',
89
    alias: ALIASES,
NGPixel's avatar
NGPixel committed
90
    target: 'browser',
91
    tsConfig: './tsconfig.json',
92 93 94
    plugins: [
      fsbx.EnvPlugin({ NODE_ENV: (dev) ? 'development' : 'production' }),
      fsbx.VuePlugin(),
95
      ['.scss', fsbx.SassPlugin({ outputStyle: (dev) ? 'nested' : 'compressed' }), fsbx.CSSPlugin()],
96
      fsbx.BabelPlugin({ comments: false, presets: ['es2015'] }),
97
      fsbx.JSONPlugin()
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
      /* !dev && fsbx.QuantumPlugin({
        target: 'browser',
        uglify: true,
        api: (core) => {
          core.solveComputed('default/js/components/editor-codeblock.vue', {
            mapping: '/js/ace/ace.js',
            fn: (statement, core) => {
              statement.setExpression(`'/js/ace/ace.js'`)
            }
          })
          core.solveComputed('default/js/components/editor.component.js', {
            mapping: '/js/simplemde/simplemde.min.js',
            fn: (statement, core) => {
              statement.setExpression(`'/js/simplemde/simplemde.min.js'`)
            }
          })
        }
      }) */
116
      // !dev && fsbx.UglifyESPlugin()
117 118 119 120
    ],
    debug: false,
    log: true
  })
121

122 123 124
  const bundleVendor = fuse.bundle('vendor').shim(SHIMS).instructions('~ index.js') // eslint-disable-line no-unused-vars
  const bundleApp = fuse.bundle('app').instructions('!> [index.js]')
  // const bundleApp = fuse.bundle('app').shim(SHIMS).instructions('> index.js')
125
  const bundleSetup = fuse.bundle('configure').instructions('> configure.js')
126

127 128 129
  switch (mode) {
    case 'dev':
      bundleApp.watch()
130 131
      break
    case 'dev-configure':
132
      bundleSetup.watch()
133
      break
134
  }
NGPixel's avatar
NGPixel committed
135

136 137
  fuse.run().then(() => {
    console.info(colors.green.bold('\nAssets compilation + bundling completed.'))
138

139 140 141 142 143 144 145
    if (dev) {
      nodemon({
        exec: (args.d) ? 'node server' : 'node wiki configure',
        ignore: ['assets/', 'client/', 'data/', 'repo/', 'tests/'],
        ext: 'js json',
        watch: (args.d) ? ['server'] : ['server/configure.js'],
        env: { 'NODE_ENV': 'development' }
146
      })
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
    } else {
      console.info(colors.yellow.bold('\nTranspiling vendor bundle...'))
      let appCode = babel.transform(fs.readFileSync('./assets/js/app.js', 'utf8'), {
        babelrc: false,
        compact: false,
        filename: 'app.js',
        plugins: ['transform-object-assign']
      }).code
      let vendorCode = babel.transform(fs.readFileSync('./assets/js/vendor.js', 'utf8'), {
        babelrc: false,
        comments: false,
        compact: false,
        filename: 'vendor.js',
        plugins: [
          'transform-es2015-arrow-functions',
          'transform-es2015-block-scoped-functions',
          'transform-es2015-block-scoping',
          'transform-es2015-classes',
          'transform-es2015-computed-properties',
          'transform-es2015-destructuring',
          'transform-es2015-duplicate-keys',
          'transform-es2015-for-of',
          'transform-es2015-function-name',
          'transform-es2015-literals',
          'transform-es2015-object-super',
          'transform-es2015-parameters',
          'transform-es2015-shorthand-properties',
          'transform-es2015-spread',
          'transform-es2015-sticky-regex',
          'transform-es2015-template-literals',
          'transform-es2015-typeof-symbol',
          'transform-es2015-unicode-regex'
        ]
      }).code
      console.info(colors.yellow.bold('Minifing bundles...'))
      fs.writeFileSync('./assets/js/vendor.js', uglify.minify(vendorCode).code, 'utf8')
      fs.writeFileSync('./assets/js/app.js', uglify.minify(appCode).code, 'utf8')
      fs.writeFileSync('./assets/js/configure.js', uglify.minify(fs.readFileSync('./assets/js/configure.js', 'utf8')).code, 'utf8')
      console.info(colors.green.bold('\nBUILD SUCCEEDED.'))
      return true
187 188 189 190 191
    }
  }).catch(err => {
    console.error(colors.red(' X Bundle compilation failed! ' + err.message))
    process.exit(1)
  })
192
})