1 | const browserify = require('browserify');
|
2 | const fse = require('fs-extra');
|
3 | const path = require('path');
|
4 | const watchify = require('watchify');
|
5 | const sourceMaps = require('source-map-support');
|
6 | const livereload = require('livereload');
|
7 |
|
8 | const utils = require('./lib/utils.js');
|
9 | const transform = require('./lib/transforms');
|
10 | const renderer = require('./lib/renderer.js');
|
11 | const getOpts = require('./lib/getopts.js');
|
12 | const log = require('./lib/utils/log.js');
|
13 | const Less = require('./lib/utils/less.js');
|
14 |
|
15 | const startApp = async (opts)=>{
|
16 | const nodemon = require('nodemon');
|
17 | return new Promise((resolve, reject)=>{
|
18 | let deps = [];
|
19 | browserify({ require : opts.app, bundleExternal : false,
|
20 | postFilter : (id, filepath, pkg)=>{
|
21 |
|
22 | if(id.indexOf(opts.paths.build) !== -1) return false;
|
23 | deps.push(filepath);
|
24 | return true;
|
25 | }
|
26 | }).bundle((err)=>err?reject(err):resolve(deps));
|
27 | })
|
28 | .then((appDeps)=>{
|
29 | nodemon({ script:opts.app, watch:appDeps, delay:2 })
|
30 | .on('restart', (files)=>log.restartServer(opts.app, files));
|
31 | })
|
32 | };
|
33 |
|
34 | const devEntryPoint = async (entryPoint, Opts)=>{
|
35 | let opts = Object.assign({
|
36 | entry : {
|
37 | name : path.basename(entryPoint).split('.')[0],
|
38 | dir : path.dirname(entryPoint)
|
39 | }
|
40 | }, Opts);
|
41 |
|
42 | if(!fse.pathExistsSync(path.resolve(process.cwd(), opts.paths.build, opts.entry.name))){
|
43 | throw log.notBuilt(opts.entry);
|
44 | }
|
45 |
|
46 | const bundler = browserify({
|
47 | cache : {},
|
48 | packageCache : {},
|
49 | debug : true,
|
50 | standalone : opts.entry.name,
|
51 | paths : opts.shared,
|
52 | plugin : [watchify],
|
53 | ignoreMissing : true,
|
54 | postFilter : (id, filepath, pkg)=>{
|
55 | return utils.shouldBundle(filepath, id, opts);
|
56 | },
|
57 | })
|
58 | .require(entryPoint)
|
59 | .transform((file)=>transform(file, opts), {global : true})
|
60 | .on('update', (files)=>{
|
61 | log.rebundle(opts.entry, files);
|
62 | bundle();
|
63 | });
|
64 |
|
65 | let lastBundle;
|
66 | const bundle = async ()=>{
|
67 | const logEnd = log.buildEntryPoint(opts.entry);
|
68 | await utils.bundle(bundler).then((code)=>{
|
69 | if(lastBundle != code) fse.writeFileSync(paths.code, code);
|
70 | lastBundle = code;
|
71 | });
|
72 | await Less.compile(opts).then((css)=>fse.writeFile(paths.style, css));
|
73 | logEnd();
|
74 | };
|
75 |
|
76 | const paths = utils.paths(opts.paths, opts.entry.name);
|
77 | await renderer(Object.assign(opts, {dev : true}));
|
78 | await bundle();
|
79 | };
|
80 |
|
81 | module.exports = async (entryPoints, opts)=>{
|
82 | opts = getOpts(opts, entryPoints);
|
83 | log.beginDev(opts);
|
84 | sourceMaps.install();
|
85 | await opts.targets.reduce((flow, ep)=>flow.then(()=>devEntryPoint(ep, opts)), Promise.resolve());
|
86 | await startApp(opts);
|
87 | await livereload.createServer().watch(opts.paths.build);
|
88 | };
|