UNPKG

4.1 kBJavaScriptView Raw
1'use strict'
2
3var fs = require('fs')
4var path = require('path')
5
6var browserify = require('browserify')
7var through = require('through2')
8var Promise = require('bluebird')
9var babelify = require('babelify')
10var xtend = require('xtend')
11var bpack = require('browser-pack')
12process.env.NODE_ENV = process.env.NODE_ENV || 'development'
13var envify = require('envify/custom')
14var uglifyify = require('uglifyify')
15
16var qasSrc = fs.readFileSync(require.resolve('qas/qas.min.js'), 'utf-8')
17var qasWrapperHeader = fs.readFileSync(require.resolve('qas/loader-wrapper-header.js'), 'utf-8')
18var qasWrapperFooter = fs.readFileSync(require.resolve('qas/loader-wrapper-footer.js'), 'utf-8')
19
20var APP_ROOT = global.APP_ROOT || process.cwd()
21var pkginfo = require(path.join(APP_ROOT, 'package.json'))
22var pkgBabelify
23if (pkginfo.browserify && pkginfo.browserify.transform && pkginfo.browserify.transform.length) {
24 if (pkginfo.browserify.transform.filter(t => t[0] === 'babelify').length) {
25 pkgBabelify = true
26 }
27}
28
29var isDev = process.env.NODE_ENV === 'development'
30
31var args = {
32 debug: isDev,
33 basedir: APP_ROOT,
34 paths: ['.'],
35 cache: {},
36 packageCache: {},
37 extensions: ['jsx']
38}
39
40var bundle = Promise.coroutine(function * (entries, requires, opts) {
41 opts = opts || {}
42 var b = browserify(xtend(args, opts.args || {}))
43 if (opts.args.packageCache) {
44 b.on('package', function (pkg) {
45 var file = path.join(pkg.__dirname, 'package.json')
46 opts.args.packageCache[file] = pkg
47 })
48 }
49 b = alterPipeline(b, opts)
50 if (typeof opts.alterb === 'function') {
51 opts.alterb(b)
52 }
53 if (entries && entries.length) {
54 entries.forEach(fullPath => b.add(fullPath))
55 }
56 if (requires && requires.length) {
57 requires.forEach(fullPath => b.require(fullPath))
58 }
59 if (opts.babelify !== false && !pkgBabelify) {
60 var babelifyOpts = xtend({}, opts.babelify)
61 if (!babelifyOpts.presets || (Array.isArray(babelifyOpts.presets) && !babelifyOpts.presets.length)) {
62 babelifyOpts.presets = [require('babel-preset-dysonshell'), require('babel-preset-react')]
63 if (opts.hmr) {
64 babelifyOpts.presets.push(require('babel-preset-react-hmre'))
65 }
66 }
67 if (!babelifyOpts.ignore || (Array.isArray(babelifyOpts.ignore) && !babelifyOpts.ignore.length)) {
68 babelifyOpts.ignore = /[\\\/]node_modules[\\\/]/
69 }
70 b.transform(babelify, babelifyOpts)
71 }
72 if (opts.envify !== false) {
73 b.transform(envify(opts.envify || {
74 _: 'purge',
75 NODE_ENV: process.env.NODE_ENV
76 }))
77 }
78 if (opts.transforms) {
79 b.transform(opts.transforms)
80 }
81 if (opts.uglifyify !== false && !isDev) {
82 b.transform(uglifyify, {exts: ['.js', '.jsx']})
83 }
84 if (opts.externals && !opts.global) {
85 if (opts.externals) {
86 b.external(opts.externals)
87 }
88 }
89 var src = yield bundlePromise(b)
90 if (opts.global) {
91 return new Buffer(qasSrc + 'QAS.sync(function () { ' + src + '}); QAS.ready()', 'utf-8')
92 } else {
93 return new Buffer(qasWrapperHeader + src + qasWrapperFooter + 'if (!document.querySelector("script[brocode-global]")) { ' + qasSrc + 'QAS.ready() };', 'utf-8')
94 }
95})
96
97function alterPipeline (b, opts) {
98 opts = opts || {}
99 if (b.pipeline.get('dedupe') && b.pipeline.get('dedupe').length) {
100 b.pipeline.get('dedupe').splice(0, 1) // arguments[4] bug
101 }
102 b.pipeline.get('pack')
103 .splice(0, 1, bpack(xtend(args, {
104 raw: true,
105 hasExports: true,
106 externalRequireName: 'var require = QAS.require; QAS.require'
107 })))
108 if (opts.args.cache) {
109 var cache = opts.args.cache
110 b.pipeline.get('deps').push(through.obj(function (row, enc, next) {
111 var file = row.expose ? b._expose[row.id] : row.file
112 cache[file] = {
113 source: row.source,
114 deps: xtend(row.deps)
115 }
116 this.push(row)
117 next()
118 }))
119 }
120 return b
121}
122
123function bundlePromise (b) { // because b.bundle checks arity :(
124 return new Promise(function (resolve, reject) {
125 b.bundle(function (err, src) {
126 if (err) {
127 return reject(err)
128 }
129 resolve(src)
130 })
131 })
132}
133
134module.exports = bundle