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
 | 
						|
  )
 | 
						|
})
 |