-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
up.ts
77 lines (67 loc) · 2.22 KB
/
up.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { Command, flags } from "@oclif/command";
import { ScriptContext } from "data-migration";
import { appendFileSync } from "fs";
import * as Listr from "listr";
import createLogger, { logFile } from "../utils/createLogger";
import { InitializedMigrationScript } from "data-migration/lib/MigrationScript";
import loadScripts from "../utils/loadScripts";
import { DefaultFlags } from "../default-flags";
export default class Up extends Command {
static description = "run all migration scripts";
static flags = {
help: flags.help({ char: "h" }),
...DefaultFlags,
};
static args = [];
async run() {
const { flags } = this.parse(Up);
let stage: string = "";
let scripts: Array<InitializedMigrationScript>;
let context: ScriptContext;
appendFileSync(logFile, `\n\nStarting migration at ${new Date().toISOString()}`);
const tasks = new Listr([
{
title: `Load configuration`,
async task() {
const scriptDetails = await loadScripts(flags);
scripts = scriptDetails.scripts;
context = scriptDetails.context;
stage = scriptDetails.stage;
},
},
{
title: `Running Up Migrations`,
task(task) {
const filteredScripts = scripts.filter((script) => !script.hasRun);
task.title = `Running ${filteredScripts.length} Up Migrations on ${stage}`;
return new Listr(
filteredScripts.map((script) => ({
title: script.description ?? script.name,
task: script.up,
}))
);
},
},
{
title: `Cleanup`,
task: () => {
const logger = createLogger(["Cleanup"]);
return new Listr(
context.getDriversUsed().map((driverName: string) => ({
title: driverName,
async task() {
logger(`Cleaning up driver ${driverName}`);
const driver = await context.getDriver(driverName);
if (driver.cleanup) await driver.cleanup();
},
}))
);
},
},
]);
await tasks.run().catch((ex) => {
createLogger(["ERROR", "CATCH"])(ex.message);
});
createLogger(["Done"])("");
}
}