@ackplus/nest-seeder 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,31 @@ All notable changes to `@ackplus/nest-seeder` are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.1.0] - 2026-06-15
9
+
10
+ ### Added
11
+
12
+ - **`--project` / `-p`** CLI flag (and the `TS_NODE_PROJECT` environment variable) to point the
13
+ CLI's ts-node registration at your own `tsconfig.json`. Previously the CLI used
14
+ `skipProject: true`, so there was no clean way to control the compiler options used to load
15
+ `.ts` config files and entities.
16
+
17
+ ### Changed
18
+
19
+ - The CLI's default ts-node registration now uses **`strict: true`** (was `strict: false`), matching
20
+ how application code is normally compiled. With `strictNullChecks` disabled, some TypeScript
21
+ versions emit `design:type = Object` for string-literal-union columns (e.g.
22
+ `visibility: 'committee' | 'all-members'` with no explicit `@Column` type), which makes TypeORM
23
+ throw `DataTypeNotSupportedError: Data type "Object" … is not supported` on Postgres/MySQL — even
24
+ though the same entities compile fine under the app's own `strict` build. Pass
25
+ `--project ./tsconfig.json` (or set `TS_NODE_PROJECT`) to override.
26
+
27
+ ### Notes
28
+
29
+ - The version-independent fix is to give enum/union columns an explicit column type, e.g.
30
+ `@Column({ type: 'varchar' })`, so TypeORM never relies on reflect-metadata inference. Thanks to
31
+ the reporter for the detailed analysis.
32
+
8
33
  ## [2.0.0] - 2026-06-15
9
34
 
10
35
  A focused redesign that keeps the proven core (`@Factory`, `Seeder`, `DataFactory`) while
@@ -60,5 +85,6 @@ See the [Migration Guide](https://ack-solutions.github.io/nest-seeder/migration)
60
85
  - Last release of the v1 line. Iterative fixes and packaging tweaks across the `1.1.x` series
61
86
  (including the `1.1.15-beta.*` pre-releases).
62
87
 
88
+ [2.1.0]: https://github.com/ack-solutions/nest-seeder/releases/tag/2.1.0
63
89
  [2.0.0]: https://github.com/ack-solutions/nest-seeder/releases/tag/2.0.0
64
90
  [1.1.16]: https://github.com/ack-solutions/nest-seeder/releases/tag/1.1.16
package/dist/cli.js CHANGED
@@ -67,7 +67,7 @@ function resolveConfigPath(configPath) {
67
67
  return null;
68
68
  }
69
69
  var tsNodeRegistered = false;
70
- function setupTsNode() {
70
+ function setupTsNode(project) {
71
71
  if (tsNodeRegistered || require.extensions[".ts"]) {
72
72
  tsNodeRegistered = true;
73
73
  return;
@@ -83,28 +83,42 @@ function setupTsNode() {
83
83
  );
84
84
  }
85
85
  const tsNode = require(tsNodePath);
86
- tsNode.register({
87
- transpileOnly: true,
88
- skipProject: true,
89
- compilerOptions: {
90
- module: "commonjs",
91
- moduleResolution: "node",
92
- experimentalDecorators: true,
93
- emitDecoratorMetadata: true,
94
- esModuleInterop: true,
95
- allowSyntheticDefaultImports: true,
96
- skipLibCheck: true,
97
- target: "ES2021",
98
- resolveJsonModule: true,
99
- strict: false
100
- }
101
- });
86
+ const tsProject = project || process.env.TS_NODE_PROJECT;
87
+ if (tsProject) {
88
+ tsNode.register({
89
+ transpileOnly: true,
90
+ project: path.resolve(process.cwd(), tsProject),
91
+ compilerOptions: {
92
+ experimentalDecorators: true,
93
+ emitDecoratorMetadata: true,
94
+ esModuleInterop: true,
95
+ allowSyntheticDefaultImports: true
96
+ }
97
+ });
98
+ } else {
99
+ tsNode.register({
100
+ transpileOnly: true,
101
+ skipProject: true,
102
+ compilerOptions: {
103
+ module: "commonjs",
104
+ moduleResolution: "node",
105
+ experimentalDecorators: true,
106
+ emitDecoratorMetadata: true,
107
+ esModuleInterop: true,
108
+ allowSyntheticDefaultImports: true,
109
+ skipLibCheck: true,
110
+ target: "ES2021",
111
+ resolveJsonModule: true,
112
+ strict: true
113
+ }
114
+ });
115
+ }
102
116
  tsNodeRegistered = true;
103
117
  }
104
- async function loadSeederConfig(absolutePath) {
118
+ async function loadSeederConfig(absolutePath, options = {}) {
105
119
  const ext = path.extname(absolutePath);
106
120
  if (ext === ".ts") {
107
- setupTsNode();
121
+ setupTsNode(options.project);
108
122
  }
109
123
  let configModule;
110
124
  try {
@@ -444,7 +458,7 @@ function parseContext(raw) {
444
458
  throw new Error(`--context must be valid JSON. Received: ${raw}`);
445
459
  }
446
460
  }
447
- async function createContext(configOption) {
461
+ async function createContext(configOption, projectOption) {
448
462
  const configPath = resolveConfigPath(configOption);
449
463
  if (!configPath) {
450
464
  throw new Error(
@@ -452,11 +466,11 @@ async function createContext(configOption) {
452
466
  );
453
467
  }
454
468
  log.dim(`Using config: ${path2.relative(process.cwd(), configPath)}`);
455
- const config = await loadSeederConfig(configPath);
469
+ const config = await loadSeederConfig(configPath, { project: projectOption });
456
470
  return { config, configPath };
457
471
  }
458
472
  async function runCommand(argv) {
459
- const { config } = await createContext(argv.config);
473
+ const { config } = await createContext(argv.config, argv.project);
460
474
  const options = {
461
475
  refresh: argv.refresh,
462
476
  name: argv.name,
@@ -483,7 +497,7 @@ async function runCommand(argv) {
483
497
  log.success("\u2705 Seeding completed successfully!");
484
498
  }
485
499
  async function listCommand(argv) {
486
- const { config } = await createContext(argv.config);
500
+ const { config } = await createContext(argv.config, argv.project);
487
501
  const seeders = config.seeders ?? [];
488
502
  if (seeders.length === 0) {
489
503
  log.info("No seeders registered in the config.");
@@ -535,6 +549,10 @@ async function main() {
535
549
  alias: "c",
536
550
  type: "string",
537
551
  describe: "Path to the seeder config file (auto-detected if omitted)"
552
+ }).option("project", {
553
+ alias: "p",
554
+ type: "string",
555
+ describe: "Path to a tsconfig.json for ts-node (defaults to strict mode)"
538
556
  }).option("refresh", {
539
557
  alias: "r",
540
558
  type: "boolean",
@@ -584,6 +602,10 @@ async function main() {
584
602
  alias: "c",
585
603
  type: "string",
586
604
  describe: "Path to the seeder config file (auto-detected if omitted)"
605
+ }).option("project", {
606
+ alias: "p",
607
+ type: "string",
608
+ describe: "Path to a tsconfig.json for ts-node"
587
609
  }),
588
610
  listCommand
589
611
  ).example("$0", "Run all seeders using the auto-detected config").example("$0 --refresh", "Drop and reseed all data").example("$0 --name users posts", 'Run only the "users" and "posts" seeders').example("$0 init", "Scaffold starter files").example("$0 list", "List available seeders").strict().alias("h", "help").alias("v", "version").fail((msg, err) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/lib/decorators/seeder.decorator.ts","../src/lib/cli/load-config.ts","../src/lib/cli/templates.ts","../src/lib/seeder/seeder.module.ts","../src/lib/seeder/seeder.service.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { NestFactory } from '@nestjs/core';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { getSeederName } from './lib/decorators/seeder.decorator';\nimport { loadSeederConfig, resolveConfigPath } from './lib/cli/load-config';\nimport { OrmType, scaffoldFiles } from './lib/cli/templates';\nimport { SeederModule } from './lib/seeder/seeder.module';\nimport { SeederService } from './lib/seeder/seeder.service';\nimport type { SeederServiceOptions } from './lib/seeder/seeder.interface';\n\nconst log = {\n info: (msg: string) => console.log(msg),\n error: (msg: string) => console.error(`\\x1b[31m${msg}\\x1b[0m`),\n success: (msg: string) => console.log(`\\x1b[32m${msg}\\x1b[0m`),\n dim: (msg: string) => console.log(`\\x1b[2m${msg}\\x1b[0m`),\n};\n\nfunction parseContext(raw?: string): Record<string, any> | undefined {\n if (!raw) {\n return undefined;\n }\n try {\n return JSON.parse(raw);\n } catch {\n throw new Error(`--context must be valid JSON. Received: ${raw}`);\n }\n}\n\n/** Loads the config and builds the Nest application context. */\nasync function createContext(configOption?: string) {\n const configPath = resolveConfigPath(configOption);\n\n if (!configPath) {\n throw new Error(\n configOption\n ? `Config file not found: ${configOption}`\n : 'No seeder config found. Create a seeder.config.ts (try \"nest-seed init\") ' +\n 'or pass one with --config.',\n );\n }\n\n log.dim(`Using config: ${path.relative(process.cwd(), configPath)}`);\n const config = await loadSeederConfig(configPath);\n return { config, configPath };\n}\n\nasync function runCommand(argv: any): Promise<void> {\n const { config } = await createContext(argv.config);\n\n const options: SeederServiceOptions = {\n refresh: argv.refresh,\n name: argv.name,\n dryRun: argv['dry-run'],\n continueOnError: argv['continue-on-error'],\n dummyData: argv['dummy-data'],\n context: parseContext(argv.context),\n };\n\n if (options.refresh) log.info('🔄 Refresh mode: dropping data before seeding');\n if (options.dryRun) log.info('🔎 Dry run: no data will be written');\n if (options.name) {\n const names = Array.isArray(options.name) ? options.name : [options.name];\n log.info(`🎯 Seeders: ${names.join(', ')}`);\n }\n\n const app = await NestFactory.createApplicationContext(\n SeederModule.register({ ...config, ...options }),\n { logger: ['error', 'warn', 'log'] },\n );\n\n try {\n await app.get(SeederService).run();\n } finally {\n await app.close();\n }\n\n log.success('✅ Seeding completed successfully!');\n}\n\nasync function listCommand(argv: any): Promise<void> {\n const { config } = await createContext(argv.config);\n const seeders = config.seeders ?? [];\n\n if (seeders.length === 0) {\n log.info('No seeders registered in the config.');\n return;\n }\n\n log.info(`Registered seeders (${seeders.length}):`);\n seeders.forEach((seeder: any, index: number) => {\n const className = seeder?.name ?? 'Unknown';\n const stableName = getSeederName(seeder);\n const alias = stableName !== className ? ` (--name ${stableName})` : '';\n log.info(` ${index + 1}. ${className}${alias}`);\n });\n}\n\nfunction initCommand(argv: any): void {\n const orm = argv.orm as OrmType;\n const force = Boolean(argv.force);\n const files = scaffoldFiles(orm);\n\n let created = 0;\n let skipped = 0;\n\n for (const file of files) {\n const absolute = path.resolve(process.cwd(), file.path);\n if (fs.existsSync(absolute) && !force) {\n log.dim(`• skipped (exists): ${file.path}`);\n skipped++;\n continue;\n }\n fs.mkdirSync(path.dirname(absolute), { recursive: true });\n fs.writeFileSync(absolute, file.contents);\n log.success(`• created: ${file.path}`);\n created++;\n }\n\n log.info(`\\nScaffolded ${created} file(s)${skipped ? `, skipped ${skipped}` : ''}.`);\n log.info('\\nNext steps:');\n log.info(' 1. Adjust seeder.config.ts for your database and entities.');\n log.info(' 2. Add a script to package.json:');\n log.dim(' \"seed\": \"nest-seed\"');\n log.info(' 3. Run it:');\n log.dim(' npm run seed');\n if (skipped && !force) {\n log.dim('\\nUse --force to overwrite existing files.');\n }\n}\n\nasync function main(): Promise<void> {\n await yargs(hideBin(process.argv))\n .scriptName('nest-seed')\n .usage('$0 [command] [options]')\n .command(\n ['$0', 'run'],\n 'Run seeders (default command)',\n (y) =>\n y\n .option('config', {\n alias: 'c',\n type: 'string',\n describe: 'Path to the seeder config file (auto-detected if omitted)',\n })\n .option('refresh', {\n alias: 'r',\n type: 'boolean',\n default: false,\n describe: 'Drop data before seeding',\n })\n .option('name', {\n alias: 'n',\n type: 'array',\n string: true,\n describe: 'Run only the named seeder(s)',\n })\n .option('dry-run', {\n type: 'boolean',\n default: false,\n describe: 'Show which seeders would run without executing them',\n })\n .option('continue-on-error', {\n type: 'boolean',\n default: false,\n describe: 'Keep going when a seeder fails',\n })\n .option('context', {\n type: 'string',\n describe: 'JSON forwarded to every seeder via options.context',\n })\n .option('dummy-data', {\n alias: 'd',\n type: 'boolean',\n default: false,\n describe: '[deprecated] forwarded as options.dummyData',\n }),\n runCommand,\n )\n .command(\n 'init',\n 'Scaffold a seeder config, factory and seeder',\n (y) =>\n y\n .option('orm', {\n type: 'string',\n choices: ['typeorm', 'mongoose'] as const,\n default: 'typeorm',\n describe: 'Which ORM template to scaffold',\n })\n .option('force', {\n type: 'boolean',\n default: false,\n describe: 'Overwrite existing files',\n }),\n (argv) => initCommand(argv),\n )\n .command(\n 'list',\n 'List the seeders registered in the config',\n (y) =>\n y.option('config', {\n alias: 'c',\n type: 'string',\n describe: 'Path to the seeder config file (auto-detected if omitted)',\n }),\n listCommand,\n )\n .example('$0', 'Run all seeders using the auto-detected config')\n .example('$0 --refresh', 'Drop and reseed all data')\n .example('$0 --name users posts', 'Run only the \"users\" and \"posts\" seeders')\n .example('$0 init', 'Scaffold starter files')\n .example('$0 list', 'List available seeders')\n .strict()\n .alias('h', 'help')\n .alias('v', 'version')\n .fail((msg, err) => {\n // Re-throw real errors so the catch in `bootstrap` handles them.\n if (err) throw err;\n log.error(`\\n${msg}`);\n console.error('\\nRun \"nest-seed --help\" for usage.');\n process.exit(1);\n })\n .parseAsync();\n}\n\nasync function bootstrap(): Promise<void> {\n log.info('🌱 nest-seeder');\n try {\n await main();\n process.exit(0);\n } catch (error: any) {\n log.error(`\\n❌ ${error?.message ?? error}`);\n if (error?.stack && process.env.NEST_SEEDER_DEBUG) {\n console.error(error.stack);\n } else {\n log.dim('Set NEST_SEEDER_DEBUG=1 for a full stack trace.');\n }\n process.exit(1);\n }\n}\n\n// Only run when invoked directly (not when imported).\nif (require.main === module) {\n bootstrap();\n}\n","/**\n * Stable, minification-safe identifier for a seeder.\n *\n * By default the CLI selects seeders by their class name (`--name UserSeeder`).\n * That breaks when your build minifies class names. Decorate the seeder with\n * `@SeederName('users')` to give it a stable name that survives minification\n * and is nicer to type.\n *\n * @example\n * @Injectable()\n * @SeederName('users')\n * export class UserSeeder implements Seeder { ... }\n *\n * // then: nest-seed --name users\n */\nconst SEEDER_NAME = Symbol.for('nest-seeder:name');\n\nexport function SeederName(name: string): ClassDecorator {\n return (target: any): void => {\n Object.defineProperty(target, SEEDER_NAME, {\n value: name,\n enumerable: false,\n configurable: true,\n writable: false,\n });\n };\n}\n\n/**\n * Resolves the stable name of a seeder class or instance.\n *\n * Resolution order:\n * 1. `@SeederName('...')` decorator value\n * 2. a static `seederName` property\n * 3. the constructor name (default, not minification-safe)\n */\nexport function getSeederName(seeder: any): string {\n const ctor =\n typeof seeder === 'function' ? seeder : seeder?.constructor;\n\n return (\n ctor?.[SEEDER_NAME] ||\n ctor?.seederName ||\n ctor?.name ||\n 'UnknownSeeder'\n );\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { SeederModuleOptions } from '../seeder/seeder.module';\n\n/** Config file names tried, in order, when `--config` is not provided. */\nexport const DEFAULT_CONFIG_NAMES = [\n 'seeder.config.ts',\n 'seeder.config.js',\n 'seeder.config.cjs',\n 'seeder.config.mjs',\n];\n\n/**\n * Finds a seeder config file. When `configPath` is given it is resolved\n * relative to the cwd; otherwise the well-known file names are tried.\n *\n * @returns the absolute path, or `null` when nothing is found\n */\nexport function resolveConfigPath(configPath?: string): string | null {\n if (configPath) {\n const resolved = path.resolve(process.cwd(), configPath);\n return fs.existsSync(resolved) ? resolved : null;\n }\n\n for (const name of DEFAULT_CONFIG_NAMES) {\n const candidate = path.resolve(process.cwd(), name);\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nlet tsNodeRegistered = false;\n\n/**\n * Registers ts-node so `.ts` config files can be required. Throws a friendly\n * error when ts-node is not installed.\n */\nfunction setupTsNode(): void {\n if (tsNodeRegistered || require.extensions['.ts']) {\n tsNodeRegistered = true;\n return;\n }\n\n let tsNodePath: string;\n try {\n tsNodePath = require.resolve('ts-node', {\n paths: [process.cwd(), __dirname],\n });\n } catch {\n throw new Error(\n 'TypeScript config files require \"ts-node\" and \"typescript\" to be installed.\\n' +\n ' Install them with: npm install -D ts-node typescript\\n' +\n ' Or use a JavaScript config file (seeder.config.js).',\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const tsNode = require(tsNodePath);\n tsNode.register({\n transpileOnly: true,\n skipProject: true,\n compilerOptions: {\n module: 'commonjs',\n moduleResolution: 'node',\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n esModuleInterop: true,\n allowSyntheticDefaultImports: true,\n skipLibCheck: true,\n target: 'ES2021',\n resolveJsonModule: true,\n strict: false,\n },\n });\n\n tsNodeRegistered = true;\n}\n\n/**\n * Loads and returns the seeder configuration object from a config file.\n * Supports `.ts` (via ts-node), `.js`, `.cjs` and `.mjs` files.\n */\nexport async function loadSeederConfig(\n absolutePath: string,\n): Promise<SeederModuleOptions> {\n const ext = path.extname(absolutePath);\n\n if (ext === '.ts') {\n setupTsNode();\n }\n\n let configModule: any;\n try {\n if (ext === '.mjs') {\n configModule = await import(absolutePath);\n } else {\n delete require.cache[absolutePath];\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n configModule = require(absolutePath);\n }\n } catch (error: any) {\n // ESM-only TS project: fall back to dynamic import.\n if (\n ext === '.ts' &&\n (error?.code === 'ERR_REQUIRE_ESM' ||\n error?.code === 'ERR_UNKNOWN_FILE_EXTENSION')\n ) {\n configModule = await import(absolutePath);\n } else {\n throw error;\n }\n }\n\n const config = configModule?.default ?? configModule;\n\n if (!config || typeof config !== 'object') {\n throw new Error(\n 'The config file must export a configuration object as its default export.',\n );\n }\n\n return config as SeederModuleOptions;\n}\n","export type OrmType = 'typeorm' | 'mongoose';\n\nexport interface ScaffoldFile {\n /** Path relative to the cwd. */\n path: string;\n contents: string;\n}\n\nconst FACTORY = `import { Factory } from '@ackplus/nest-seeder';\n\nexport class UserFactory {\n @Factory((faker) => faker.person.firstName())\n firstName: string;\n\n @Factory((faker) => faker.person.lastName())\n lastName: string;\n\n @Factory((faker, ctx) => faker.internet.email({ firstName: ctx.firstName, lastName: ctx.lastName }).toLowerCase(), ['firstName', 'lastName'])\n email: string;\n\n @Factory((faker) => faker.helpers.arrayElement(['admin', 'user', 'guest']))\n role: string;\n}\n`;\n\nconst SEEDER_TYPEORM = `import { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Seeder, SeederName, DataFactory } from '@ackplus/nest-seeder';\n\nimport { User } from '../entities/user.entity';\nimport { UserFactory } from '../factories/user.factory';\n\n@Injectable()\n@SeederName('users')\nexport class UserSeeder implements Seeder {\n constructor(\n @InjectRepository(User)\n private readonly userRepository: Repository<User>,\n ) {}\n\n async seed(): Promise<void> {\n const factory = DataFactory.createForClass(UserFactory);\n const users = factory.generate(10);\n await this.userRepository.save(users);\n }\n\n async drop(): Promise<void> {\n await this.userRepository.delete({});\n }\n}\n`;\n\nconst SEEDER_MONGOOSE = `import { Injectable } from '@nestjs/common';\nimport { InjectModel } from '@nestjs/mongoose';\nimport { Model } from 'mongoose';\nimport { Seeder, SeederName, DataFactory } from '@ackplus/nest-seeder';\n\nimport { User } from '../schemas/user.schema';\nimport { UserFactory } from '../factories/user.factory';\n\n@Injectable()\n@SeederName('users')\nexport class UserSeeder implements Seeder {\n constructor(\n @InjectModel(User.name)\n private readonly userModel: Model<User>,\n ) {}\n\n async seed(): Promise<void> {\n const factory = DataFactory.createForClass(UserFactory);\n const users = factory.generate(10);\n await this.userModel.insertMany(users);\n }\n\n async drop(): Promise<void> {\n await this.userModel.deleteMany({});\n }\n}\n`;\n\nconst CONFIG_TYPEORM = `import { TypeOrmModule } from '@nestjs/typeorm';\nimport { defineSeederConfig } from '@ackplus/nest-seeder';\n\nimport { User } from './src/database/entities/user.entity';\nimport { UserSeeder } from './src/database/seeders/user.seeder';\n\nexport default defineSeederConfig({\n imports: [\n TypeOrmModule.forRoot({\n type: 'postgres',\n host: process.env.DB_HOST ?? 'localhost',\n port: Number(process.env.DB_PORT ?? 5432),\n username: process.env.DB_USERNAME ?? 'postgres',\n password: process.env.DB_PASSWORD ?? 'postgres',\n database: process.env.DB_DATABASE ?? 'app',\n entities: [User],\n synchronize: true,\n }),\n TypeOrmModule.forFeature([User]),\n ],\n seeders: [UserSeeder],\n});\n`;\n\nconst CONFIG_MONGOOSE = `import { MongooseModule } from '@nestjs/mongoose';\nimport { defineSeederConfig } from '@ackplus/nest-seeder';\n\nimport { User, UserSchema } from './src/database/schemas/user.schema';\nimport { UserSeeder } from './src/database/seeders/user.seeder';\n\nexport default defineSeederConfig({\n imports: [\n MongooseModule.forRoot(process.env.MONGO_URI ?? 'mongodb://localhost/app'),\n MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),\n ],\n seeders: [UserSeeder],\n});\n`;\n\n/** Returns the files scaffolded by `nest-seed init` for the given ORM. */\nexport function scaffoldFiles(orm: OrmType): ScaffoldFile[] {\n return [\n { path: 'seeder.config.ts', contents: orm === 'mongoose' ? CONFIG_MONGOOSE : CONFIG_TYPEORM },\n { path: 'src/database/factories/user.factory.ts', contents: FACTORY },\n {\n path: 'src/database/seeders/user.seeder.ts',\n contents: orm === 'mongoose' ? SEEDER_MONGOOSE : SEEDER_TYPEORM,\n },\n ];\n}\n","import {\n Module,\n DynamicModule,\n Provider,\n Type,\n ForwardReference,\n} from '@nestjs/common';\n\nimport { Seeder, SeederServiceOptions } from './seeder.interface';\nimport { SeederService } from './seeder.service';\nimport { SeederModuleAsyncOptions } from '../interfaces/seeder-module-async-options.interface';\nimport { SeederOptionsFactory } from '../interfaces/seeder-options-factory.interface';\n\nexport interface SeederModuleExtraOptions extends SeederServiceOptions {\n seeders?: Provider<Seeder>[];\n plugins?: any[];\n}\n\nexport interface SeederModuleOptions extends SeederModuleExtraOptions {\n imports?: Array<\n Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference\n >;\n providers?: Provider[];\n}\n\nconst SEEDER_MODULE_OPTIONS = 'SEEDER_MODULE_OPTIONS';\n\n@Module({})\nexport class SeederModule {\n\n static register(options: SeederModuleOptions): DynamicModule {\n return {\n module: SeederModule,\n imports: options.imports || [],\n providers: [\n ...(options.providers || []),\n ...options.seeders || [],\n {\n provide: SeederService,\n useFactory: (...seeders: Seeder[]): SeederService => {\n return new SeederService(seeders, options);\n },\n inject: (options.seeders || []) as Type<any>[],\n },\n ],\n };\n }\n\n static forRootAsync(options: SeederModuleAsyncOptions): DynamicModule {\n return {\n module: SeederModule,\n global: options.isGlobal,\n imports: options.imports || [],\n providers: [\n ...this.createAsyncProviders(options),\n {\n provide: SeederService,\n useFactory: (seederOptions: SeederModuleOptions, ...seeders: Seeder[]): Promise<SeederService> | SeederService => {\n return new SeederService(seeders, seederOptions);\n },\n inject: [SEEDER_MODULE_OPTIONS, ...(options.inject || []) as Type<any>[]],\n },\n ],\n };\n }\n\n private static createAsyncProviders(options: SeederModuleAsyncOptions): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass!,\n useClass: options.useClass!,\n },\n ];\n }\n\n private static createAsyncOptionsProvider(options: SeederModuleAsyncOptions): Provider {\n if (options.useFactory) {\n return {\n provide: SEEDER_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n return {\n provide: SEEDER_MODULE_OPTIONS,\n useFactory: async (optionsFactory: SeederOptionsFactory) =>\n await optionsFactory.createSeederOptions(),\n inject: [options.useExisting || options.useClass!],\n };\n }\n}\n","import { Injectable, Logger } from '@nestjs/common';\n\nimport { getSeederName } from '../decorators/seeder.decorator';\nimport type { Seeder, SeederServiceOptions } from './seeder.interface';\n\n\n@Injectable()\nexport class SeederService {\n\n private readonly logger = new Logger('Seeder');\n\n constructor(\n private readonly seeders: Seeder[] = [],\n private readonly options: SeederServiceOptions = {},\n ) {}\n\n /**\n * Runs the configured seeders. In `refresh` mode every selected seeder is\n * dropped first (in reverse order to respect foreign-key dependencies),\n * then all are seeded.\n */\n async run(): Promise<void> {\n const seeders = this.getSeedersToRun();\n\n if (seeders.length === 0) {\n this.logger.warn('No seeders to run.');\n return;\n }\n\n if (this.options.dryRun) {\n this.logger.log('Dry run — the following seeders would execute:');\n seeders.forEach((seeder, index) => {\n this.logger.log(` ${index + 1}. ${getSeederName(seeder)}`);\n });\n return;\n }\n\n if (this.options.refresh) {\n await this.drop(seeders);\n }\n\n await this.seed(seeders);\n }\n\n /** Seeds the given seeders (defaults to the configured selection). */\n async seed(seeders: Seeder[] = this.getSeedersToRun()): Promise<void> {\n for (const seeder of seeders) {\n const name = getSeederName(seeder);\n try {\n this.logger.log(`Seeding: ${name}`);\n await seeder.seed(this.options);\n this.logger.log(`Completed: ${name}`);\n } catch (error) {\n this.handleError(name, 'seed', error);\n }\n }\n }\n\n /** Drops the given seeders in reverse order (defaults to the selection). */\n async drop(seeders: Seeder[] = this.getSeedersToRun()): Promise<void> {\n for (const seeder of [...seeders].reverse()) {\n const name = getSeederName(seeder);\n if (typeof seeder.drop !== 'function') {\n this.logger.debug(`Skipping drop for ${name} (no drop() defined)`);\n continue;\n }\n try {\n this.logger.log(`Dropping: ${name}`);\n await seeder.drop(this.options);\n this.logger.log(`Dropped: ${name}`);\n } catch (error) {\n this.handleError(name, 'drop', error);\n }\n }\n }\n\n /** Resolves the seeders to run based on the `name` option. */\n getSeedersToRun(): Seeder[] {\n const names = this.normalizeNames(this.options.name);\n\n if (!names) {\n if (this.seeders.length === 0) {\n this.logger.warn(\n 'No seeders registered. Did you add them to the \"seeders\" array in your config?',\n );\n }\n return this.seeders;\n }\n\n const wanted = new Set(names.map((name) => name.toLowerCase()));\n const matched = this.seeders.filter((seeder) => {\n const name = getSeederName(seeder).toLowerCase();\n return wanted.has(name) || wanted.has(name.replace(/seeder$/, ''));\n });\n\n if (matched.length === 0) {\n const available = this.seeders.map((seeder) => getSeederName(seeder));\n this.logger.warn(\n `No seeders matched [${names.join(', ')}]. Available seeders: ${\n available.length ? available.join(', ') : '(none)'\n }`,\n );\n }\n\n return matched;\n }\n\n private handleError(name: string, phase: 'seed' | 'drop', error: any): void {\n const message = error?.message ?? error;\n if (this.options.continueOnError) {\n this.logger.error(`Seeder \"${name}\" failed during ${phase}: ${message}`);\n return;\n }\n throw error;\n }\n\n private normalizeNames(\n name?: string | string[],\n ): string[] | undefined {\n if (!name) {\n return undefined;\n }\n const list = (Array.isArray(name) ? name : [name]).filter(Boolean);\n return list.length ? list : undefined;\n }\n\n}\n"],"mappings":"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","names":["fs","path","import_common","yargs"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/lib/decorators/seeder.decorator.ts","../src/lib/cli/load-config.ts","../src/lib/cli/templates.ts","../src/lib/seeder/seeder.module.ts","../src/lib/seeder/seeder.service.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { NestFactory } from '@nestjs/core';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { getSeederName } from './lib/decorators/seeder.decorator';\nimport { loadSeederConfig, resolveConfigPath } from './lib/cli/load-config';\nimport { OrmType, scaffoldFiles } from './lib/cli/templates';\nimport { SeederModule } from './lib/seeder/seeder.module';\nimport { SeederService } from './lib/seeder/seeder.service';\nimport type { SeederServiceOptions } from './lib/seeder/seeder.interface';\n\nconst log = {\n info: (msg: string) => console.log(msg),\n error: (msg: string) => console.error(`\\x1b[31m${msg}\\x1b[0m`),\n success: (msg: string) => console.log(`\\x1b[32m${msg}\\x1b[0m`),\n dim: (msg: string) => console.log(`\\x1b[2m${msg}\\x1b[0m`),\n};\n\nfunction parseContext(raw?: string): Record<string, any> | undefined {\n if (!raw) {\n return undefined;\n }\n try {\n return JSON.parse(raw);\n } catch {\n throw new Error(`--context must be valid JSON. Received: ${raw}`);\n }\n}\n\n/** Loads the config and builds the Nest application context. */\nasync function createContext(configOption?: string, projectOption?: string) {\n const configPath = resolveConfigPath(configOption);\n\n if (!configPath) {\n throw new Error(\n configOption\n ? `Config file not found: ${configOption}`\n : 'No seeder config found. Create a seeder.config.ts (try \"nest-seed init\") ' +\n 'or pass one with --config.',\n );\n }\n\n log.dim(`Using config: ${path.relative(process.cwd(), configPath)}`);\n const config = await loadSeederConfig(configPath, { project: projectOption });\n return { config, configPath };\n}\n\nasync function runCommand(argv: any): Promise<void> {\n const { config } = await createContext(argv.config, argv.project);\n\n const options: SeederServiceOptions = {\n refresh: argv.refresh,\n name: argv.name,\n dryRun: argv['dry-run'],\n continueOnError: argv['continue-on-error'],\n dummyData: argv['dummy-data'],\n context: parseContext(argv.context),\n };\n\n if (options.refresh) log.info('🔄 Refresh mode: dropping data before seeding');\n if (options.dryRun) log.info('🔎 Dry run: no data will be written');\n if (options.name) {\n const names = Array.isArray(options.name) ? options.name : [options.name];\n log.info(`🎯 Seeders: ${names.join(', ')}`);\n }\n\n const app = await NestFactory.createApplicationContext(\n SeederModule.register({ ...config, ...options }),\n { logger: ['error', 'warn', 'log'] },\n );\n\n try {\n await app.get(SeederService).run();\n } finally {\n await app.close();\n }\n\n log.success('✅ Seeding completed successfully!');\n}\n\nasync function listCommand(argv: any): Promise<void> {\n const { config } = await createContext(argv.config, argv.project);\n const seeders = config.seeders ?? [];\n\n if (seeders.length === 0) {\n log.info('No seeders registered in the config.');\n return;\n }\n\n log.info(`Registered seeders (${seeders.length}):`);\n seeders.forEach((seeder: any, index: number) => {\n const className = seeder?.name ?? 'Unknown';\n const stableName = getSeederName(seeder);\n const alias = stableName !== className ? ` (--name ${stableName})` : '';\n log.info(` ${index + 1}. ${className}${alias}`);\n });\n}\n\nfunction initCommand(argv: any): void {\n const orm = argv.orm as OrmType;\n const force = Boolean(argv.force);\n const files = scaffoldFiles(orm);\n\n let created = 0;\n let skipped = 0;\n\n for (const file of files) {\n const absolute = path.resolve(process.cwd(), file.path);\n if (fs.existsSync(absolute) && !force) {\n log.dim(`• skipped (exists): ${file.path}`);\n skipped++;\n continue;\n }\n fs.mkdirSync(path.dirname(absolute), { recursive: true });\n fs.writeFileSync(absolute, file.contents);\n log.success(`• created: ${file.path}`);\n created++;\n }\n\n log.info(`\\nScaffolded ${created} file(s)${skipped ? `, skipped ${skipped}` : ''}.`);\n log.info('\\nNext steps:');\n log.info(' 1. Adjust seeder.config.ts for your database and entities.');\n log.info(' 2. Add a script to package.json:');\n log.dim(' \"seed\": \"nest-seed\"');\n log.info(' 3. Run it:');\n log.dim(' npm run seed');\n if (skipped && !force) {\n log.dim('\\nUse --force to overwrite existing files.');\n }\n}\n\nasync function main(): Promise<void> {\n await yargs(hideBin(process.argv))\n .scriptName('nest-seed')\n .usage('$0 [command] [options]')\n .command(\n ['$0', 'run'],\n 'Run seeders (default command)',\n (y) =>\n y\n .option('config', {\n alias: 'c',\n type: 'string',\n describe: 'Path to the seeder config file (auto-detected if omitted)',\n })\n .option('project', {\n alias: 'p',\n type: 'string',\n describe: 'Path to a tsconfig.json for ts-node (defaults to strict mode)',\n })\n .option('refresh', {\n alias: 'r',\n type: 'boolean',\n default: false,\n describe: 'Drop data before seeding',\n })\n .option('name', {\n alias: 'n',\n type: 'array',\n string: true,\n describe: 'Run only the named seeder(s)',\n })\n .option('dry-run', {\n type: 'boolean',\n default: false,\n describe: 'Show which seeders would run without executing them',\n })\n .option('continue-on-error', {\n type: 'boolean',\n default: false,\n describe: 'Keep going when a seeder fails',\n })\n .option('context', {\n type: 'string',\n describe: 'JSON forwarded to every seeder via options.context',\n })\n .option('dummy-data', {\n alias: 'd',\n type: 'boolean',\n default: false,\n describe: '[deprecated] forwarded as options.dummyData',\n }),\n runCommand,\n )\n .command(\n 'init',\n 'Scaffold a seeder config, factory and seeder',\n (y) =>\n y\n .option('orm', {\n type: 'string',\n choices: ['typeorm', 'mongoose'] as const,\n default: 'typeorm',\n describe: 'Which ORM template to scaffold',\n })\n .option('force', {\n type: 'boolean',\n default: false,\n describe: 'Overwrite existing files',\n }),\n (argv) => initCommand(argv),\n )\n .command(\n 'list',\n 'List the seeders registered in the config',\n (y) =>\n y\n .option('config', {\n alias: 'c',\n type: 'string',\n describe: 'Path to the seeder config file (auto-detected if omitted)',\n })\n .option('project', {\n alias: 'p',\n type: 'string',\n describe: 'Path to a tsconfig.json for ts-node',\n }),\n listCommand,\n )\n .example('$0', 'Run all seeders using the auto-detected config')\n .example('$0 --refresh', 'Drop and reseed all data')\n .example('$0 --name users posts', 'Run only the \"users\" and \"posts\" seeders')\n .example('$0 init', 'Scaffold starter files')\n .example('$0 list', 'List available seeders')\n .strict()\n .alias('h', 'help')\n .alias('v', 'version')\n .fail((msg, err) => {\n // Re-throw real errors so the catch in `bootstrap` handles them.\n if (err) throw err;\n log.error(`\\n${msg}`);\n console.error('\\nRun \"nest-seed --help\" for usage.');\n process.exit(1);\n })\n .parseAsync();\n}\n\nasync function bootstrap(): Promise<void> {\n log.info('🌱 nest-seeder');\n try {\n await main();\n process.exit(0);\n } catch (error: any) {\n log.error(`\\n❌ ${error?.message ?? error}`);\n if (error?.stack && process.env.NEST_SEEDER_DEBUG) {\n console.error(error.stack);\n } else {\n log.dim('Set NEST_SEEDER_DEBUG=1 for a full stack trace.');\n }\n process.exit(1);\n }\n}\n\n// Only run when invoked directly (not when imported).\nif (require.main === module) {\n bootstrap();\n}\n","/**\n * Stable, minification-safe identifier for a seeder.\n *\n * By default the CLI selects seeders by their class name (`--name UserSeeder`).\n * That breaks when your build minifies class names. Decorate the seeder with\n * `@SeederName('users')` to give it a stable name that survives minification\n * and is nicer to type.\n *\n * @example\n * @Injectable()\n * @SeederName('users')\n * export class UserSeeder implements Seeder { ... }\n *\n * // then: nest-seed --name users\n */\nconst SEEDER_NAME = Symbol.for('nest-seeder:name');\n\nexport function SeederName(name: string): ClassDecorator {\n return (target: any): void => {\n Object.defineProperty(target, SEEDER_NAME, {\n value: name,\n enumerable: false,\n configurable: true,\n writable: false,\n });\n };\n}\n\n/**\n * Resolves the stable name of a seeder class or instance.\n *\n * Resolution order:\n * 1. `@SeederName('...')` decorator value\n * 2. a static `seederName` property\n * 3. the constructor name (default, not minification-safe)\n */\nexport function getSeederName(seeder: any): string {\n const ctor =\n typeof seeder === 'function' ? seeder : seeder?.constructor;\n\n return (\n ctor?.[SEEDER_NAME] ||\n ctor?.seederName ||\n ctor?.name ||\n 'UnknownSeeder'\n );\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { SeederModuleOptions } from '../seeder/seeder.module';\n\n/** Config file names tried, in order, when `--config` is not provided. */\nexport const DEFAULT_CONFIG_NAMES = [\n 'seeder.config.ts',\n 'seeder.config.js',\n 'seeder.config.cjs',\n 'seeder.config.mjs',\n];\n\n/**\n * Finds a seeder config file. When `configPath` is given it is resolved\n * relative to the cwd; otherwise the well-known file names are tried.\n *\n * @returns the absolute path, or `null` when nothing is found\n */\nexport function resolveConfigPath(configPath?: string): string | null {\n if (configPath) {\n const resolved = path.resolve(process.cwd(), configPath);\n return fs.existsSync(resolved) ? resolved : null;\n }\n\n for (const name of DEFAULT_CONFIG_NAMES) {\n const candidate = path.resolve(process.cwd(), name);\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nlet tsNodeRegistered = false;\n\nexport interface LoadConfigOptions {\n /**\n * Path to a tsconfig.json to register ts-node with. Takes precedence over\n * the `TS_NODE_PROJECT` environment variable. When set, the project's\n * compiler options are honored (the decorator/interop essentials are still\n * forced on).\n */\n project?: string;\n}\n\n/**\n * Registers ts-node so `.ts` config files can be required. Throws a friendly\n * error when ts-node is not installed.\n *\n * The defaults use `strict: true` on purpose: with `strictNullChecks` disabled\n * TypeScript emits `design:type = Object` for string-literal-union columns\n * (e.g. `'a' | 'b'`), which makes TypeORM throw `DataTypeNotSupportedError`.\n * `strict: true` matches how application code is normally compiled, so\n * reflect-metadata produces the same types the app sees. Point `--project`\n * (or `TS_NODE_PROJECT`) at your own tsconfig to fully control the settings.\n */\nfunction setupTsNode(project?: string): void {\n if (tsNodeRegistered || require.extensions['.ts']) {\n tsNodeRegistered = true;\n return;\n }\n\n let tsNodePath: string;\n try {\n tsNodePath = require.resolve('ts-node', {\n paths: [process.cwd(), __dirname],\n });\n } catch {\n throw new Error(\n 'TypeScript config files require \"ts-node\" and \"typescript\" to be installed.\\n' +\n ' Install them with: npm install -D ts-node typescript\\n' +\n ' Or use a JavaScript config file (seeder.config.js).',\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const tsNode = require(tsNodePath);\n\n const tsProject = project || process.env.TS_NODE_PROJECT;\n\n if (tsProject) {\n // Honor the user's tsconfig, but force the essentials so decorators and\n // default imports always work regardless of the project's settings.\n tsNode.register({\n transpileOnly: true,\n project: path.resolve(process.cwd(), tsProject),\n compilerOptions: {\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n esModuleInterop: true,\n allowSyntheticDefaultImports: true,\n },\n });\n } else {\n tsNode.register({\n transpileOnly: true,\n skipProject: true,\n compilerOptions: {\n module: 'commonjs',\n moduleResolution: 'node',\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n esModuleInterop: true,\n allowSyntheticDefaultImports: true,\n skipLibCheck: true,\n target: 'ES2021',\n resolveJsonModule: true,\n strict: true,\n },\n });\n }\n\n tsNodeRegistered = true;\n}\n\n/**\n * Loads and returns the seeder configuration object from a config file.\n * Supports `.ts` (via ts-node), `.js`, `.cjs` and `.mjs` files.\n */\nexport async function loadSeederConfig(\n absolutePath: string,\n options: LoadConfigOptions = {},\n): Promise<SeederModuleOptions> {\n const ext = path.extname(absolutePath);\n\n if (ext === '.ts') {\n setupTsNode(options.project);\n }\n\n let configModule: any;\n try {\n if (ext === '.mjs') {\n configModule = await import(absolutePath);\n } else {\n delete require.cache[absolutePath];\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n configModule = require(absolutePath);\n }\n } catch (error: any) {\n // ESM-only TS project: fall back to dynamic import.\n if (\n ext === '.ts' &&\n (error?.code === 'ERR_REQUIRE_ESM' ||\n error?.code === 'ERR_UNKNOWN_FILE_EXTENSION')\n ) {\n configModule = await import(absolutePath);\n } else {\n throw error;\n }\n }\n\n const config = configModule?.default ?? configModule;\n\n if (!config || typeof config !== 'object') {\n throw new Error(\n 'The config file must export a configuration object as its default export.',\n );\n }\n\n return config as SeederModuleOptions;\n}\n","export type OrmType = 'typeorm' | 'mongoose';\n\nexport interface ScaffoldFile {\n /** Path relative to the cwd. */\n path: string;\n contents: string;\n}\n\nconst FACTORY = `import { Factory } from '@ackplus/nest-seeder';\n\nexport class UserFactory {\n @Factory((faker) => faker.person.firstName())\n firstName: string;\n\n @Factory((faker) => faker.person.lastName())\n lastName: string;\n\n @Factory((faker, ctx) => faker.internet.email({ firstName: ctx.firstName, lastName: ctx.lastName }).toLowerCase(), ['firstName', 'lastName'])\n email: string;\n\n @Factory((faker) => faker.helpers.arrayElement(['admin', 'user', 'guest']))\n role: string;\n}\n`;\n\nconst SEEDER_TYPEORM = `import { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Seeder, SeederName, DataFactory } from '@ackplus/nest-seeder';\n\nimport { User } from '../entities/user.entity';\nimport { UserFactory } from '../factories/user.factory';\n\n@Injectable()\n@SeederName('users')\nexport class UserSeeder implements Seeder {\n constructor(\n @InjectRepository(User)\n private readonly userRepository: Repository<User>,\n ) {}\n\n async seed(): Promise<void> {\n const factory = DataFactory.createForClass(UserFactory);\n const users = factory.generate(10);\n await this.userRepository.save(users);\n }\n\n async drop(): Promise<void> {\n await this.userRepository.delete({});\n }\n}\n`;\n\nconst SEEDER_MONGOOSE = `import { Injectable } from '@nestjs/common';\nimport { InjectModel } from '@nestjs/mongoose';\nimport { Model } from 'mongoose';\nimport { Seeder, SeederName, DataFactory } from '@ackplus/nest-seeder';\n\nimport { User } from '../schemas/user.schema';\nimport { UserFactory } from '../factories/user.factory';\n\n@Injectable()\n@SeederName('users')\nexport class UserSeeder implements Seeder {\n constructor(\n @InjectModel(User.name)\n private readonly userModel: Model<User>,\n ) {}\n\n async seed(): Promise<void> {\n const factory = DataFactory.createForClass(UserFactory);\n const users = factory.generate(10);\n await this.userModel.insertMany(users);\n }\n\n async drop(): Promise<void> {\n await this.userModel.deleteMany({});\n }\n}\n`;\n\nconst CONFIG_TYPEORM = `import { TypeOrmModule } from '@nestjs/typeorm';\nimport { defineSeederConfig } from '@ackplus/nest-seeder';\n\nimport { User } from './src/database/entities/user.entity';\nimport { UserSeeder } from './src/database/seeders/user.seeder';\n\nexport default defineSeederConfig({\n imports: [\n TypeOrmModule.forRoot({\n type: 'postgres',\n host: process.env.DB_HOST ?? 'localhost',\n port: Number(process.env.DB_PORT ?? 5432),\n username: process.env.DB_USERNAME ?? 'postgres',\n password: process.env.DB_PASSWORD ?? 'postgres',\n database: process.env.DB_DATABASE ?? 'app',\n entities: [User],\n synchronize: true,\n }),\n TypeOrmModule.forFeature([User]),\n ],\n seeders: [UserSeeder],\n});\n`;\n\nconst CONFIG_MONGOOSE = `import { MongooseModule } from '@nestjs/mongoose';\nimport { defineSeederConfig } from '@ackplus/nest-seeder';\n\nimport { User, UserSchema } from './src/database/schemas/user.schema';\nimport { UserSeeder } from './src/database/seeders/user.seeder';\n\nexport default defineSeederConfig({\n imports: [\n MongooseModule.forRoot(process.env.MONGO_URI ?? 'mongodb://localhost/app'),\n MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),\n ],\n seeders: [UserSeeder],\n});\n`;\n\n/** Returns the files scaffolded by `nest-seed init` for the given ORM. */\nexport function scaffoldFiles(orm: OrmType): ScaffoldFile[] {\n return [\n { path: 'seeder.config.ts', contents: orm === 'mongoose' ? CONFIG_MONGOOSE : CONFIG_TYPEORM },\n { path: 'src/database/factories/user.factory.ts', contents: FACTORY },\n {\n path: 'src/database/seeders/user.seeder.ts',\n contents: orm === 'mongoose' ? SEEDER_MONGOOSE : SEEDER_TYPEORM,\n },\n ];\n}\n","import {\n Module,\n DynamicModule,\n Provider,\n Type,\n ForwardReference,\n} from '@nestjs/common';\n\nimport { Seeder, SeederServiceOptions } from './seeder.interface';\nimport { SeederService } from './seeder.service';\nimport { SeederModuleAsyncOptions } from '../interfaces/seeder-module-async-options.interface';\nimport { SeederOptionsFactory } from '../interfaces/seeder-options-factory.interface';\n\nexport interface SeederModuleExtraOptions extends SeederServiceOptions {\n seeders?: Provider<Seeder>[];\n plugins?: any[];\n}\n\nexport interface SeederModuleOptions extends SeederModuleExtraOptions {\n imports?: Array<\n Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference\n >;\n providers?: Provider[];\n}\n\nconst SEEDER_MODULE_OPTIONS = 'SEEDER_MODULE_OPTIONS';\n\n@Module({})\nexport class SeederModule {\n\n static register(options: SeederModuleOptions): DynamicModule {\n return {\n module: SeederModule,\n imports: options.imports || [],\n providers: [\n ...(options.providers || []),\n ...options.seeders || [],\n {\n provide: SeederService,\n useFactory: (...seeders: Seeder[]): SeederService => {\n return new SeederService(seeders, options);\n },\n inject: (options.seeders || []) as Type<any>[],\n },\n ],\n };\n }\n\n static forRootAsync(options: SeederModuleAsyncOptions): DynamicModule {\n return {\n module: SeederModule,\n global: options.isGlobal,\n imports: options.imports || [],\n providers: [\n ...this.createAsyncProviders(options),\n {\n provide: SeederService,\n useFactory: (seederOptions: SeederModuleOptions, ...seeders: Seeder[]): Promise<SeederService> | SeederService => {\n return new SeederService(seeders, seederOptions);\n },\n inject: [SEEDER_MODULE_OPTIONS, ...(options.inject || []) as Type<any>[]],\n },\n ],\n };\n }\n\n private static createAsyncProviders(options: SeederModuleAsyncOptions): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass!,\n useClass: options.useClass!,\n },\n ];\n }\n\n private static createAsyncOptionsProvider(options: SeederModuleAsyncOptions): Provider {\n if (options.useFactory) {\n return {\n provide: SEEDER_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n return {\n provide: SEEDER_MODULE_OPTIONS,\n useFactory: async (optionsFactory: SeederOptionsFactory) =>\n await optionsFactory.createSeederOptions(),\n inject: [options.useExisting || options.useClass!],\n };\n }\n}\n","import { Injectable, Logger } from '@nestjs/common';\n\nimport { getSeederName } from '../decorators/seeder.decorator';\nimport type { Seeder, SeederServiceOptions } from './seeder.interface';\n\n\n@Injectable()\nexport class SeederService {\n\n private readonly logger = new Logger('Seeder');\n\n constructor(\n private readonly seeders: Seeder[] = [],\n private readonly options: SeederServiceOptions = {},\n ) {}\n\n /**\n * Runs the configured seeders. In `refresh` mode every selected seeder is\n * dropped first (in reverse order to respect foreign-key dependencies),\n * then all are seeded.\n */\n async run(): Promise<void> {\n const seeders = this.getSeedersToRun();\n\n if (seeders.length === 0) {\n this.logger.warn('No seeders to run.');\n return;\n }\n\n if (this.options.dryRun) {\n this.logger.log('Dry run — the following seeders would execute:');\n seeders.forEach((seeder, index) => {\n this.logger.log(` ${index + 1}. ${getSeederName(seeder)}`);\n });\n return;\n }\n\n if (this.options.refresh) {\n await this.drop(seeders);\n }\n\n await this.seed(seeders);\n }\n\n /** Seeds the given seeders (defaults to the configured selection). */\n async seed(seeders: Seeder[] = this.getSeedersToRun()): Promise<void> {\n for (const seeder of seeders) {\n const name = getSeederName(seeder);\n try {\n this.logger.log(`Seeding: ${name}`);\n await seeder.seed(this.options);\n this.logger.log(`Completed: ${name}`);\n } catch (error) {\n this.handleError(name, 'seed', error);\n }\n }\n }\n\n /** Drops the given seeders in reverse order (defaults to the selection). */\n async drop(seeders: Seeder[] = this.getSeedersToRun()): Promise<void> {\n for (const seeder of [...seeders].reverse()) {\n const name = getSeederName(seeder);\n if (typeof seeder.drop !== 'function') {\n this.logger.debug(`Skipping drop for ${name} (no drop() defined)`);\n continue;\n }\n try {\n this.logger.log(`Dropping: ${name}`);\n await seeder.drop(this.options);\n this.logger.log(`Dropped: ${name}`);\n } catch (error) {\n this.handleError(name, 'drop', error);\n }\n }\n }\n\n /** Resolves the seeders to run based on the `name` option. */\n getSeedersToRun(): Seeder[] {\n const names = this.normalizeNames(this.options.name);\n\n if (!names) {\n if (this.seeders.length === 0) {\n this.logger.warn(\n 'No seeders registered. Did you add them to the \"seeders\" array in your config?',\n );\n }\n return this.seeders;\n }\n\n const wanted = new Set(names.map((name) => name.toLowerCase()));\n const matched = this.seeders.filter((seeder) => {\n const name = getSeederName(seeder).toLowerCase();\n return wanted.has(name) || wanted.has(name.replace(/seeder$/, ''));\n });\n\n if (matched.length === 0) {\n const available = this.seeders.map((seeder) => getSeederName(seeder));\n this.logger.warn(\n `No seeders matched [${names.join(', ')}]. Available seeders: ${\n available.length ? available.join(', ') : '(none)'\n }`,\n );\n }\n\n return matched;\n }\n\n private handleError(name: string, phase: 'seed' | 'drop', error: any): void {\n const message = error?.message ?? error;\n if (this.options.continueOnError) {\n this.logger.error(`Seeder \"${name}\" failed during ${phase}: ${message}`);\n return;\n }\n throw error;\n }\n\n private normalizeNames(\n name?: string | string[],\n ): string[] | undefined {\n if (!name) {\n return undefined;\n }\n const list = (Array.isArray(name) ? name : [name]).filter(Boolean);\n return list.length ? list : undefined;\n }\n\n}\n"],"mappings":"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","names":["fs","path","import_common","yargs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ackplus/nest-seeder",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "A powerful and flexible database seeding library for NestJS applications with support for factories, data generation using Faker.js, and CLI commands",
5
5
  "author": "AckPlus",
6
6
  "license": "MIT",