@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 +26 -0
- package/dist/cli.js +45 -23
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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.
|
|
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",
|