1 | let { resolve } = require('path')
|
2 | let chokidar = require('chokidar')
|
3 | let spinner = require('mico-spinner')
|
4 |
|
5 | let SizeLimitError = require('./size-limit-error')
|
6 | let createReporter = require('./create-reporter')
|
7 | let loadPlugins = require('./load-plugins')
|
8 | let createHelp = require('./create-help')
|
9 | let readPkgUp = require('./read-pkg-up')
|
10 | let getConfig = require('./get-config')
|
11 | let parseArgs = require('./parse-args')
|
12 | let debug = require('./debug')
|
13 | let calc = require('./calc')
|
14 |
|
15 | function throttle(fn) {
|
16 | let next, running
|
17 |
|
18 | return () => {
|
19 | clearTimeout(next)
|
20 | next = setTimeout(async () => {
|
21 | await running
|
22 | running = fn()
|
23 | }, 200)
|
24 | }
|
25 | }
|
26 |
|
27 | async 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 |
|
38 | module.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 | }
|