1 | const logger = require('./logger');
|
2 | const Stopwatch = require('./stopwatch');
|
3 | const loadConfig = require('./load-config');
|
4 | const runParallel = require('./run-parallel');
|
5 | const loadPackages = require('./load-packages');
|
6 | const sortPackages = require('./sort-packages');
|
7 | const filterPackages = require('./filter-packages');
|
8 |
|
9 | module.exports = task => {
|
10 | const timer = new Stopwatch();
|
11 |
|
12 | return async (...args) => {
|
13 |
|
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 |
|
22 | const config = await loadConfig();
|
23 |
|
24 |
|
25 | const allPackages = await loadPackages(config);
|
26 |
|
27 |
|
28 | const filteredPackages = filterPackages(
|
29 | globals.filter,
|
30 | allPackages,
|
31 | );
|
32 |
|
33 |
|
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 |
|
45 |
|
46 | const tasks = await Reflect.apply(task, null, [
|
47 | sortedPackages,
|
48 | ...options,
|
49 | allPackages,
|
50 | ]);
|
51 |
|
52 |
|
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);
|
71 | }
|
72 | };
|
73 | };
|