1 | import * as execa from "execa";
|
2 | import * as fs from "fs-extra";
|
3 | import { logger } from "backfill-logger";
|
4 | import { outputFolderAsArray } from "backfill-config";
|
5 |
|
6 | export type ExecaReturns = execa.ExecaChildProcess;
|
7 | export type BuildCommand = () => Promise<ExecaReturns | void>;
|
8 |
|
9 | export function getRawBuildCommand(): string {
|
10 | return process.argv.slice(2).join(" ");
|
11 | }
|
12 |
|
13 | export function createBuildCommand(
|
14 | buildCommand: string[],
|
15 | clearOutputFolder: boolean,
|
16 | outputFolder: string | string[]
|
17 | ): () => Promise<ExecaReturns | void> {
|
18 | return async (): Promise<ExecaReturns | void> => {
|
19 | const parsedBuildCommand = buildCommand.join(" ");
|
20 |
|
21 | if (!parsedBuildCommand) {
|
22 | throw new Error("Command not provided");
|
23 | }
|
24 |
|
25 |
|
26 | if (clearOutputFolder) {
|
27 | await Promise.all(
|
28 | outputFolderAsArray(outputFolder).map(folder => fs.remove(folder))
|
29 | );
|
30 | }
|
31 |
|
32 |
|
33 | logger.profile("buildCommand:run");
|
34 | const runner = execa(parsedBuildCommand, {
|
35 | shell: true,
|
36 | ...(process.env.NODE_ENV !== "test" ? { stdio: "inherit" } : {})
|
37 | });
|
38 |
|
39 | return (
|
40 | runner
|
41 |
|
42 | .then(() => {
|
43 | logger.setTime("buildTime", "buildCommand:run");
|
44 | })
|
45 |
|
46 | .catch(err => {
|
47 | if (process.env.NODE_ENV !== "test") {
|
48 | logger.error(`Failed while running: "${parsedBuildCommand}"`);
|
49 | }
|
50 | throw err;
|
51 | })
|
52 | );
|
53 | };
|
54 | }
|