Skip to content

Commit

Permalink
♻️ Improve seed command
Browse files Browse the repository at this point in the history
  • Loading branch information
hirsch committed Jun 6, 2019
1 parent f357fa5 commit 9f0522e
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 43 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
"chalk": "^2.4.2",
"faker": "^4.1.0",
"glob": "^7.1.3",
"ora": "3.4.0",
"reflect-metadata": "^0.1.13",
"typeorm": "^0.2.7",
"yargs": "^13.2.4"
Expand Down
73 changes: 41 additions & 32 deletions src/commands/seed.command.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import * as yargs from 'yargs'
import ora from 'ora'
import chalk from 'chalk'
import { createConnection } from 'typeorm'
import { setConnection, runSeeder, getConnectionOptions } from '../typeorm-seeding'
import { setConnection, runSeeder, getConnectionOptions, getConnection } from '../typeorm-seeding'
import * as pkg from '../../package.json'
import { printError } from '../utils/log.util'
import { importSeed } from '../importer'
Expand All @@ -24,68 +25,76 @@ export class SeedCommand implements yargs.CommandModule {
}

async handler(args: yargs.Arguments) {
// Disable logging for the seeders, but keep it alive for our cli
// tslint:disable-next-line
const log = console.log
// tslint:disable-next-line
console.log = () => void 0

log(chalk.bold(`typeorm-seeding v${(pkg as any).version}`))
const spinner = ora('Loading ormconfig').start()

// Get TypeORM config file
let options: ConnectionOptions
try {
options = await getConnectionOptions(args.config as string)
spinner.succeed('ORM Config loaded')
} catch (error) {
printError('Could not load the config file!', error)
process.exit(1)
panic(spinner, error, 'Could not load the config file!')
}

// Find all factories and seed with help of the config
spinner.start('Import Factories')
const factoryFiles = loadFiles(options.factories || ['src/database/factories/**/*{.js,.ts}'])
const seedFiles = loadFiles(options.seeds || ['src/database/seeds/**/*{.js,.ts}'])
try {
importFiles(factoryFiles)
spinner.succeed('Factories are imported')
} catch (error) {
printError('Could not load factories!', error)
process.exit(1)
panic(spinner, error, 'Could not import factories!')
}

// Status logging to print out the amount of factories and seeds.
log(
'🔎 ',
chalk.gray.underline(`found:`),
chalk.blue.bold(
`${factoryFiles.length} factories`,
chalk.gray('&'),
chalk.blue.bold(`${seedFiles.length} seeds`),
),
)
// Show seeds in the console
spinner.start('Importing Seeders')
const seedFiles = loadFiles(options.seeds || ['src/database/seeds/**/*{.js,.ts}'])
let seedFileObjects = []
try {
seedFileObjects = seedFiles
.map(seedFile => importSeed(seedFile))
.filter(seedFileObject => args.class === undefined || args.class === seedFileObject.name)
spinner.succeed('Seeders are imported')
} catch (error) {
panic(spinner, error, 'Could not import seeders!')
}

// Get database connection and pass it to the seeder
spinner.start('Connecting to the database')
try {
const connection = await createConnection(options)
setConnection(connection)
spinner.succeed('Database connected')
} catch (error) {
printError('Database connection failed! Check your typeORM config file.', error)
process.exit(1)
panic(spinner, error, 'Database connection failed! Check your typeORM config file.')
}

// Show seeds in the console
for (const seedFile of seedFiles) {
// Run seeds
for (const seedFileObject of seedFileObjects) {
spinner.start(`Executing ${seedFileObject.name} Seeder`)
try {
const seedFileObject = importSeed(seedFile)
if (args.class === undefined || args.class === seedFileObject.name) {
log(chalk.gray.underline(`executing seed:`), chalk.green.bold(`${seedFileObject.name}`))
await runSeeder(seedFileObject)
}
await runSeeder(seedFileObject)
spinner.succeed(`Seeder ${seedFileObject.name} executed`)
} catch (error) {
printError(
'Could not run the seeds! Check if your seed script exports the class as default.' +
' Verify that the path to the seeds and factories is correct.',
error,
)
process.exit(1)
panic(spinner, error, `Could not run the seed ${seedFileObject.name}!`)
}
}

log('👍 ', chalk.gray.underline(`finished seeding`))
log('👍 ', chalk.gray.underline(`Finished Seeding`))
process.exit(0)
}
}

function panic(spinner: ora.Ora, error: Error, message: string) {
spinner.fail(message)
// tslint:disable-next-line
console.error(error)
process.exit(1)
}
10 changes: 2 additions & 8 deletions src/typeorm-seeding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,7 @@ export const factory: Factory = <Entity, Settings>(entity: ObjectType<Entity>) =
return new EntityFactory<Entity, Settings>(name, entity, entityFactoryObject.factory, settings)
}

export const runSeeder = async (clazz: SeederConstructor, configPath?: string): Promise<void> => {
let connection = getConnection()
if (!getConnection()) {
connection = await createConnection(configPath)
setConnection(connection)
}

export const runSeeder = async (clazz: SeederConstructor): Promise<void> => {
const seeder: Seeder = new clazz()
return seeder.run(factory, connection)
return seeder.run(factory, getConnection())
}
4 changes: 1 addition & 3 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ export interface Seeder {
/**
* Constructor of the seed class
*/
export interface SeederConstructor {
new (): Seeder
}
export type SeederConstructor = new () => Seeder

/**
* Value of our EntityFactory state
Expand Down
70 changes: 70 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -929,6 +929,13 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"

cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
dependencies:
restore-cursor "^2.0.0"

cli-highlight@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.1.tgz#2180223d51618b112f4509cf96e4a6c750b07e97"
Expand All @@ -940,6 +947,11 @@ cli-highlight@^2.0.0:
parse5 "^4.0.0"
yargs "^13.0.0"

cli-spinners@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7"
integrity sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA==

cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
Expand All @@ -958,6 +970,11 @@ cliui@^5.0.0:
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"

clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=

clone@~0.1.9:
version "0.1.19"
resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85"
Expand Down Expand Up @@ -1168,6 +1185,13 @@ deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=

defaults@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
dependencies:
clone "^1.0.2"

deferred-leveldown@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4"
Expand Down Expand Up @@ -2840,6 +2864,13 @@ lodash@^4.17.11:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==

log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
dependencies:
chalk "^2.0.1"

loose-envify@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
Expand Down Expand Up @@ -2988,6 +3019,11 @@ mime-types@^2.1.12, mime-types@~2.1.19:
dependencies:
mime-db "1.40.0"

mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==

mimic-fn@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
Expand Down Expand Up @@ -3297,6 +3333,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"

onetime@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
dependencies:
mimic-fn "^1.0.0"

optimist@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
Expand All @@ -3317,6 +3360,18 @@ optionator@^0.8.1:
type-check "~0.3.2"
wordwrap "~1.0.0"

[email protected]:
version "3.4.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
dependencies:
chalk "^2.4.2"
cli-cursor "^2.1.0"
cli-spinners "^2.0.0"
log-symbols "^2.2.0"
strip-ansi "^5.2.0"
wcwidth "^1.0.1"

os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
Expand Down Expand Up @@ -3828,6 +3883,14 @@ resolve@^1.10.0, resolve@^1.3.2:
dependencies:
path-parse "^1.0.6"

restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
dependencies:
onetime "^2.0.0"
signal-exit "^3.0.2"

ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
Expand Down Expand Up @@ -4628,6 +4691,13 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"

wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
dependencies:
defaults "^1.0.3"

webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
Expand Down

0 comments on commit 9f0522e

Please sign in to comment.