Skip to content

Commit 55d0d21

Browse files
initial code commit
1 parent 95ae27c commit 55d0d21

41 files changed

Lines changed: 1162 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.babelrc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"presets": [
3+
"es2015",
4+
"stage-2"
5+
],
6+
"plugins": [
7+
["transform-runtime", {
8+
"helpers": false,
9+
"polyfill": false,
10+
"regenerator": true,
11+
"moduleName": "babel-runtime"
12+
}]
13+
]
14+
}

.editorconfig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
indent_style = space
6+
indent_size = 2
7+
end_of_line = lf
8+
insert_final_newline = true

.eslintignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.idea/*
2+
dist/*
3+
tests/*

.eslintrc.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module.exports = {
2+
root: true,
3+
parser: 'babel-eslint',
4+
parserOptions: {
5+
sourceType: 'module'
6+
},
7+
env: {
8+
browser: true
9+
},
10+
extends: 'standard',
11+
rules: {
12+
'space-before-function-paren': 0
13+
}
14+
}

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.idea
2+
dist
3+
node_modules
4+
npm-debug.log
5+
*.sublime-project
6+
*.sublime-workspace

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# TODO

README.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Build Tools
2+
A starter kit using webpack 2 and gulp.
3+
4+
Note: The examples in this kit are using jQuery but are not concrete to the project.
5+
6+
## TODO:
7+
1. Create a command to remove the boilerplate code.
8+
2. Create a command to quickly scaffold the app (with different presets).
9+
10+
### Features
11+
A list of features in this kit.
12+
13+
* Build Tools
14+
* Gulp ([gulp](http://gulpjs.com/))
15+
* Everything except javascript is handled with Gulp.
16+
* Webpack 2 ([webpack](https://webpack.js.org/))
17+
* Everything javascript related is handle with Webpack 2.
18+
* Environment
19+
* BrowserSync ([browser-sync](https://www.npmjs.com/package/browser-sync))
20+
* Webpack Dev Middleware ([webpack-dev-middleware](https://www.npmjs.com/search?q=webpack-dev-middleware))
21+
* Webpack Hot Middleware ([webpack-hot-middleware](https://www.npmjs.com/package/webpack-hot-middleware))
22+
* Docker (TODO) ([docker](https://www.docker.com/))
23+
* Style Support
24+
* Sass/Scss ([gulp-sass](https://www.npmjs.com/package/gulp-sass))
25+
* Minification ([gulp-cssnano](https://www.npmjs.com/package/gulp-cssnano))
26+
* Media Query Packer ([gulp-combine-mq](https://www.npmjs.com/package/gulp-combine-mq))
27+
* Globbing ([gulp-sass-glob](https://www.npmjs.com/package/gulp-sass-glob))
28+
* Sprites (Sprite Scss File) ([gulp.spritesmith](https://www.npmjs.com/package/gulp.spritesmith))
29+
* Sourcemaps ([gulp-sourcemaps](https://www.npmjs.com/package/gulp-sourcemaps))
30+
* Script Support (Webpack 2)
31+
* ES2015+
32+
* Asynchronous Modules ([Code Splitting](https://webpack.js.org/guides/code-splitting-import/))
33+
* Tree Shaking ([Tree Shaking](https://webpack.js.org/guides/tree-shaking/#components/sidebar/sidebar.jsx))
34+
* Uglify (Production) ([uglifyjs-webpack-plugin](https://www.npmjs.com/package/uglifyjs-webpack-plugin))
35+
* This comes with Webpack 2 ([Minification](https://webpack.js.org/guides/production-build/#minification))
36+
* Sourcemaps (devtool)
37+
* ([source-maps](https://webpack.js.org/guides/production-build/#source-maps))
38+
* ([devtool](https://webpack.js.org/configuration/devtool/))
39+
* Linting ([eslint](https://www.npmjs.com/package/eslint))
40+
* Webpack Loader ([eslint-loader](https://www.npmjs.com/package/eslint-loader))
41+
* Eslint Standard rules ([eslint-config-standard](https://www.npmjs.com/package/eslint-config-standard))
42+
* Eslint Ignore Files ([Ignoring Files and Directories](http://eslint.org/docs/user-guide/configuring#ignoring-files-and-directories))
43+
* Hot Module Replacement ([NEED SOURCE](#))
44+
* Common Chunks ([CommonsChunkPlugin](https://webpack.js.org/plugins/commons-chunk-plugin/))
45+
* Define Global Constants ([define-plugin](https://webpack.js.org/plugins/define-plugin/))
46+
* Stream (Dist) ([webpack-stream](https://www.npmjs.com/package/webpack-stream))
47+
* Image Support
48+
* Minification ([gulp-imagemin](https://www.npmjs.com/package/gulp-imagemin))
49+
* Sprites (Sprite Image File) ([gulp.spritesmith](https://www.npmjs.com/package/gulp.spritesmith))
50+
* Html Support
51+
* Includes ([gulp-file-include](https://www.npmjs.com/package/gulp-file-include))
52+
* Font Support
53+
* Supported but no tooling, only copies from one folder to another.
54+
* Unit Test Support
55+
* TODO: [Ava](https://www.npmjs.com/package/ava), Maybe?
56+
* Utility Support
57+
* Semver Bumping ([gulp-bump](https://www.npmjs.com/package/gulp-bump))
58+
* Conditional Pipe Control ([gulp-if](https://www.npmjs.com/package/gulp-if))
59+
* Pipe Cleaner ([gulp-plumber](https://www.npmjs.com/package/gulp-plumber))
60+
* Sequential or Parallel Tasks ([run-sequence](https://www.npmjs.com/package/run-sequence))
61+
* Deleting Files ([del](https://www.npmjs.com/package/del))
62+
* Consistent Code Formatting Rules ([editorconfig](http://editorconfig.org/))
63+
64+
### Commands
65+
TODO
66+
67+
### Gettings Started
68+
TODO
69+
70+
#### Environments
71+
TODO: https://www.docker.com/
72+
73+
#### Linting
74+
TODO
75+
76+
#### API
77+
TODO
78+
79+
### Unit test
80+
TODO
81+
82+
### Benchmarking
83+
TODO: Benchmark.js with graphs / platforms to show performance and any degradation over time.

gulpfile.babel.js

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
import browserSync from 'browser-sync'
2+
import bump from 'gulp-bump'
3+
import combineMQ from 'gulp-combine-mq'
4+
import cssnano from 'gulp-cssnano'
5+
import del from 'del'
6+
import gulp from 'gulp'
7+
import gulpIf from 'gulp-if'
8+
import imagemin from 'gulp-imagemin'
9+
import include from 'gulp-file-include'
10+
import plumber from 'gulp-plumber'
11+
import { resolve } from 'path'
12+
import runSequence from 'run-sequence'
13+
import sass from 'gulp-sass'
14+
import sassGlob from 'gulp-sass-glob'
15+
import sourcemaps from 'gulp-sourcemaps'
16+
import spritesmith from 'gulp.spritesmith'
17+
import watch from 'gulp-watch'
18+
import webpack from 'webpack'
19+
import webpackStream from 'webpack-stream'
20+
import webpackDevMiddleware from 'webpack-dev-middleware'
21+
import webpackHotMiddleware from 'webpack-hot-middleware'
22+
import webpackConfig from './webpack.config.babel'
23+
24+
const isProduction = process.env.NODE_ENV === 'production'
25+
const server = browserSync.create()
26+
27+
/**
28+
* The development server.
29+
*/
30+
gulp.task('server', ['build'], done => {
31+
const bundler = webpack(webpackConfig)
32+
33+
server.init({
34+
notify: false,
35+
logLevel: 'none',
36+
server: {
37+
baseDir: resolve(__dirname, 'dist'),
38+
middleware: [
39+
webpackDevMiddleware(bundler, webpackConfig.devServer),
40+
webpackHotMiddleware(bundler)
41+
]
42+
}
43+
}, done)
44+
})
45+
46+
/**
47+
* Webpack build stream.
48+
*/
49+
gulp.task('webpack', () => {
50+
return gulp.src(resolve(__dirname, 'src/js/app.js'))
51+
.pipe(webpackStream(webpackConfig, webpack))
52+
.pipe(gulp.dest(resolve(__dirname, 'dist/js')))
53+
})
54+
55+
/**
56+
* Compile scss files into css files.
57+
*/
58+
gulp.task('styles', () => {
59+
return gulp.src(resolve(__dirname, 'src/scss/**/*.scss'))
60+
.pipe(plumber())
61+
.pipe(sassGlob())
62+
.pipe(gulpIf(isProduction, sourcemaps.init()))
63+
.pipe(sass({
64+
includePaths: ['node_modules']
65+
}).on('error', sass.logError))
66+
.pipe(combineMQ())
67+
.pipe(gulpIf(isProduction, cssnano()))
68+
.pipe(gulpIf(isProduction, sourcemaps.write('./')))
69+
.pipe(gulp.dest(resolve(__dirname, 'dist/css')))
70+
.pipe(server.stream())
71+
})
72+
73+
/**
74+
* Render html files and copy into dist on build.
75+
*/
76+
gulp.task('html', () => {
77+
return gulp.src(resolve(__dirname, 'src/**/*.html'))
78+
.pipe(plumber())
79+
.pipe(include({
80+
prefix: '@@',
81+
basepath: resolve(__dirname, 'src')
82+
}))
83+
.pipe(gulp.dest(resolve(__dirname, 'dist')))
84+
.pipe(server.stream({ reload: true }))
85+
})
86+
87+
/**
88+
* Minify and copy our images into dist on build.
89+
*/
90+
gulp.task('images', () => {
91+
return gulp.src([
92+
resolve(__dirname, 'src/img/**'),
93+
`!${resolve(__dirname, 'src/img/sprites{,/**}')}`
94+
])
95+
.pipe(plumber())
96+
.pipe(gulpIf(isProduction, imagemin()))
97+
.pipe(gulp.dest(resolve(__dirname, 'dist/img')))
98+
.pipe(server.stream())
99+
})
100+
101+
/**
102+
* Creates a spritesheet from our img/sprites folder.
103+
*/
104+
gulp.task('sprite', () => {
105+
return gulp.src(resolve(__dirname, 'src/img/sprites/**/*'))
106+
.pipe(plumber())
107+
.pipe(spritesmith({
108+
imgName: 'img/sprite.png',
109+
cssName: 'scss/_sprite.scss'
110+
}))
111+
.pipe(gulp.dest(resolve(__dirname, 'src')))
112+
.pipe(server.stream())
113+
})
114+
115+
/**
116+
* Copy font files into dist on build.
117+
*/
118+
gulp.task('fonts', () => {
119+
return gulp.src([
120+
resolve(__dirname, 'src/fonts/**/*.{woff,woff2,eot,ttf,otf,svg}'),
121+
resolve(__dirname, 'node_modules/font-awesome/fonts/**/*.{woff,woff2,eot,ttf,otf,svg}')
122+
])
123+
.pipe(plumber())
124+
.pipe(gulp.dest(resolve(__dirname, 'dist/fonts')))
125+
.pipe(server.stream())
126+
})
127+
128+
/**
129+
* Clean our dist folder before building.
130+
*/
131+
gulp.task('clean', () => del([resolve(__dirname, 'dist')], {
132+
force: true
133+
}))
134+
135+
/**
136+
* Watch for file changes. gulp.watch wasn't picking up image changes
137+
* so switched over to gulp-watch.
138+
*
139+
* Note:
140+
* If we start having issues with multiple file changes at once,
141+
* gulp-batch (https://github.com/floatdrop/gulp-batch) will help
142+
* solve those issues. For now I'm leaving out.
143+
*
144+
* See for more info: https://github.com/gulpjs/gulp/issues/80
145+
*/
146+
gulp.task('watch', () => {
147+
watch(resolve(__dirname, 'src/scss/**/*.scss'), () => gulp.start('styles'))
148+
watch(resolve(__dirname, 'src/**/*.html'), () => gulp.start('html'))
149+
watch(resolve(__dirname, 'src/img/**'), () => gulp.start('images'))
150+
watch(resolve(__dirname, 'src/img/sprites/**/*'), () => gulp.start('sprite'))
151+
watch([
152+
resolve(__dirname, 'src/fonts/**/*.{woff,woff2,eot,ttf,otf,svg}'),
153+
resolve(__dirname, 'node_modules/font-awesome/fonts/**/*.{woff,woff2,eot,ttf,otf,svg}')
154+
], () => gulp.start('fonts'))
155+
})
156+
157+
/**
158+
* Bumps the semver patch up by 1
159+
*/
160+
gulp.task('patch', () => {
161+
return gulp.src(resolve(__dirname, 'package.json'))
162+
.pipe(bump({ type: 'patch' }))
163+
.pipe(gulp.dest(resolve(__dirname)))
164+
})
165+
166+
/**
167+
* Bumps the semver minor up by 1
168+
*/
169+
gulp.task('minor', () => {
170+
return gulp.src(resolve(__dirname, 'package.json'))
171+
.pipe(bump({ type: 'minor' }))
172+
.pipe(gulp.dest(resolve(__dirname)))
173+
})
174+
175+
/**
176+
* Bumps the semver major up by 1
177+
*/
178+
gulp.task('major', () => {
179+
return gulp.src(resolve(__dirname, 'package.json'))
180+
.pipe(bump({ type: 'major' }))
181+
.pipe(gulp.dest(resolve(__dirname)))
182+
})
183+
184+
/**
185+
* Dist folder build without cleaning.
186+
*
187+
* Note: Webpack is handled by the dev middleware. We don't need to run the task now.
188+
*/
189+
gulp.task('build', done => runSequence('sprite', ['styles', 'images', 'html', 'fonts'], done))
190+
191+
/**
192+
* Clean dist folder build
193+
*/
194+
gulp.task('dist', done => runSequence('clean', 'build', 'webpack', done))
195+
196+
/**
197+
* Default Task
198+
*/
199+
gulp.task('default', done => runSequence('server', 'watch', done))

package.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"name": "build-tools",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"private": true,
6+
"scripts": {
7+
"dev": "cross-env NODE_ENV=development gulp",
8+
"build": "cross-env NODE_ENV=production gulp dist",
9+
"test": "echo \"Error: no test specified\" && exit 1"
10+
},
11+
"devDependencies": {
12+
"babel-core": "^6.23.1",
13+
"babel-eslint": "^7.2.1",
14+
"babel-loader": "^6.4.0",
15+
"babel-plugin-transform-runtime": "^6.23.0",
16+
"babel-preset-es2015": "^6.22.0",
17+
"babel-preset-stage-2": "^6.22.0",
18+
"browser-sync": "^2.18.8",
19+
"cross-env": "^3.2.3",
20+
"del": "^2.2.2",
21+
"eslint": "^3.18.0",
22+
"eslint-config-standard": "^7.1.0",
23+
"eslint-loader": "^1.7.0",
24+
"eslint-plugin-promise": "^3.5.0",
25+
"eslint-plugin-standard": "^2.1.1",
26+
"file-loader": "^0.10.1",
27+
"gulp": "^3.9.1",
28+
"gulp-bump": "^2.7.0",
29+
"gulp-combine-mq": "^0.4.0",
30+
"gulp-cssnano": "^2.1.2",
31+
"gulp-file-include": "^1.0.0",
32+
"gulp-if": "^2.0.2",
33+
"gulp-imagemin": "^3.1.1",
34+
"gulp-plumber": "^1.1.0",
35+
"gulp-sass": "^3.1.0",
36+
"gulp-sass-glob": "^1.0.8",
37+
"gulp-sourcemaps": "^2.4.1",
38+
"gulp-watch": "^4.3.11",
39+
"gulp.spritesmith": "^6.3.0",
40+
"run-sequence": "^1.2.2",
41+
"url-loader": "^0.5.8",
42+
"webpack": "^2.2.1",
43+
"webpack-dev-middleware": "^1.10.1",
44+
"webpack-hot-middleware": "^2.17.1",
45+
"webpack-stream": "^3.2.0"
46+
},
47+
"dependencies": {
48+
"font-awesome": "^4.7.0",
49+
"jquery": "^3.1.1",
50+
"normalize.css": "^5.0.0",
51+
"slick-carousel": "^1.6.0"
52+
}
53+
}

0 commit comments

Comments
 (0)