UNPKG

2.86 kBJavaScriptView Raw
1import browserify from 'browserify'
2import chalk from 'chalk'
3import exorcist from 'exorcist'
4import fs from 'fs'
5import mkdirp from 'mkdirp'
6import rollupify from 'rollupify'
7import uglifyJs from 'uglify-js'
8
9export default function bundle(opts) {
10 const domain = chalk.dim(`[${opts.domain}]`)
11
12 console.log(domain, `PacPan is getting your Panels app "${opts.expose}" ready to go :)`)
13 console.time('pacpan-bundle')
14
15 const b = browserify({
16 debug: true,
17 entries: [opts.entry]
18 })
19
20 // entry point of our app, panels needs this to require it
21 b.require(opts.entry, {expose: opts.expose})
22
23 // expose the app dependencies
24 b.require(opts.requires)
25
26 // rollupify the bundle
27 b.transform(rollupify, {config: opts.rollupConfig})
28
29 // declare our build's externals
30 opts.externals.forEach(dep => b.external(dep))
31
32 // make sure the bundle directory exists
33 mkdirp.sync(opts.bundle)
34
35 // determine the bundle's full path
36 const out = `${opts.expose.replace(/[@\/]/g, '')}-${opts.version}`
37
38 const outJs = `${out}.js`
39 const outJsMap = `${outJs}.map`
40
41 const outJsMin = `${out}.min.js`
42 const outJsMinMap = `${outJsMin}.map`
43
44 function minify() {
45 const minified = uglifyJs.minify(`${opts.bundle}/${outJs}`, {
46 compress: {
47 screw_ie8: true
48 },
49 inSourceMap: `${opts.bundle}/${outJsMap}`,
50 mangle: {
51 screw_ie8: true
52 },
53 outSourceMap: outJsMinMap
54 })
55
56 // write the minified code
57 const codeStream = fs.createWriteStream(`${opts.bundle}/${outJsMin}`, 'utf8')
58 codeStream.write(minified.code, () => codeStream.end())
59
60 // write the minified map code
61 const mapStream = fs.createWriteStream(`${opts.bundle}/${outJsMinMap}`, 'utf8')
62 mapStream.write(minified.map, () => mapStream.end())
63 }
64
65 function buildIndexHtml() {
66 const out = fs.createWriteStream(`${opts.bundle}/index.html`, 'utf8')
67
68 const html = fs.readFileSync(`${__dirname}/playground.html`).toString()
69 .replace(
70 '<script src=/panels.js></script>\n',
71 `<script src=/${outJsMin}></script>\n<script src=https://cdn.uxtemple.com/panels.js></script>\n`
72 )
73
74 out.write(html, () => out.end())
75 }
76
77 function buildPanelsJson() {
78 const out = fs.createWriteStream(`${opts.bundle}/panels.json`, 'utf8')
79
80 const json = fs.readFileSync(`${__dirname}/panels.json`).toString().replace('app.js', outJsMin)
81
82 out.write(json)
83 out.end()
84 }
85
86 b.bundle()
87 .pipe(exorcist(`${opts.bundle}/${outJsMap}`, outJsMap))
88 .pipe(fs.createWriteStream(`${opts.bundle}/${outJs}`), 'utf8')
89 .on('finish', () => {
90 // minify()
91 // buildIndexHtml()
92 // buildPanelsJson()
93
94 console.timeEnd('pacpan-bundle')
95 console.log(domain, `PacPan just finished. Your bundle is at ${opts.bundle}:`)
96 console.log(fs.readdirSync(opts.bundle).join(', '))
97 })
98}