Skip to content

Commit

Permalink
feat: use typescript configuration files
Browse files Browse the repository at this point in the history
  • Loading branch information
theBenForce committed Mar 6, 2020
1 parent 6e6956d commit c3636e2
Show file tree
Hide file tree
Showing 9 changed files with 63 additions and 35 deletions.
9 changes: 4 additions & 5 deletions packages/data-migration-cli/src/commands/down.ts
Expand Up @@ -7,17 +7,16 @@ import * as path from "path";
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 Down extends Command {
static description = "run all down migration scripts";

static flags = {
help: flags.help({ char: "h" }),
stage: flags.string({
description: "Stage that will be used when loading config values",
}),
...DefaultFlags,
};

static args = [{ name: "config", default: path.resolve("./.dm.config.js") }];
static args = [];

async run() {
const { args, flags } = this.parse(Down);
Expand All @@ -31,7 +30,7 @@ export default class Down extends Command {
{
title: `Load configuration`,
async task() {
const scriptDetails = await loadScripts(args.config, flags.stage);
const scriptDetails = await loadScripts(flags);
scripts = scriptDetails.scripts;
context = scriptDetails.context;
stage = scriptDetails.stage;
Expand Down
12 changes: 11 additions & 1 deletion packages/data-migration-cli/src/commands/init.ts
@@ -1,22 +1,32 @@
import { Command, flags } from "@oclif/command";
import * as fs from "fs";
import * as Listr from "listr";
import path from "path";

import defaultConfig from "../default-config";
import { DefaultFlags } from "../default-flags";

export default class Init extends Command {
static description = "Creates a basic configuration in the current directory";

static flags = {
help: flags.help({ char: "h" }),
directory: flags.string({
default: "migrations",
char: "d",
description: "Path to migration directory",
}),
...DefaultFlags,
};

async run() {
const { args, flags } = this.parse(Init);

const tasks = new Listr([
{
title: "Creating config",
task() {
fs.writeFileSync("./.dm.config.js", defaultConfig);
fs.writeFileSync(path.resolve(flags.config), defaultConfig(flags.stage, flags.directory));
},
},
]);
Expand Down
9 changes: 4 additions & 5 deletions packages/data-migration-cli/src/commands/list.ts
Expand Up @@ -6,23 +6,22 @@ import loadScripts from "../utils/loadScripts";

import { formatRelative, parseISO, formatDistance } from "date-fns";
import { InitializedMigrationScript } from "data-migration/lib/MigrationScript";
import { DefaultFlags } from "../default-flags";

export default class List extends Command {
static description = "list all migration scripts and their status";

static flags = {
help: flags.help({ char: "h" }),
stage: flags.string({
description: "Stage that will be used when loading config values",
}),
...DefaultFlags,
...cli.table.Flags,
};

static args = [{ name: "config", default: path.resolve("./.dm.config.js") }];
static args = [];

async run() {
const { args, flags } = this.parse(List);
const { scripts } = await loadScripts(args.config, flags.stage);
const { scripts } = await loadScripts(flags);

cli.info(`Found ${scripts.length} scripts`);
cli.table(
Expand Down
6 changes: 4 additions & 2 deletions packages/data-migration-cli/src/commands/new.ts
Expand Up @@ -3,21 +3,23 @@ import DataMigrationProcessor, { Configuration } from "data-migration";
import { format } from "date-fns";
import * as fs from "fs";
import * as path from "path";
import { loadConfiguration } from "data-migration/src";
import { DefaultFlags } from "../default-flags";

export default class New extends Command {
static description = "Create a new migration script";

static flags = {
help: flags.help({ char: "h" }),
config: flags.string({ default: "./.dm.config.js" }),
config: DefaultFlags.config,
};

static args = [{ name: "name", required: true }];

async run() {
const { args, flags } = this.parse(New);

let config: Configuration = require(path.resolve(flags.config));
let config = await loadConfiguration(path.resolve(flags.config));
const prefix = DataMigrationProcessor.getMigrationsPath(config);

if (!fs.existsSync(prefix)) {
Expand Down
21 changes: 7 additions & 14 deletions packages/data-migration-cli/src/commands/up.ts
@@ -1,32 +1,25 @@
import { Command, flags } from "@oclif/command";
import DataMigrationProcessor, {
Configuration,
Driver,
MigrationExecutor,
ScriptContext,
} from "data-migration";
import { ScriptContext } from "data-migration";
import { appendFileSync } from "fs";
import * as Listr from "listr";
import * as path from "path";

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" }),
stage: flags.string({
description: "Stage that will be used when loading config values",
}),
...DefaultFlags,
};

static args = [{ name: "config", default: path.resolve("./.dm.config.js") }];
static args = [];

async run() {
const { args, flags } = this.parse(Up);
const { flags } = this.parse(Up);
let stage: string = "";
let scripts: Array<InitializedMigrationScript>;
let context: ScriptContext;
Expand All @@ -37,15 +30,15 @@ export default class Up extends Command {
{
title: `Load configuration`,
async task() {
const scriptDetails = await loadScripts(args.config, flags.stage);
const scriptDetails = await loadScripts(flags);
scripts = scriptDetails.scripts;
context = scriptDetails.context;
stage = scriptDetails.stage;
},
},
{
title: `Running Up Migrations`,
task(ctx, task) {
task(task) {
const filteredScripts = scripts.filter((script) => !script.hasRun);

task.title = `Running ${filteredScripts.length} Up Migrations on ${stage}`;
Expand Down
11 changes: 7 additions & 4 deletions packages/data-migration-cli/src/default-config.ts
@@ -1,6 +1,9 @@
export default `module.exports = {
defaultStage: "prod",
migrationDirectory: "migrations",
export default (defaultStage = "prod", migrationDirectory = "migrations") => `
import { Configuration } from "data-migration";
export default {
defaultStage: "${defaultStage}",
migrationDirectory: "${migrationDirectory}",
stages: {
prod: {
defaultParams: {
Expand All @@ -22,5 +25,5 @@ export default `module.exports = {
}
}
}
}
} as Configuration;
`;
17 changes: 17 additions & 0 deletions packages/data-migration-cli/src/default-flags.ts
@@ -0,0 +1,17 @@
import { flags } from "@oclif/command";

export interface DefaultFlagParameters {
config: string;
stage?: string;
}

export const DefaultFlags = {
config: flags.string({
default: "./.dm.config.ts",
description: "Path to the configuration file to use",
}),
stage: flags.string({
default: "migrations",
description: "Stage that will be used when loading config values",
}),
};
9 changes: 5 additions & 4 deletions packages/data-migration-cli/src/utils/loadScripts.ts
Expand Up @@ -5,18 +5,19 @@ import * as path from "path";
import createLogger, { logFile } from "../utils/createLogger";
import { InitializedMigrationScript } from "data-migration/lib/MigrationScript";
import { Subscriber } from "rxjs";
import { loadConfiguration } from "data-migration/src";
import { DefaultFlagParameters } from "../default-flags";

interface LoadScriptsResult {
scripts: Array<InitializedMigrationScript>;
context: ScriptContext;
stage: string;
}
export default async function loadScripts(
configPath: string,
forcedStage?: string
flags: DefaultFlagParameters
): Promise<LoadScriptsResult> {
let config: Configuration = require(path.resolve(configPath));
let stage = forcedStage ?? config.defaultStage ?? "prod";
let config = await loadConfiguration(path.resolve(flags.config));
let stage = flags.stage ?? config.defaultStage ?? "prod";
let scripts: Array<InitializedMigrationScript>;
let drivers: Map<string, Driver>;
let context: ScriptContext;
Expand Down
4 changes: 4 additions & 0 deletions packages/data-migration/src/index.ts
Expand Up @@ -15,6 +15,7 @@ import * as _ from "lodash";
import * as methods from "./methods";
import { ProcessorParams } from "./Processor";
import { ExecutionTrackerParams } from "./ExecutionTracker";
import Configuration from "./Config";

export interface ConfigDriverEntry<T> {
driver: DriverBuilder<any>;
Expand All @@ -28,4 +29,7 @@ export type LoadConfigParameters<T> = {
drivers: Record<string, ConfigDriverEntry<T>>;
};

export const loadConfiguration = (configFile: string): Promise<Configuration> =>
UtilsImport.loadScript<Configuration>(configFile);

export default methods;

0 comments on commit c3636e2

Please sign in to comment.