Skip to content
This repository has been archived by the owner on Sep 25, 2019. It is now read-only.

Build & Distribution #15

Merged
merged 5 commits into from
Dec 12, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions bin/test-integration.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env bash

TEST="mkdir sagui-project &&
cd sagui-project &&
npm init -y . &&
npm install --loglevel=silent --save-dev /sagui &&
./node_modules/.bin/sagui install &&
npm test &&
npm run sagui:build &&
npm run sagui:dist"

docker run --rm -ti -v $PWD:/sagui -w /tmp node:5.1 /bin/bash -c "$TEST"
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"test:lint": "eslint .",
"test:unit": "mocha --compilers js:babel/register --recursive --reporter spec ./src/**/*.spec.js",
"test:unit-watch": "npm run test:unit -- --watch",
"test:integration": "docker run --rm -ti -v $PWD:/sagui -w /tmp node:5.1 /bin/bash -c \"mkdir sagui-project && cd sagui-project && npm init -y . && npm install --loglevel=silent --save-dev /sagui && ./node_modules/.bin/sagui install && npm test\"",
"test:integration": "./bin/test-integration.sh",
"prepublish": "npm prune && npm test",
"postinstall": "./bin/sagui install"
},
Expand Down
17 changes: 17 additions & 0 deletions src/action/build-and-distribute.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import webpack from 'webpack'
import { logError } from '../util/log'


export default function buildAndDistribute (webpackConfig) {
const compiler = webpack(webpackConfig)

compiler.run(err => {
if (err) {
logError('Build failed.')
console.log(err.message || err)
process.exit(1)
}

logError('Build complete, files written in the dist/ folder.')
})
}
14 changes: 14 additions & 0 deletions src/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,20 @@ const env = process.env.SAGUI_LINK ? {
}


program.command('build')
.description('Build the project')
.action(function (options) {
sagui.build(env, options)
})


program.command('dist')
.description('Builds an optimized distribution of the project')
.action(function (options) {
sagui.dist(env, options)
})


program.command('develop')
.description('Run development environment')
.action(function (options) {
Expand Down
16 changes: 13 additions & 3 deletions src/config/build-webpack-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ export default function buildWebpackConfig ({ projectPath, saguiPath, pages = de
return {
context: projectPath,

// https://webpack.github.io/docs/configuration.html#bail
// report the first error as a hard error instead of tolerating it
bail: !watch,

eslint: {
configFile: path.join(saguiPath, '.eslintrc'),
failOnError: !watch
Expand Down Expand Up @@ -110,9 +114,15 @@ function buildEntryConfig (pages) {


function buildPluginsConfig (pages, buildTarget) {
let plugins = [
new HotModuleReplacementPlugin()
]
let plugins = []

if (buildTarget === 'develop') {
plugins.push(new HotModuleReplacementPlugin())
}

if (buildTarget === 'dist') {
plugins.push(new optimize.UglifyJsPlugin())
}

if (buildTarget !== 'test') {
plugins.push(new optimize.CommonsChunkPlugin({ name: 'common' }))
Expand Down
16 changes: 15 additions & 1 deletion src/config/build-webpack-config.spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect } from 'chai'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import { optimize } from 'webpack'
import { HotModuleReplacementPlugin, optimize } from 'webpack'
import buildWebpackConfig from './build-webpack-config'

const projectPath = ''
Expand Down Expand Up @@ -28,6 +28,20 @@ describe('build webpack config', function () {
const commons = config.plugins.filter(plugin => plugin instanceof optimize.CommonsChunkPlugin)
expect(commons.length).equal(0)
})

it('should have the UglifyJsPlugin enabled while distributing', function () {
config = buildWebpackConfig({ projectPath, saguiPath, buildTarget: 'dist' }, {})

const commons = config.plugins.filter(plugin => plugin instanceof optimize.UglifyJsPlugin)
expect(commons.length).equal(1)
})

it('should have the HotModuleReplacementPlugin enabled while developing', function () {
config = buildWebpackConfig({ projectPath, saguiPath, buildTarget: 'develop' }, {})

const commons = config.plugins.filter(plugin => plugin instanceof HotModuleReplacementPlugin)
expect(commons.length).equal(1)
})
})

describe('pages', function () {
Expand Down
17 changes: 17 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,27 @@ import buildKarmaConfig from './config/build-karma-config'
import startDevelop from './action/start-develop'
import runTest from './action/run-test'
import install from './action/install'
import buildAndDistribute from './action/build-and-distribute'
import json from './util/json'


export default {
build (env, options) {
const envWithConfig = loadProjectConfig(env)
envWithConfig.buildTarget = 'build'

const webpackConfig = buildWebpackConfig(envWithConfig, options)
buildAndDistribute(webpackConfig)
},

dist (env, options) {
const envWithConfig = loadProjectConfig(env)
envWithConfig.buildTarget = 'dist'

const webpackConfig = buildWebpackConfig(envWithConfig, options)
buildAndDistribute(webpackConfig)
},

develop (env, options) {
const envWithConfig = loadProjectConfig(env)
envWithConfig.buildTarget = 'develop'
Expand Down