UNPKG

4.25 kBJavaScriptView Raw
1'use strict';
2
3process.env.NODE_ENV = process.env.NODE_ENV || 'production'
4
5var path = require('path')
6var fs = require('fs');
7
8var gulp = require('gulp')
9var xtend = require('xtend')
10var through = require('through2')
11var combineStream = require('stream-combiner')
12var es = require('event-stream');
13var VFile = require('vinyl')
14var gutil = require('gulp-util')
15var gulpif = require('gulp-if')
16var uglify = require('gulp-uglify')
17var insert = require('gulp-insert')
18var RevAll = require('gulp-rev-all')
19var nano = require('gulp-cssnano');
20
21var bundle = require('./bundle')
22
23var APP_ROOT = process.cwd()
24var arparts = APP_ROOT.split(path.sep)
25if (arparts[arparts.length-1] === 'framework') {
26 arparts.pop()
27 APP_ROOT = arparts.join(path.sep)
28}
29var mRoot = path.join(APP_ROOT, 'src')
30var revAll = RevAll({
31 debug: true,
32 dontRenameFile: [/\.html$/],
33 replacer: function(fragment, re, nr, file) {
34 fragment.contents = fragment.contents.replace(re, function(a, p1, p2, p3, p4) {
35 if (p3 !== ".html" && (p2[0] === '.' || p2[0] === '/' || (p2 === "global" && p3 === ".js"))) {
36 return p1 + nr + p3 + p4
37 } else {
38 return a
39 }
40 })
41 }
42})
43
44function src(glob, opts) {
45 opts = opts || {}
46 var xopts = {
47 cwd: mRoot,
48 base: mRoot,
49 }
50 opts = xtend(xopts, opts)
51 return gulp.src.call(gulp, glob, opts)
52}
53
54function dest() {
55 var destPath = path.join.apply(path, [mRoot.replace(/src$/, '.dist')].concat([].slice.call(arguments)))
56 return gulp.dest(destPath)
57}
58
59function tFakeRoot(prefix) {
60 var args = [].slice.call(arguments).filter(Boolean)
61 return through.obj(function (file, enc, cb) {
62 var relativePath = path.relative(file.base, file.path)
63 file.base = path.sep + 'fakeSrcRoot'
64 file.path = path.join(file.base, relativePath)
65 this.push(file)
66 cb()
67 })
68}
69
70var qasWrapperHeader = fs.readFileSync(require.resolve('qas/loader-wrapper-header.js'), 'utf-8')
71var qasWrapperFooter = fs.readFileSync(require.resolve('qas/loader-wrapper-footer.js'), 'utf-8')
72
73var globalLibsPath = path.join(mRoot, 'global.libs.json')
74var globalPreloadPath = path.join(mRoot, 'global.js')
75var globalLibs = []
76
77if (fs.existsSync(globalLibsPath)) {
78 globalLibs = JSON.parse(fs.readFileSync(globalLibsPath, 'utf-8'))
79}
80
81gulp.task('build', function() {
82 return es.merge(src(['**/*', '!js/**']),
83 src(['js/dist/**/*.js', 'js/raw/**/*.js', 'js/main/**/*.js']))
84 .pipe(gulpif(function (file) {
85 return path.relative(file.base, file.path) === 'global.js'
86 }, through.obj(function(file, enc, done) {
87 var opts = {}
88 opts.global = true
89 opts.alterb = function (b) {
90 globalLibs.forEach(function (x) {
91 b.require(x[0], {expose: x[1] || x[0]})
92 })
93 }
94 opts.args = {basedir: mRoot.replace(/[\/]src$/, '')}
95 bundle([file.path], [], opts).then(b => {
96 file.contents = b
97 this.push(file)
98 done()
99 })
100 })))
101 .pipe(gulpif(function (file) {
102 return /\.js$/i.test(file.path) && file.path.indexOf('/js/raw/') > -1
103 }, combineStream(
104 insert.prepend(qasWrapperHeader),
105 insert.append(qasWrapperFooter)
106 )))
107 .pipe(gulpif(function (file) {
108 return /\.js$/i.test(file.path) && file.path.indexOf('/js/main/') > -1
109 }, through.obj(function(file, enc, done) {
110 var opts = {}
111 opts.externals = globalLibs.map(function (x) {
112 return x[1] || x[0]
113 }).filter(Boolean)
114 opts.args = {basedir: mRoot.replace(/[\/]src$/, '')}
115 bundle([file.path], [], opts).then(b => {
116 file.contents = b
117 this.push(file)
118 done()
119 })
120 })))
121 .pipe(tFakeRoot())
122 .pipe(revAll.revision())
123 .pipe(gulpif(function (file) {
124 return /\.js$/i.test(file.path) && !(/\.min\.[a-f0-9]{8}\.js$/i.test(file.path)) &&
125 ((/^\/fakeSrcRoot\/global\.[a-f0-9]{8}\.js$/i.test(file.path)) || file.path.match(/\/js\/(main|raw|dist)\//))
126 }, uglify({
127 compress: {
128 drop_console: true
129 },
130 output: {
131 ascii_only: true,
132 quote_keys: true
133 }
134 })))
135 .pipe(gulpif(function (file) {
136 return /\.css/i.test(file.path) && file.path.indexOf('/css/') > -1
137 }, nano()))
138 .pipe(dest())
139})
140
141module.exports = gulp