UNPKG

2.01 kBJavaScriptView Raw
1const logger = require('./logger');
2const Stopwatch = require('./stopwatch');
3const loadConfig = require('./load-config');
4const runParallel = require('./run-parallel');
5const loadPackages = require('./load-packages');
6const sortPackages = require('./sort-packages');
7const filterPackages = require('./filter-packages');
8
9module.exports = task => {
10 const timer = new Stopwatch();
11
12 return async (...args) => {
13 // The final argument is always the command instance
14 const command = args[args.length - 1];
15 const options = args.slice(0, -1);
16 const globals = command.parent.opts();
17
18 try {
19 timer.start();
20
21 // 1. load the root monorepo config
22 const config = await loadConfig();
23
24 // 2. find all packages by path and create package instances
25 const allPackages = await loadPackages(config);
26
27 // 3. filter packages to run in based on filter option
28 const filteredPackages = filterPackages(
29 globals.filter,
30 allPackages,
31 );
32
33 // 4. sort packages topologically
34 const sortedPackages = sortPackages(
35 globals.reverse,
36 filteredPackages,
37 );
38
39 logger.info(`Found ${sortedPackages.length} packages:`);
40 sortedPackages.map(pkg =>
41 logger.debug(`- ${pkg.relativeLocation}`),
42 );
43
44 // 5. create a queue of tasks to run
45 // TODO: refactor argslist into named params
46 const tasks = await Reflect.apply(task, null, [
47 sortedPackages,
48 ...options,
49 allPackages,
50 ]);
51
52 // 6. execute all tasks
53 logger.info(
54 `Running ${tasks.length} tasks up to ${globals.concurrency} tasks at a time`,
55 );
56 await runParallel(
57 tasks,
58 globals.concurrency,
59 globals.preserveOrder,
60 );
61
62 timer.stop();
63
64 logger.endWithSuccess(`Tasks complete, took ${timer.duration}s`);
65 } catch (error) {
66 const message = error instanceof Error ? error.message : error;
67 const exitCode = Number.isInteger(error.code) ? error.code : 1;
68
69 logger.endWithFailure(message);
70 process.exit(exitCode); // eslint-disable-line unicorn/no-process-exit
71 }
72 };
73};