173 lines
4.8 KiB
JavaScript
173 lines
4.8 KiB
JavaScript
'use strict'
|
|
const path = require('path')
|
|
const gulp = require('gulp')
|
|
const gulpBase64 = require('gulp-base64')
|
|
const preprocess = require('gulp-preprocess')
|
|
const babel = require('gulp-babel')
|
|
const gutil = require('gulp-util')
|
|
const compiler = require('vueify').compiler
|
|
const stylus = require('stylus')
|
|
const gulpStylus = require('gulp-stylus')
|
|
const through = require('through2')
|
|
const merge2 = require('merge2')
|
|
const colors = require('colors')
|
|
const pkg = require('./package.json')
|
|
const components = require('./examples/components.json')
|
|
// const execSync = require('child_process').execSync
|
|
|
|
colors.setTheme({
|
|
info: 'green',
|
|
warn: 'yellow',
|
|
error: 'red',
|
|
bold: 'bold'
|
|
})
|
|
|
|
const componentList = generateComponentsList(components)
|
|
const uncompliedComponentList = [...componentList]
|
|
const mixins = [
|
|
path.join(__dirname, './components/_style/mixin/*.styl'),
|
|
path.join(__dirname, './node_modules/nib/lib/nib/vendor'),
|
|
path.join(__dirname, './node_modules/nib/lib/nib/gradients'),
|
|
path.join(__dirname, './node_modules/nib/lib/nib/flex')
|
|
]
|
|
|
|
let succNum = 0
|
|
let failNum = 0
|
|
|
|
function generateComponentsList (components) {
|
|
let list = []
|
|
components.map(nav =>
|
|
nav.list.map(item =>
|
|
list.push(item.path.substr(1))
|
|
)
|
|
)
|
|
return list
|
|
}
|
|
|
|
function compilingComponentLog () {
|
|
return through.obj((file, encode, callback) => {
|
|
if (file.path) {
|
|
const res = file.content ? 0 : -1
|
|
file.path.replace(/lib\/((\S)+)/ig, (s, v) => {
|
|
if (!v) return
|
|
if (res < 0) {
|
|
succNum++
|
|
console.log(`${pkg.name}/lib/${v} ✔`.info)
|
|
} else {
|
|
failNum++
|
|
console.log(`${pkg.name}/lib/${v} ✘ (complie error)`.error)
|
|
}
|
|
uncompliedComponentList.splice(uncompliedComponentList.indexOf(v), 1)
|
|
})
|
|
}
|
|
callback()
|
|
})
|
|
}
|
|
|
|
function compileVueStylus (content, cb, compiler, filePath) {
|
|
stylus(content)
|
|
.import(mixins[0])
|
|
.import(mixins[1])
|
|
.import(mixins[2])
|
|
.import(mixins[3])
|
|
.render((err, css) => {
|
|
if (err) throw err
|
|
cb(null, css)
|
|
})
|
|
}
|
|
|
|
function gulpVueify (options) {
|
|
return through.obj(function (file, encode, callback) {
|
|
if (file.isNull()) {
|
|
return callback(null, file)
|
|
}
|
|
if (file.isStream()) {
|
|
this.emit('error', new gutil.PluginError('gulp-vueify', 'Streams are not supported'))
|
|
return callback()
|
|
}
|
|
if (options) {
|
|
compiler.applyConfig(options)
|
|
}
|
|
const isExactCss = options.isExactCss
|
|
let styleContent = ''
|
|
const styleCb = res => {
|
|
if (res.style) {
|
|
styleContent = res.style
|
|
}
|
|
}
|
|
if (isExactCss) {
|
|
compiler.on('style', styleCb)
|
|
}
|
|
compiler.compile(file.contents.toString(), file.path, (err, result) => {
|
|
if (err) {
|
|
this.emit('error', new gutil.PluginError('gulp-vueify',
|
|
`In file ${path.relative(process.cwd(), file.path)}:\n${err.message}`))
|
|
return callback()
|
|
}
|
|
if (isExactCss) {
|
|
// 仅提取css
|
|
file.path = gutil.replaceExtension(file.path, '.css')
|
|
file.contents = Buffer.from(styleContent)
|
|
compiler.removeListener('style', styleCb)
|
|
} else {
|
|
// js & css 集成至一个文件
|
|
file.path = gutil.replaceExtension(file.path, '.js')
|
|
file.contents = Buffer.from(result)
|
|
}
|
|
callback(null, file)
|
|
})
|
|
})
|
|
}
|
|
|
|
gulp.task('compile', () => {
|
|
const streamCompiledVue = gulp.src('./components/*/*.vue')
|
|
.pipe(gulpVueify({
|
|
extractCSS: true,
|
|
customCompilers: {
|
|
stylus: compileVueStylus
|
|
}
|
|
}))
|
|
.pipe(gulp.dest('./lib'))
|
|
.pipe(compilingComponentLog())
|
|
|
|
const streamCompiledCss = gulp.src('./components/*/*.vue')
|
|
.pipe(gulpVueify({
|
|
isExactCss: true,
|
|
customCompilers: {
|
|
stylus: compileVueStylus
|
|
}
|
|
}))
|
|
.pipe(gulpBase64())
|
|
.pipe(gulp.dest('./lib/style'))
|
|
|
|
const streamCompiledStylus = gulp.src('./components/_style/*.styl')
|
|
.pipe(gulpStylus({
|
|
compress: true,
|
|
import: mixins
|
|
}))
|
|
.pipe(gulp.dest('./lib/style'))
|
|
|
|
const streamCompiledJs = gulp.src('./components/**/!(test)/!(component).js')
|
|
.pipe(preprocess({
|
|
context: {
|
|
'NODE_ENV': 'production',
|
|
'MAN_VERSION': `'${pkg.version}' //`
|
|
}}))
|
|
.pipe(babel())
|
|
.pipe(gulp.dest('./lib'))
|
|
|
|
return merge2([streamCompiledVue, streamCompiledCss, streamCompiledStylus, streamCompiledJs])
|
|
})
|
|
|
|
gulp.task('build', ['compile'], () => {
|
|
uncompliedComponentList.map(item => {
|
|
failNum++
|
|
console.log(`${pkg.name}/lib/${item} ✘ (not found)`.error)
|
|
})
|
|
console.log(
|
|
`\n${pkg.name}(${pkg.version}) `.warn.bold +
|
|
`build ${componentList.length} components : `.warn.bold +
|
|
`${succNum} successed / ${failNum} failed\n`.warn.bold
|
|
)
|
|
})
|