diff --git a/adonis-typings/seeder.ts b/adonis-typings/seeder.ts index 6cac5559..f6ccb17d 100644 --- a/adonis-typings/seeder.ts +++ b/adonis-typings/seeder.ts @@ -14,7 +14,11 @@ declare module '@ioc:Adonis/Lucid/Seeder' { * Shape of seeder class */ export type SeederConstructorContract = { + /** + * @deprecated + */ developmentOnly: boolean + environment: string[] new (client: QueryClientContract): { client: QueryClientContract run(): Promise diff --git a/src/BaseSeeder/index.ts b/src/BaseSeeder/index.ts index f4865b77..28371252 100644 --- a/src/BaseSeeder/index.ts +++ b/src/BaseSeeder/index.ts @@ -10,7 +10,11 @@ import { QueryClientContract } from '@ioc:Adonis/Lucid/Database' export class BaseSeeder { + /** + * @deprecated + */ public static developmentOnly: boolean + public static environment: string[] constructor(public client: QueryClientContract) {} public async run() {} diff --git a/src/SeedsRunner/index.ts b/src/SeedsRunner/index.ts index dc9dc301..db2d640a 100644 --- a/src/SeedsRunner/index.ts +++ b/src/SeedsRunner/index.ts @@ -57,11 +57,17 @@ export class SeedsRunner { file: file, } + if ('developmentOnly' in Source) { + this.app.logger.warn(`Seeder "${file.name}" is using the deprecated flag "developmentOnly".`) + } + /** - * Ignore when running in non-development environment and seeder is development - * only + * Ignore when when the node environement is not the same as the seeder configuration. */ - if (Source.developmentOnly && !this.app.inDev) { + if ( + (Source.developmentOnly && !this.app.inDev) || + (Source.environment && !Source.environment.includes(this.app.nodeEnvironment)) + ) { seeder.status = 'ignored' return seeder } diff --git a/test/seeds/seeds-runner.spec.ts b/test/seeds/seeds-runner.spec.ts index 81af3260..31c3d105 100644 --- a/test/seeds/seeds-runner.spec.ts +++ b/test/seeds/seeds-runner.spec.ts @@ -96,4 +96,62 @@ test.group('Seeds Runner', (group) => { delete process.env.NODE_ENV await db.manager.closeAll() }) + + test('mark file as ignored when "environment = production" and not running in production mode', async ({ + assert, + }) => { + process.env.NODE_ENV = 'development' + + const app = await setupApplication() + const db = getDb(app) + const runner = new SeedsRunner(db, app) + + await fs.add( + 'database/seeders/User.ts', + `export default class FooSeeder { + public static invoked = false + public static environment = ['production'] + + run () { + (this.constructor as any).invoked = true + } + }` + ) + + const files = await runner.getList() + const report = await runner.run(files[0]) + assert.equal(report.status, 'ignored') + + delete process.env.NODE_ENV + await db.manager.closeAll() + }) + + test('mark file as ignored when "environment = development" and not running in development mode', async ({ + assert, + }) => { + process.env.NODE_ENV = 'production' + + const app = await setupApplication() + const db = getDb(app) + const runner = new SeedsRunner(db, app) + + await fs.add( + 'database/seeders/User.ts', + `export default class FooSeeder { + public static invoked = false + public static environment = ['development'] + + run () { + (this.constructor as any).invoked = true + } + }` + ) + + const files = await runner.getList() + const report = await runner.run(files[0]) + assert.equal(report.status, 'ignored') + + delete process.env.NODE_ENV + await db.manager.closeAll() + }) })