feat(cli): run migrations and app in start command (#284)

* feat: perform pending migrations in start command

* feat: log error when DB connection is refused

* feat: log error when Redis connection is refused

* refactor: fix type errors

* fix: correct server and copy graphql schema

* fix: differentiate migrations by env

* chore: remove dev executable

* chore: fix typo in default postgresUsername

* fix: copy json files into dist folder

* chore(cli): add dev script

* chore: pull non-dev logs to info level

* feat(cli): run app in start command

* fix(backend): remove default count in Connection

* fix(cli): remove .eslintrc usage in lint script

* refactor: remove disableMigrationsListValidation

* refactor: make Step optional in ExecutionStep

* refactor: make Flow optional in Step
This commit is contained in:
Ali BARIN
2022-04-08 11:27:46 +02:00
committed by GitHub
parent 45f810b5b8
commit 75eda7f2af
34 changed files with 320 additions and 143 deletions

View File

View File

@@ -1,17 +0,0 @@
#!/usr/bin/env node
const oclif = require('@oclif/core')
const path = require('path')
const project = path.join(__dirname, '..', 'tsconfig.json')
// In dev mode -> use ts-node and dev plugins
process.env.NODE_ENV = 'development'
require('ts-node').register({project})
// In dev mode, always show stack traces
oclif.settings.debug = true;
// Start the CLI
oclif.run().then(oclif.flush).catch(oclif.Errors.handle)

View File

@@ -1,3 +0,0 @@
@echo off
node "%~dp0\dev" %*

View File

@@ -24,16 +24,19 @@
},
"scripts": {
"build": "shx rm -rf dist && tsc -b",
"lint": "eslint . --ext .ts --config .eslintrc",
"dev": "nodemon --watch 'src/**/*.ts' --exec 'shx rm -rf dist && tsc -b' --ext 'ts'",
"lint": "eslint . --ext .ts --ignore-path ../../.eslintignore",
"postpack": "shx rm -f oclif.manifest.json",
"posttest": "yarn lint",
"prepack": "yarn build && oclif manifest && oclif readme",
"version": "oclif readme && git add README.md"
},
"dependencies": {
"@automatisch/backend": "^0.1.0",
"@oclif/core": "^1",
"@oclif/plugin-help": "^5",
"@oclif/plugin-plugins": "^2.0.1"
"@oclif/plugin-plugins": "^2.0.1",
"dotenv": "^10.0.0"
},
"devDependencies": {
"@oclif/test": "^2",
@@ -46,7 +49,7 @@
"shx": "^0.3.3",
"ts-node": "^10.2.1",
"tslib": "^2.3.1",
"typescript": "^4.4.3"
"typescript": "^4.6.3"
},
"oclif": {
"bin": "automatisch",

View File

@@ -1,9 +1,56 @@
import { Command } from '@oclif/core';
import { Command, Flags } from '@oclif/core';
import * as dotenv from 'dotenv';
export default class Start extends Command {
static description = 'Say hello world';
static description = 'Run automatisch';
static flags = {
env: Flags.string({
multiple: true,
char: 'e',
}),
'env-file': Flags.string(),
}
async prepareEnvVars(): Promise<void> {
const { flags } = await this.parse(Start);
if (flags['env-file']) {
dotenv.config({ path: flags['env-file'] });
}
if (flags.env) {
for (const env of flags.env) {
const [key, value] = env.split('=');
process.env[key] = value;
}
}
delete process.env.SERVE_WEB_APP_SEPARATELY;
}
async runMigrationsIfNeeded(): Promise<void> {
const database = (await import('@automatisch/backend/dist/src/config/database')).default;
const migrator = database.migrate;
const [, pendingMigrations] = await migrator.list();
const pendingMigrationsCount = pendingMigrations.length;
const needsToMigrate = pendingMigrationsCount > 0;
if (needsToMigrate) {
await migrator.latest();
}
}
async runApp(): Promise<void> {
await import('@automatisch/backend/dist/src/server');
}
async run(): Promise<void> {
this.log('hello world from start script');
await this.prepareEnvVars();
await this.runMigrationsIfNeeded();
await this.runApp();
}
}

View File

@@ -1,12 +1,17 @@
{
"compilerOptions": {
"declaration": true,
"esModuleInterop": true,
"importHelpers": true,
"lib": ["es2021"],
"module": "commonjs",
"moduleResolution": "node",
"outDir": "dist",
"rootDir": "src",
"skipLibCheck": true,
"strict": true,
"target": "es2019",
"target": "es2021",
"traceResolution": false,
"typeRoots": ["node_modules/@types", "./src/types"]
},
"include": ["src/**/*"]