1 | import browserify from 'browserify'
|
2 | import chalk from 'chalk'
|
3 | import exorcist from 'exorcist'
|
4 | import fs from 'fs'
|
5 | import mkdirp from 'mkdirp'
|
6 | import rollupify from 'rollupify'
|
7 | import uglifyJs from 'uglify-js'
|
8 |
|
9 | export 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 |
|
21 | b.require(opts.entry, {expose: opts.expose})
|
22 |
|
23 |
|
24 | b.require(opts.requires)
|
25 |
|
26 |
|
27 | b.transform(rollupify, {config: opts.rollupConfig})
|
28 |
|
29 |
|
30 | opts.externals.forEach(dep => b.external(dep))
|
31 |
|
32 |
|
33 | mkdirp.sync(opts.bundle)
|
34 |
|
35 |
|
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 |
|
57 | const codeStream = fs.createWriteStream(`${opts.bundle}/${outJsMin}`, 'utf8')
|
58 | codeStream.write(minified.code, () => codeStream.end())
|
59 |
|
60 |
|
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 |
|
91 |
|
92 |
|
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 | }
|