UNPKG

2.36 kBJavaScriptView Raw
1let { resolve } = require('path')
2let chokidar = require('chokidar')
3let spinner = require('mico-spinner')
4
5let SizeLimitError = require('./size-limit-error')
6let createReporter = require('./create-reporter')
7let loadPlugins = require('./load-plugins')
8let createHelp = require('./create-help')
9let readPkgUp = require('./read-pkg-up')
10let getConfig = require('./get-config')
11let parseArgs = require('./parse-args')
12let debug = require('./debug')
13let calc = require('./calc')
14
15function throttle(fn) {
16 let next, running
17 // istanbul ignore next
18 return () => {
19 clearTimeout(next)
20 next = setTimeout(async () => {
21 await running
22 running = fn()
23 }, 200)
24 }
25}
26
27async function findPlugins(parentPkg) {
28 let plugins = loadPlugins(parentPkg)
29
30 if (!parentPkg || !plugins.isEmpty) return plugins
31
32 let cwd = resolve(parentPkg.path, '..', '..')
33 let pkg = await readPkgUp(cwd)
34
35 return findPlugins(pkg)
36}
37
38module.exports = async process => {
39 function hasArg(arg) {
40 return process.argv.includes(arg)
41 }
42 let isJsonOutput = hasArg('--json')
43 let isSilentMode = hasArg('--silent')
44 let reporter = createReporter(process, isJsonOutput, isSilentMode)
45 let help = createHelp(process)
46 let config, args
47
48 try {
49 if (hasArg('--version')) {
50 return help.showVersion()
51 }
52
53 let pkg = await readPkgUp(process.cwd())
54 let plugins = await findPlugins(pkg)
55
56 if (hasArg('--help')) {
57 return help.showHelp(plugins)
58 }
59
60 if (!pkg || !pkg.packageJson) {
61 throw new SizeLimitError('noPackage')
62 }
63
64 args = parseArgs(plugins, process.argv)
65
66 if (plugins.isEmpty) {
67 help.showMigrationGuide(pkg)
68 return process.exit(1)
69 }
70
71 config = await getConfig(plugins, process, args, pkg)
72
73 let calcAndShow = async () => {
74 let outputFunc = isJsonOutput ? null : spinner
75 await calc(plugins, config, outputFunc)
76 debug.results(process, args, config)
77 reporter.results(plugins, config)
78 }
79
80 await calcAndShow()
81
82 if (hasArg('--watch')) {
83 let watcher = chokidar.watch(['**/*'], {
84 ignored: '**/node_modules/**'
85 })
86 watcher.on('change', throttle(calcAndShow))
87 }
88
89 if ((config.failed || config.missed) && !args.why) process.exit(1)
90 } catch (e) {
91 debug.error(process, args, config)
92 reporter.error(e)
93 process.exit(1)
94 }
95}