UNPKG

2.73 kBJavaScriptView Raw
1const browserify = require('browserify');
2const fse = require('fs-extra');
3const path = require('path');
4const watchify = require('watchify');
5const sourceMaps = require('source-map-support');
6const livereload = require('livereload');
7
8const utils = require('./lib/utils.js');
9const transform = require('./lib/transforms');
10const renderer = require('./lib/renderer.js');
11const getOpts = require('./lib/getopts.js');
12const log = require('./lib/utils/log.js');
13const Less = require('./lib/utils/less.js');
14
15const 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 //TODO: use minimatch to do better matching
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
34const 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
81module.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};