@veloxts/cli 0.4.2 → 0.4.3

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.
Files changed (67) hide show
  1. package/dist/cli.js +4 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/db.d.ts +12 -0
  4. package/dist/commands/db.d.ts.map +1 -0
  5. package/dist/commands/db.js +18 -0
  6. package/dist/commands/db.js.map +1 -0
  7. package/dist/commands/procedures.d.ts +12 -0
  8. package/dist/commands/procedures.d.ts.map +1 -0
  9. package/dist/commands/procedures.js +153 -0
  10. package/dist/commands/procedures.js.map +1 -0
  11. package/dist/generators/generators/factory.d.ts +36 -0
  12. package/dist/generators/generators/factory.d.ts.map +1 -0
  13. package/dist/generators/generators/factory.js +85 -0
  14. package/dist/generators/generators/factory.js.map +1 -0
  15. package/dist/generators/generators/index.d.ts +2 -0
  16. package/dist/generators/generators/index.d.ts.map +1 -1
  17. package/dist/generators/generators/index.js +8 -0
  18. package/dist/generators/generators/index.js.map +1 -1
  19. package/dist/generators/generators/seeder.d.ts +36 -0
  20. package/dist/generators/generators/seeder.d.ts.map +1 -0
  21. package/dist/generators/generators/seeder.js +99 -0
  22. package/dist/generators/generators/seeder.js.map +1 -0
  23. package/dist/generators/templates/factory.d.ts +26 -0
  24. package/dist/generators/templates/factory.d.ts.map +1 -0
  25. package/dist/generators/templates/factory.js +125 -0
  26. package/dist/generators/templates/factory.js.map +1 -0
  27. package/dist/generators/templates/seeder.d.ts +34 -0
  28. package/dist/generators/templates/seeder.d.ts.map +1 -0
  29. package/dist/generators/templates/seeder.js +129 -0
  30. package/dist/generators/templates/seeder.js.map +1 -0
  31. package/dist/index.d.ts +5 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +5 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/seeding/commands/seed.d.ts +11 -0
  36. package/dist/seeding/commands/seed.d.ts.map +1 -0
  37. package/dist/seeding/commands/seed.js +268 -0
  38. package/dist/seeding/commands/seed.js.map +1 -0
  39. package/dist/seeding/errors.d.ts +119 -0
  40. package/dist/seeding/errors.d.ts.map +1 -0
  41. package/dist/seeding/errors.js +191 -0
  42. package/dist/seeding/errors.js.map +1 -0
  43. package/dist/seeding/factory.d.ts +162 -0
  44. package/dist/seeding/factory.d.ts.map +1 -0
  45. package/dist/seeding/factory.js +250 -0
  46. package/dist/seeding/factory.js.map +1 -0
  47. package/dist/seeding/index.d.ts +31 -0
  48. package/dist/seeding/index.d.ts.map +1 -0
  49. package/dist/seeding/index.js +41 -0
  50. package/dist/seeding/index.js.map +1 -0
  51. package/dist/seeding/loader.d.ts +41 -0
  52. package/dist/seeding/loader.d.ts.map +1 -0
  53. package/dist/seeding/loader.js +210 -0
  54. package/dist/seeding/loader.js.map +1 -0
  55. package/dist/seeding/registry.d.ts +116 -0
  56. package/dist/seeding/registry.d.ts.map +1 -0
  57. package/dist/seeding/registry.js +298 -0
  58. package/dist/seeding/registry.js.map +1 -0
  59. package/dist/seeding/runner.d.ts +88 -0
  60. package/dist/seeding/runner.d.ts.map +1 -0
  61. package/dist/seeding/runner.js +254 -0
  62. package/dist/seeding/runner.js.map +1 -0
  63. package/dist/seeding/types.d.ts +247 -0
  64. package/dist/seeding/types.d.ts.map +1 -0
  65. package/dist/seeding/types.js +7 -0
  66. package/dist/seeding/types.js.map +1 -0
  67. package/package.json +6 -6
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Factory Templates
3
+ *
4
+ * Template functions for generating factory files.
5
+ */
6
+ // ============================================================================
7
+ // Path Helpers
8
+ // ============================================================================
9
+ /**
10
+ * Get the path for a factory file
11
+ */
12
+ export function getFactoryPath(pascalName) {
13
+ return `src/database/factories/${pascalName}Factory.ts`;
14
+ }
15
+ // ============================================================================
16
+ // Templates
17
+ // ============================================================================
18
+ /**
19
+ * Generate factory file content
20
+ */
21
+ export function factoryTemplate(context) {
22
+ const { entity } = context;
23
+ return `/**
24
+ * ${entity.pascal}Factory
25
+ *
26
+ * Factory for generating ${entity.pascal} model instances with fake data.
27
+ *
28
+ * Usage:
29
+ * const user = await factory.get(${entity.pascal}Factory).create();
30
+ * const users = await factory.get(${entity.pascal}Factory).createMany(10);
31
+ * const admin = await factory.get(${entity.pascal}Factory).state('admin').create();
32
+ */
33
+
34
+ import { BaseFactory, type PrismaClientLike } from '@veloxts/cli';
35
+ import { faker } from '@faker-js/faker';
36
+
37
+ // ============================================================================
38
+ // Types
39
+ // ============================================================================
40
+
41
+ /**
42
+ * Input type for creating a ${entity.pascal}.
43
+ * Adjust these fields to match your Prisma model.
44
+ */
45
+ export interface ${entity.pascal}Input {
46
+ // TODO: Add fields that match your Prisma ${entity.pascal} model
47
+ // Example fields:
48
+ // id?: string;
49
+ // name: string;
50
+ // email: string;
51
+ // createdAt?: Date;
52
+ }
53
+
54
+ // ============================================================================
55
+ // Factory
56
+ // ============================================================================
57
+
58
+ export class ${entity.pascal}Factory extends BaseFactory<${entity.pascal}Input> {
59
+ readonly modelName = '${entity.camel}';
60
+
61
+ constructor(prisma: PrismaClientLike) {
62
+ super(prisma);
63
+
64
+ // Register named states for variations
65
+ // Example: admin state
66
+ // this.registerState('admin', (attrs) => ({
67
+ // ...attrs,
68
+ // role: 'admin',
69
+ // }));
70
+ }
71
+
72
+ /**
73
+ * Define default attributes for a ${entity.pascal}.
74
+ * Uses faker to generate realistic fake data.
75
+ */
76
+ definition(): ${entity.pascal}Input {
77
+ return {
78
+ // TODO: Generate fake data for your model
79
+ // Example:
80
+ // name: faker.person.fullName(),
81
+ // email: faker.internet.email(),
82
+ };
83
+ }
84
+
85
+ // ============================================================================
86
+ // Named States (Convenience Methods)
87
+ // ============================================================================
88
+
89
+ // Example: Create an admin ${entity.camel}
90
+ // admin(): this {
91
+ // return this.state('admin') as this;
92
+ // }
93
+
94
+ // Example: Create a verified ${entity.camel}
95
+ // verified(): this {
96
+ // return this.state('verified') as this;
97
+ // }
98
+ }
99
+ `;
100
+ }
101
+ // ============================================================================
102
+ // Instructions
103
+ // ============================================================================
104
+ /**
105
+ * Get post-generation instructions
106
+ */
107
+ export function getFactoryInstructions(pascalName) {
108
+ return `
109
+ ${pascalName}Factory created successfully!
110
+
111
+ Next steps:
112
+ 1. Update ${pascalName}Input interface to match your Prisma model
113
+ 2. Fill in the definition() method with faker data
114
+ 3. Add named states for common variations (admin, verified, etc.)
115
+
116
+ Usage in seeders:
117
+ await ctx.factory.get(${pascalName}Factory).create();
118
+ await ctx.factory.get(${pascalName}Factory).createMany(10);
119
+ await ctx.factory.get(${pascalName}Factory).state('admin').create();
120
+
121
+ Note: Make sure @faker-js/faker is installed:
122
+ npm install @faker-js/faker
123
+ `;
124
+ }
125
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/generators/templates/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,OAAO,0BAA0B,UAAU,YAAY,CAAC;AAC1D,CAAC;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAwC;IACtE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;KACJ,MAAM,CAAC,MAAM;;4BAEU,MAAM,CAAC,MAAM;;;sCAGH,MAAM,CAAC,MAAM;uCACZ,MAAM,CAAC,MAAM;uCACb,MAAM,CAAC,MAAM;;;;;;;;;;;+BAWrB,MAAM,CAAC,MAAM;;;mBAGzB,MAAM,CAAC,MAAM;+CACe,MAAM,CAAC,MAAM;;;;;;;;;;;;eAY7C,MAAM,CAAC,MAAM,+BAA+B,MAAM,CAAC,MAAM;0BAC9C,MAAM,CAAC,KAAK;;;;;;;;;;;;;;uCAcC,MAAM,CAAC,MAAM;;;kBAGlC,MAAM,CAAC,MAAM;;;;;;;;;;;;;gCAaC,MAAM,CAAC,KAAK;;;;;kCAKV,MAAM,CAAC,KAAK;;;;;CAK7C,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO;EACP,UAAU;;;cAGE,UAAU;;;;;0BAKE,UAAU;0BACV,UAAU;0BACV,UAAU;;;;CAInC,CAAC;AACF,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Seeder Templates
3
+ *
4
+ * Template functions for generating seeder files.
5
+ */
6
+ import type { TemplateContext } from '../types.js';
7
+ /**
8
+ * Options for seeder generation
9
+ */
10
+ export interface SeederOptions {
11
+ /** Also generate a factory for this model */
12
+ factory?: boolean;
13
+ }
14
+ /**
15
+ * Get the path for a seeder file
16
+ */
17
+ export declare function getSeederPath(pascalName: string): string;
18
+ /**
19
+ * Get the path for the DatabaseSeeder entry point
20
+ */
21
+ export declare function getDatabaseSeederPath(): string;
22
+ /**
23
+ * Generate seeder file content
24
+ */
25
+ export declare function seederTemplate(context: TemplateContext<SeederOptions>): string;
26
+ /**
27
+ * Generate DatabaseSeeder entry point
28
+ */
29
+ export declare function databaseSeederTemplate(seederNames: string[]): string;
30
+ /**
31
+ * Get post-generation instructions
32
+ */
33
+ export declare function getSeederInstructions(pascalName: string, hasFactory: boolean): string;
34
+ //# sourceMappingURL=seeder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeder.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/seeder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,MAAM,CAmD9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BpE;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAoBrF"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Seeder Templates
3
+ *
4
+ * Template functions for generating seeder files.
5
+ */
6
+ // ============================================================================
7
+ // Path Helpers
8
+ // ============================================================================
9
+ /**
10
+ * Get the path for a seeder file
11
+ */
12
+ export function getSeederPath(pascalName) {
13
+ return `src/database/seeders/${pascalName}Seeder.ts`;
14
+ }
15
+ /**
16
+ * Get the path for the DatabaseSeeder entry point
17
+ */
18
+ export function getDatabaseSeederPath() {
19
+ return 'src/database/seeders/DatabaseSeeder.ts';
20
+ }
21
+ // ============================================================================
22
+ // Templates
23
+ // ============================================================================
24
+ /**
25
+ * Generate seeder file content
26
+ */
27
+ export function seederTemplate(context) {
28
+ const { entity, options } = context;
29
+ const factoryImport = options.factory
30
+ ? `import { ${entity.pascal}Factory } from '../factories/${entity.pascal}Factory.js';\n`
31
+ : '';
32
+ const factoryUsage = options.factory
33
+ ? ` // Create records using factory
34
+ await ctx.factory.get(${entity.pascal}Factory).createMany(10);
35
+ ctx.log.success('Created 10 ${entity.plural}');`
36
+ : ` // Create records directly via Prisma
37
+ await ctx.db.${entity.camel}.createMany({
38
+ data: [
39
+ // Add your seed data here
40
+ // { name: 'Example', ... },
41
+ ],
42
+ });
43
+ ctx.log.success('Created ${entity.plural}');`;
44
+ const truncateMethod = `
45
+
46
+ async truncate(ctx: SeederContext): Promise<void> {
47
+ ctx.log.info('Truncating ${entity.plural} table...');
48
+ await ctx.db.${entity.camel}.deleteMany();
49
+ },`;
50
+ return `/**
51
+ * ${entity.pascal}Seeder
52
+ *
53
+ * Seeds the ${entity.plural} table with initial/test data.
54
+ */
55
+
56
+ import type { Seeder, SeederContext } from '@veloxts/cli';
57
+ ${factoryImport}
58
+ export const ${entity.pascal}Seeder: Seeder = {
59
+ name: '${entity.pascal}Seeder',
60
+
61
+ // Seeders that must run before this one
62
+ dependencies: [],
63
+
64
+ // Only run in these environments (empty = all)
65
+ // environments: ['development', 'test'],
66
+
67
+ async run(ctx: SeederContext): Promise<void> {
68
+ ctx.log.info('Seeding ${entity.plural}...');
69
+
70
+ ${factoryUsage}
71
+ },${truncateMethod}
72
+ };
73
+ `;
74
+ }
75
+ /**
76
+ * Generate DatabaseSeeder entry point
77
+ */
78
+ export function databaseSeederTemplate(seederNames) {
79
+ const imports = seederNames
80
+ .map((name) => `import { ${name}Seeder } from './${name}Seeder.js';`)
81
+ .join('\n');
82
+ const runs = seederNames.map((name) => ` await ctx.runSeeder(${name}Seeder);`).join('\n');
83
+ return `/**
84
+ * DatabaseSeeder
85
+ *
86
+ * Main entry point for database seeding.
87
+ * Orchestrates the execution of all seeders.
88
+ */
89
+
90
+ import type { Seeder, SeederContext } from '@veloxts/cli';
91
+ ${imports}
92
+
93
+ export const DatabaseSeeder: Seeder = {
94
+ name: 'DatabaseSeeder',
95
+
96
+ async run(ctx: SeederContext): Promise<void> {
97
+ // Run seeders in order (dependencies handled automatically)
98
+ ${runs}
99
+ },
100
+ };
101
+ `;
102
+ }
103
+ // ============================================================================
104
+ // Instructions
105
+ // ============================================================================
106
+ /**
107
+ * Get post-generation instructions
108
+ */
109
+ export function getSeederInstructions(pascalName, hasFactory) {
110
+ const factoryNote = hasFactory
111
+ ? `
112
+ Your factory has also been created. You can customize the fake data
113
+ generation in src/database/factories/${pascalName}Factory.ts`
114
+ : '';
115
+ return `
116
+ ${pascalName}Seeder created successfully!
117
+
118
+ Next steps:
119
+ 1. Add your seed data to src/database/seeders/${pascalName}Seeder.ts
120
+ 2. Run seeders with: velox db:seed
121
+
122
+ To run only this seeder:
123
+ velox db:seed ${pascalName}Seeder
124
+
125
+ To truncate and re-seed:
126
+ velox db:seed --fresh${factoryNote}
127
+ `;
128
+ }
129
+ //# sourceMappingURL=seeder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeder.js","sourceRoot":"","sources":["../../../src/generators/templates/seeder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,wBAAwB,UAAU,WAAW,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,wCAAwC,CAAC;AAClD,CAAC;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuC;IACpE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEpC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO;QACnC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,gCAAgC,MAAM,CAAC,MAAM,gBAAgB;QACxF,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;QAClC,CAAC,CAAC;4BACsB,MAAM,CAAC,MAAM;kCACP,MAAM,CAAC,MAAM,KAAK;QAChD,CAAC,CAAC;mBACa,MAAM,CAAC,KAAK;;;;;;+BAMA,MAAM,CAAC,MAAM,KAAK,CAAC;IAEhD,MAAM,cAAc,GAAG;;;+BAGM,MAAM,CAAC,MAAM;mBACzB,MAAM,CAAC,KAAK;KAC1B,CAAC;IAEJ,OAAO;KACJ,MAAM,CAAC,MAAM;;eAEH,MAAM,CAAC,MAAM;;;;EAI1B,aAAa;eACA,MAAM,CAAC,MAAM;WACjB,MAAM,CAAC,MAAM;;;;;;;;;4BASI,MAAM,CAAC,MAAM;;EAEvC,YAAY;MACR,cAAc;;CAEnB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAqB;IAC1D,MAAM,OAAO,GAAG,WAAW;SACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,oBAAoB,IAAI,aAAa,CAAC;SACpE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,2BAA2B,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7F,OAAO;;;;;;;;EAQP,OAAO;;;;;;;EAOP,IAAI;;;CAGL,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,UAAmB;IAC3E,MAAM,WAAW,GAAG,UAAU;QAC5B,CAAC,CAAC;;uCAEiC,UAAU,YAAY;QACzD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;EACP,UAAU;;;kDAGsC,UAAU;;;;kBAI1C,UAAU;;;yBAGH,WAAW;CACnC,CAAC;AACF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -21,12 +21,17 @@ export declare const CLI_VERSION: string;
21
21
  /**
22
22
  * Export command functions for programmatic usage
23
23
  */
24
+ export { createDbCommand } from './commands/db.js';
24
25
  export { createDevCommand } from './commands/dev.js';
25
26
  export { createMigrateCommand } from './commands/migrate.js';
26
27
  /**
27
28
  * Export migration runner
28
29
  */
29
30
  export * from './migrations/index.js';
31
+ /**
32
+ * Export seeding system
33
+ */
34
+ export * from './seeding/index.js';
30
35
  /**
31
36
  * Export utilities for reuse in other packages
32
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,MAA+C,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,MAA+C,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,oBAAoB,CAAC;AACnC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -25,12 +25,17 @@ export const CLI_VERSION = packageJson.version ?? '0.0.0-unknown';
25
25
  /**
26
26
  * Export command functions for programmatic usage
27
27
  */
28
+ export { createDbCommand } from './commands/db.js';
28
29
  export { createDevCommand } from './commands/dev.js';
29
30
  export { createMigrateCommand } from './commands/migrate.js';
30
31
  /**
31
32
  * Export migration runner
32
33
  */
33
34
  export * from './migrations/index.js';
35
+ /**
36
+ * Export seeding system
37
+ */
38
+ export * from './seeding/index.js';
34
39
  /**
35
40
  * Export utilities for reuse in other packages
36
41
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,WAAW,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,WAAW,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,oBAAoB,CAAC;AACnC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * db:seed Command
3
+ *
4
+ * Run database seeders.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Create the db:seed command
9
+ */
10
+ export declare function createSeedCommand(): Command;
11
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/seeding/commands/seed.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * db:seed Command
3
+ *
4
+ * Run database seeders.
5
+ */
6
+ import path from 'node:path';
7
+ import * as p from '@clack/prompts';
8
+ import { Command } from 'commander';
9
+ import pc from 'picocolors';
10
+ import { createPrismaClient } from '../../migrations/types.js';
11
+ import { error, info, success, warning } from '../../utils/output.js';
12
+ import { fileExists } from '../../utils/paths.js';
13
+ import { SeederError } from '../errors.js';
14
+ import { loadSeeders, seedersDirectoryExists } from '../loader.js';
15
+ import { SeederRegistry } from '../registry.js';
16
+ import { SeederRunner } from '../runner.js';
17
+ // ============================================================================
18
+ // Command Factory
19
+ // ============================================================================
20
+ /**
21
+ * Create the db:seed command
22
+ */
23
+ export function createSeedCommand() {
24
+ return new Command('seed')
25
+ .description('Run database seeders')
26
+ .argument('[seeder]', 'Specific seeder to run (e.g., UserSeeder)')
27
+ .option('--fresh', 'Truncate tables before seeding')
28
+ .option('--class <name>', 'Run specific seeder class')
29
+ .option('--force', 'Run in production without confirmation')
30
+ .option('--dry-run', 'Show what would run without executing')
31
+ .option('--verbose', 'Show detailed output')
32
+ .option('--json', 'Output as JSON')
33
+ .action(async (seederArg, options) => {
34
+ await runSeedCommand(seederArg, options);
35
+ });
36
+ }
37
+ // ============================================================================
38
+ // Command Implementation
39
+ // ============================================================================
40
+ /**
41
+ * Run the db:seed command
42
+ */
43
+ async function runSeedCommand(seederArg, options) {
44
+ const cwd = process.cwd();
45
+ const s = p.spinner();
46
+ try {
47
+ // Check if Prisma schema exists
48
+ const schemaPath = path.join(cwd, 'prisma', 'schema.prisma');
49
+ if (!fileExists(schemaPath)) {
50
+ if (options.json) {
51
+ console.log(JSON.stringify({ error: 'Prisma schema not found' }));
52
+ }
53
+ else {
54
+ error('Prisma schema not found.');
55
+ console.log(` ${pc.dim('Expected: prisma/schema.prisma')}`);
56
+ }
57
+ process.exit(1);
58
+ }
59
+ // Check if seeders directory exists
60
+ if (!(await seedersDirectoryExists(cwd))) {
61
+ if (options.json) {
62
+ console.log(JSON.stringify({ error: 'No seeders found' }));
63
+ }
64
+ else {
65
+ info('No seeders found.');
66
+ console.log(` ${pc.dim('Create one with: velox generate seeder <name>')}`);
67
+ }
68
+ return;
69
+ }
70
+ // Production safety check
71
+ if (process.env.NODE_ENV === 'production' && !options.force) {
72
+ if (options.json) {
73
+ console.log(JSON.stringify({ error: 'Cannot seed in production without --force' }));
74
+ process.exit(1);
75
+ }
76
+ const confirmed = await p.confirm({
77
+ message: pc.yellow('Running seeders in production. Are you sure?'),
78
+ });
79
+ if (p.isCancel(confirmed) || !confirmed) {
80
+ info('Seeding cancelled.');
81
+ return;
82
+ }
83
+ }
84
+ // Load seeders
85
+ if (!options.json) {
86
+ s.start('Loading seeders...');
87
+ }
88
+ const loadResult = await loadSeeders(cwd);
89
+ if (loadResult.errors.length > 0 && !options.json) {
90
+ s.stop('Seeders loaded with errors');
91
+ for (const err of loadResult.errors) {
92
+ warning(`Failed to load ${path.basename(err.filePath)}: ${err.error}`);
93
+ }
94
+ }
95
+ if (loadResult.seeders.length === 0) {
96
+ if (!options.json) {
97
+ s.stop('No seeders found');
98
+ info('No seeders found.');
99
+ console.log(` ${pc.dim('Create one with: velox generate seeder <name>')}`);
100
+ }
101
+ else {
102
+ console.log(JSON.stringify({ error: 'No seeders found' }));
103
+ }
104
+ return;
105
+ }
106
+ if (!options.json) {
107
+ s.stop(`Loaded ${loadResult.seeders.length} seeder${loadResult.seeders.length > 1 ? 's' : ''}`);
108
+ }
109
+ // Build registry
110
+ const registry = new SeederRegistry();
111
+ for (const loaded of loadResult.seeders) {
112
+ registry.register(loaded.seeder);
113
+ }
114
+ // Determine which seeders to run
115
+ const seederName = seederArg ?? options.class;
116
+ let seedersToRun;
117
+ if (seederName) {
118
+ if (!registry.has(seederName)) {
119
+ if (options.json) {
120
+ console.log(JSON.stringify({ error: `Seeder '${seederName}' not found` }));
121
+ }
122
+ else {
123
+ error(`Seeder '${seederName}' not found.`);
124
+ console.log(` ${pc.dim('Available seeders:')}`);
125
+ for (const name of registry.getNames()) {
126
+ console.log(` ${pc.dim('•')} ${name}`);
127
+ }
128
+ }
129
+ process.exit(1);
130
+ }
131
+ seedersToRun = [seederName];
132
+ }
133
+ // Show what will run
134
+ if (!options.json && !options.dryRun) {
135
+ console.log('');
136
+ const ordered = seedersToRun ? registry.getByNames(seedersToRun) : registry.getInOrder();
137
+ if (options.fresh) {
138
+ info(`Will ${pc.bold('truncate')} and seed ${ordered.length} seeder${ordered.length > 1 ? 's' : ''}:`);
139
+ }
140
+ else {
141
+ info(`Running ${ordered.length} seeder${ordered.length > 1 ? 's' : ''}:`);
142
+ }
143
+ console.log('');
144
+ for (const seeder of ordered) {
145
+ const deps = seeder.dependencies?.length
146
+ ? pc.dim(` (depends on: ${seeder.dependencies.join(', ')})`)
147
+ : '';
148
+ console.log(` ${pc.dim('→')} ${seeder.name}${deps}`);
149
+ }
150
+ console.log('');
151
+ }
152
+ // Dry run
153
+ if (options.dryRun) {
154
+ const ordered = seedersToRun ? registry.getByNames(seedersToRun) : registry.getInOrder();
155
+ if (options.json) {
156
+ console.log(JSON.stringify({
157
+ dryRun: true,
158
+ fresh: options.fresh ?? false,
159
+ seeders: ordered.map((s) => ({
160
+ name: s.name,
161
+ dependencies: s.dependencies ?? [],
162
+ })),
163
+ count: ordered.length,
164
+ }, null, 2));
165
+ }
166
+ else {
167
+ warning('Dry run mode - no changes made.');
168
+ console.log(` ${pc.dim('Remove --dry-run to execute seeders.')}`);
169
+ }
170
+ return;
171
+ }
172
+ // Create Prisma client
173
+ if (!options.json) {
174
+ s.start('Connecting to database...');
175
+ }
176
+ const prisma = await createPrismaClient();
177
+ if (!options.json) {
178
+ s.stop('Connected to database');
179
+ }
180
+ // Create runner
181
+ const runner = new SeederRunner(prisma, registry);
182
+ // Execute seeders
183
+ if (!options.json) {
184
+ console.log('');
185
+ s.start(options.fresh ? 'Truncating and seeding...' : 'Seeding...');
186
+ }
187
+ let result;
188
+ if (options.fresh) {
189
+ result = await runner.fresh({
190
+ only: seedersToRun,
191
+ verbose: options.verbose,
192
+ dryRun: false,
193
+ });
194
+ }
195
+ else if (seedersToRun) {
196
+ result = await runner.run(seedersToRun, {
197
+ verbose: options.verbose,
198
+ dryRun: false,
199
+ });
200
+ }
201
+ else {
202
+ result = await runner.runAll({
203
+ verbose: options.verbose,
204
+ dryRun: false,
205
+ });
206
+ }
207
+ // Disconnect
208
+ await prisma.$disconnect();
209
+ // Output results
210
+ if (options.json) {
211
+ console.log(JSON.stringify({
212
+ success: result.failed === 0,
213
+ total: result.total,
214
+ successful: result.successful,
215
+ failed: result.failed,
216
+ skipped: result.skipped,
217
+ duration: result.duration,
218
+ results: result.results,
219
+ }, null, 2));
220
+ }
221
+ else {
222
+ s.stop(result.failed === 0 ? 'Seeding complete' : 'Seeding finished with errors');
223
+ console.log('');
224
+ if (result.failed === 0) {
225
+ success(`Ran ${result.successful} seeder${result.successful !== 1 ? 's' : ''} successfully!`);
226
+ }
227
+ else {
228
+ error(`${result.failed} seeder${result.failed !== 1 ? 's' : ''} failed.`);
229
+ for (const r of result.results) {
230
+ if (!r.success) {
231
+ console.log(` ${pc.red('✗')} ${r.name}: ${pc.dim(r.error ?? 'Unknown error')}`);
232
+ }
233
+ }
234
+ }
235
+ console.log(` ${pc.dim(`Duration: ${result.duration}ms`)}`);
236
+ console.log('');
237
+ }
238
+ if (result.failed > 0) {
239
+ process.exit(1);
240
+ }
241
+ }
242
+ catch (err) {
243
+ s.stop('Seeding failed');
244
+ if (options.json) {
245
+ if (err instanceof SeederError) {
246
+ console.log(JSON.stringify({ error: err.toJSON() }));
247
+ }
248
+ else {
249
+ console.log(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));
250
+ }
251
+ }
252
+ else {
253
+ console.log('');
254
+ if (err instanceof SeederError) {
255
+ error(err.message);
256
+ if (err.fix) {
257
+ console.log(` ${pc.dim('Fix:')} ${err.fix}`);
258
+ }
259
+ }
260
+ else {
261
+ error(err instanceof Error ? err.message : String(err));
262
+ }
263
+ console.log('');
264
+ }
265
+ process.exit(1);
266
+ }
267
+ }
268
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/seeding/commands/seed.ts"],"names":[],"mappings":"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"}