1 | 'use strict';
|
2 |
|
3 | process.env.NODE_ENV = process.env.NODE_ENV || 'production'
|
4 |
|
5 | var path = require('path')
|
6 | var fs = require('fs');
|
7 |
|
8 | var gulp = require('gulp')
|
9 | var xtend = require('xtend')
|
10 | var through = require('through2')
|
11 | var combineStream = require('stream-combiner')
|
12 | var es = require('event-stream');
|
13 | var VFile = require('vinyl')
|
14 | var gutil = require('gulp-util')
|
15 | var gulpif = require('gulp-if')
|
16 | var uglify = require('gulp-uglify')
|
17 | var insert = require('gulp-insert')
|
18 | var RevAll = require('gulp-rev-all')
|
19 | var nano = require('gulp-cssnano');
|
20 |
|
21 | var bundle = require('./bundle')
|
22 |
|
23 | var APP_ROOT = process.cwd()
|
24 | var arparts = APP_ROOT.split(path.sep)
|
25 | if (arparts[arparts.length-1] === 'framework') {
|
26 | arparts.pop()
|
27 | APP_ROOT = arparts.join(path.sep)
|
28 | }
|
29 | var mRoot = path.join(APP_ROOT, 'src')
|
30 | var 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 |
|
44 | function 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 |
|
54 | function dest() {
|
55 | var destPath = path.join.apply(path, [mRoot.replace(/src$/, '.dist')].concat([].slice.call(arguments)))
|
56 | return gulp.dest(destPath)
|
57 | }
|
58 |
|
59 | function 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 |
|
70 | var qasWrapperHeader = fs.readFileSync(require.resolve('qas/loader-wrapper-header.js'), 'utf-8')
|
71 | var qasWrapperFooter = fs.readFileSync(require.resolve('qas/loader-wrapper-footer.js'), 'utf-8')
|
72 |
|
73 | var globalLibsPath = path.join(mRoot, 'global.libs.json')
|
74 | var globalPreloadPath = path.join(mRoot, 'global.js')
|
75 | var globalLibs = []
|
76 |
|
77 | if (fs.existsSync(globalLibsPath)) {
|
78 | globalLibs = JSON.parse(fs.readFileSync(globalLibsPath, 'utf-8'))
|
79 | }
|
80 |
|
81 | gulp.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 |
|
141 | module.exports = gulp
|