@veloxts/cli 0.4.2 → 0.4.4
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/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/db.d.ts +12 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +18 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +29 -3
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/procedures.d.ts +12 -0
- package/dist/commands/procedures.d.ts.map +1 -0
- package/dist/commands/procedures.js +153 -0
- package/dist/commands/procedures.js.map +1 -0
- package/dist/dev/hmr-runner.d.ts +52 -0
- package/dist/dev/hmr-runner.d.ts.map +1 -0
- package/dist/dev/hmr-runner.js +153 -0
- package/dist/dev/hmr-runner.js.map +1 -0
- package/dist/dev/index.d.ts +6 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +6 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/watch-config.d.ts +32 -0
- package/dist/dev/watch-config.d.ts.map +1 -0
- package/dist/dev/watch-config.js +74 -0
- package/dist/dev/watch-config.js.map +1 -0
- package/dist/generators/generators/factory.d.ts +36 -0
- package/dist/generators/generators/factory.d.ts.map +1 -0
- package/dist/generators/generators/factory.js +85 -0
- package/dist/generators/generators/factory.js.map +1 -0
- package/dist/generators/generators/index.d.ts +2 -0
- package/dist/generators/generators/index.d.ts.map +1 -1
- package/dist/generators/generators/index.js +8 -0
- package/dist/generators/generators/index.js.map +1 -1
- package/dist/generators/generators/seeder.d.ts +36 -0
- package/dist/generators/generators/seeder.d.ts.map +1 -0
- package/dist/generators/generators/seeder.js +99 -0
- package/dist/generators/generators/seeder.js.map +1 -0
- package/dist/generators/templates/factory.d.ts +26 -0
- package/dist/generators/templates/factory.d.ts.map +1 -0
- package/dist/generators/templates/factory.js +125 -0
- package/dist/generators/templates/factory.js.map +1 -0
- package/dist/generators/templates/seeder.d.ts +34 -0
- package/dist/generators/templates/seeder.d.ts.map +1 -0
- package/dist/generators/templates/seeder.js +129 -0
- package/dist/generators/templates/seeder.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/seeding/commands/seed.d.ts +11 -0
- package/dist/seeding/commands/seed.d.ts.map +1 -0
- package/dist/seeding/commands/seed.js +268 -0
- package/dist/seeding/commands/seed.js.map +1 -0
- package/dist/seeding/errors.d.ts +119 -0
- package/dist/seeding/errors.d.ts.map +1 -0
- package/dist/seeding/errors.js +191 -0
- package/dist/seeding/errors.js.map +1 -0
- package/dist/seeding/factory.d.ts +162 -0
- package/dist/seeding/factory.d.ts.map +1 -0
- package/dist/seeding/factory.js +250 -0
- package/dist/seeding/factory.js.map +1 -0
- package/dist/seeding/index.d.ts +31 -0
- package/dist/seeding/index.d.ts.map +1 -0
- package/dist/seeding/index.js +41 -0
- package/dist/seeding/index.js.map +1 -0
- package/dist/seeding/loader.d.ts +41 -0
- package/dist/seeding/loader.d.ts.map +1 -0
- package/dist/seeding/loader.js +210 -0
- package/dist/seeding/loader.js.map +1 -0
- package/dist/seeding/registry.d.ts +116 -0
- package/dist/seeding/registry.d.ts.map +1 -0
- package/dist/seeding/registry.js +298 -0
- package/dist/seeding/registry.js.map +1 -0
- package/dist/seeding/runner.d.ts +88 -0
- package/dist/seeding/runner.d.ts.map +1 -0
- package/dist/seeding/runner.js +254 -0
- package/dist/seeding/runner.js.map +1 -0
- package/dist/seeding/types.d.ts +247 -0
- package/dist/seeding/types.d.ts.map +1 -0
- package/dist/seeding/types.js +7 -0
- package/dist/seeding/types.js.map +1 -0
- package/dist/utils/output.d.ts +12 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +21 -0
- package/dist/utils/output.js.map +1 -1
- package/package.json +18 -17
- package/LICENSE +0 -21
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeding Errors
|
|
3
|
+
*
|
|
4
|
+
* Structured error classes for the VeloxTS database seeding system.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Error Codes
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Error codes for seeding errors (for AI/tooling integration)
|
|
11
|
+
*/
|
|
12
|
+
export var SeederErrorCode;
|
|
13
|
+
(function (SeederErrorCode) {
|
|
14
|
+
/** Seeder not found in registry */
|
|
15
|
+
SeederErrorCode["SEEDER_NOT_FOUND"] = "E3001";
|
|
16
|
+
/** Circular dependency detected between seeders */
|
|
17
|
+
SeederErrorCode["CIRCULAR_DEPENDENCY"] = "E3002";
|
|
18
|
+
/** Seeder execution failed */
|
|
19
|
+
SeederErrorCode["EXECUTION_FAILED"] = "E3003";
|
|
20
|
+
/** Truncation failed */
|
|
21
|
+
SeederErrorCode["TRUNCATION_FAILED"] = "E3004";
|
|
22
|
+
/** Invalid seeder configuration */
|
|
23
|
+
SeederErrorCode["INVALID_CONFIG"] = "E3005";
|
|
24
|
+
/** Seeder dependency not found */
|
|
25
|
+
SeederErrorCode["DEPENDENCY_NOT_FOUND"] = "E3006";
|
|
26
|
+
/** No seeders found in project */
|
|
27
|
+
SeederErrorCode["NO_SEEDERS_FOUND"] = "E3007";
|
|
28
|
+
/** Database connection failed */
|
|
29
|
+
SeederErrorCode["DATABASE_ERROR"] = "E3008";
|
|
30
|
+
/** Factory not found in registry */
|
|
31
|
+
SeederErrorCode["FACTORY_NOT_FOUND"] = "E3010";
|
|
32
|
+
/** Factory state not found */
|
|
33
|
+
SeederErrorCode["STATE_NOT_FOUND"] = "E3011";
|
|
34
|
+
/** Factory creation failed */
|
|
35
|
+
SeederErrorCode["FACTORY_CREATE_FAILED"] = "E3012";
|
|
36
|
+
/** Invalid factory configuration */
|
|
37
|
+
SeederErrorCode["INVALID_FACTORY"] = "E3013";
|
|
38
|
+
/** File system error during seeder loading */
|
|
39
|
+
SeederErrorCode["FILESYSTEM_ERROR"] = "E3020";
|
|
40
|
+
/** Invalid seeder export */
|
|
41
|
+
SeederErrorCode["INVALID_EXPORT"] = "E3021";
|
|
42
|
+
})(SeederErrorCode || (SeederErrorCode = {}));
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Seeder Error
|
|
45
|
+
// ============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Structured error for seeding operations
|
|
48
|
+
*/
|
|
49
|
+
export class SeederError extends Error {
|
|
50
|
+
code;
|
|
51
|
+
fix;
|
|
52
|
+
constructor(code, message, fix) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.code = code;
|
|
55
|
+
this.fix = fix;
|
|
56
|
+
this.name = 'SeederError';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format error for display
|
|
60
|
+
*/
|
|
61
|
+
format() {
|
|
62
|
+
let output = `SeederError[${this.code}]: ${this.message}`;
|
|
63
|
+
if (this.fix) {
|
|
64
|
+
output += `\n\n Fix: ${this.fix}`;
|
|
65
|
+
}
|
|
66
|
+
return output;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Convert to JSON for --json output
|
|
70
|
+
*/
|
|
71
|
+
toJSON() {
|
|
72
|
+
return {
|
|
73
|
+
code: this.code,
|
|
74
|
+
message: this.message,
|
|
75
|
+
fix: this.fix,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Factory Error
|
|
81
|
+
// ============================================================================
|
|
82
|
+
/**
|
|
83
|
+
* Structured error for factory operations
|
|
84
|
+
*/
|
|
85
|
+
export class FactoryError extends Error {
|
|
86
|
+
code;
|
|
87
|
+
fix;
|
|
88
|
+
constructor(code, message, fix) {
|
|
89
|
+
super(message);
|
|
90
|
+
this.code = code;
|
|
91
|
+
this.fix = fix;
|
|
92
|
+
this.name = 'FactoryError';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format error for display
|
|
96
|
+
*/
|
|
97
|
+
format() {
|
|
98
|
+
let output = `FactoryError[${this.code}]: ${this.message}`;
|
|
99
|
+
if (this.fix) {
|
|
100
|
+
output += `\n\n Fix: ${this.fix}`;
|
|
101
|
+
}
|
|
102
|
+
return output;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Convert to JSON for --json output
|
|
106
|
+
*/
|
|
107
|
+
toJSON() {
|
|
108
|
+
return {
|
|
109
|
+
code: this.code,
|
|
110
|
+
message: this.message,
|
|
111
|
+
fix: this.fix,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ============================================================================
|
|
116
|
+
// Error Factory Functions
|
|
117
|
+
// ============================================================================
|
|
118
|
+
/**
|
|
119
|
+
* Create error for seeder not found
|
|
120
|
+
*/
|
|
121
|
+
export function seederNotFound(name) {
|
|
122
|
+
return new SeederError(SeederErrorCode.SEEDER_NOT_FOUND, `Seeder '${name}' not found.`, `Check that the seeder exists in src/database/seeders/ and is properly exported.`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create error for circular dependency
|
|
126
|
+
*/
|
|
127
|
+
export function circularDependency(cycle) {
|
|
128
|
+
return new SeederError(SeederErrorCode.CIRCULAR_DEPENDENCY, `Circular dependency detected: ${cycle.join(' -> ')}`, `Review seeder dependencies and remove the circular reference.`);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create error for seeder execution failure
|
|
132
|
+
*/
|
|
133
|
+
export function executionFailed(name, cause) {
|
|
134
|
+
return new SeederError(SeederErrorCode.EXECUTION_FAILED, `Seeder '${name}' failed: ${cause.message}`, `Check the seeder implementation and database state.`);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create error for truncation failure
|
|
138
|
+
*/
|
|
139
|
+
export function truncationFailed(name, cause) {
|
|
140
|
+
return new SeederError(SeederErrorCode.TRUNCATION_FAILED, `Truncation failed for seeder '${name}': ${cause.message}`, `Check for foreign key constraints that may prevent truncation.`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create error for dependency not found
|
|
144
|
+
*/
|
|
145
|
+
export function dependencyNotFound(seederName, dependencyName) {
|
|
146
|
+
return new SeederError(SeederErrorCode.DEPENDENCY_NOT_FOUND, `Seeder '${seederName}' depends on '${dependencyName}' which was not found.`, `Ensure '${dependencyName}' exists in src/database/seeders/ and is registered.`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create error for no seeders found
|
|
150
|
+
*/
|
|
151
|
+
export function noSeedersFound(path) {
|
|
152
|
+
return new SeederError(SeederErrorCode.NO_SEEDERS_FOUND, `No seeders found in ${path}`, `Create a seeder with: velox generate seeder <name>`);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create error for database connection issue
|
|
156
|
+
*/
|
|
157
|
+
export function seederDatabaseError(operation, cause) {
|
|
158
|
+
return new SeederError(SeederErrorCode.DATABASE_ERROR, `Database error during ${operation}: ${cause.message}`, `Check your database connection and ensure it's running.`);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create error for factory not found
|
|
162
|
+
*/
|
|
163
|
+
export function factoryNotFound(name) {
|
|
164
|
+
return new FactoryError(SeederErrorCode.FACTORY_NOT_FOUND, `Factory '${name}' not found in registry.`, `Ensure the factory is properly instantiated before use.`);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create error for state not found
|
|
168
|
+
*/
|
|
169
|
+
export function stateNotFound(factoryName, stateName, available) {
|
|
170
|
+
const availableStr = available.length > 0 ? available.join(', ') : 'none';
|
|
171
|
+
return new FactoryError(SeederErrorCode.STATE_NOT_FOUND, `State '${stateName}' not found on factory '${factoryName}'.`, `Available states: ${availableStr}. Register states using registerState().`);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create error for factory creation failure
|
|
175
|
+
*/
|
|
176
|
+
export function factoryCreateFailed(modelName, cause) {
|
|
177
|
+
return new FactoryError(SeederErrorCode.FACTORY_CREATE_FAILED, `Failed to create '${modelName}': ${cause.message}`, `Check the factory definition and ensure all required fields are provided.`);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create error for invalid seeder export
|
|
181
|
+
*/
|
|
182
|
+
export function invalidExport(filePath, reason) {
|
|
183
|
+
return new SeederError(SeederErrorCode.INVALID_EXPORT, `Invalid seeder export in '${filePath}': ${reason}`, `Ensure the file exports a valid Seeder object with 'name' and 'run' properties.`);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Create error for filesystem issue
|
|
187
|
+
*/
|
|
188
|
+
export function filesystemError(operation, path, cause) {
|
|
189
|
+
return new SeederError(SeederErrorCode.FILESYSTEM_ERROR, `Filesystem error during ${operation} at '${path}': ${cause.message}`, `Check file permissions and path validity.`);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/seeding/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory System
|
|
3
|
+
*
|
|
4
|
+
* Base factory class and registry for generating fake data.
|
|
5
|
+
*/
|
|
6
|
+
import type { Factory, FactoryRegistry, PrismaClientLike, StateModifier } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Abstract base class for model factories.
|
|
9
|
+
*
|
|
10
|
+
* Provides a fluent API for creating model instances with fake data
|
|
11
|
+
* and named state variations.
|
|
12
|
+
*
|
|
13
|
+
* @template TInput - The input type for creating records
|
|
14
|
+
* @template TOutput - The output type returned from database (defaults to TInput)
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { BaseFactory } from '@veloxts/cli';
|
|
19
|
+
* import { faker } from '@faker-js/faker';
|
|
20
|
+
*
|
|
21
|
+
* interface UserInput {
|
|
22
|
+
* email: string;
|
|
23
|
+
* name: string;
|
|
24
|
+
* role: 'admin' | 'user';
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* export class UserFactory extends BaseFactory<UserInput> {
|
|
28
|
+
* modelName = 'user';
|
|
29
|
+
*
|
|
30
|
+
* definition(): UserInput {
|
|
31
|
+
* return {
|
|
32
|
+
* email: faker.internet.email(),
|
|
33
|
+
* name: faker.person.fullName(),
|
|
34
|
+
* role: 'user',
|
|
35
|
+
* };
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* admin(): this {
|
|
39
|
+
* return this.state('admin');
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* constructor(prisma: PrismaClientLike) {
|
|
43
|
+
* super(prisma);
|
|
44
|
+
* this.registerState('admin', (attrs) => ({ ...attrs, role: 'admin' }));
|
|
45
|
+
* }
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare abstract class BaseFactory<TInput extends Record<string, unknown>, TOutput = TInput> implements Factory<TInput, TOutput> {
|
|
50
|
+
/** Map of registered state modifiers */
|
|
51
|
+
protected states: Map<string, StateModifier<TInput>>;
|
|
52
|
+
/** Currently active state names */
|
|
53
|
+
protected activeStates: string[];
|
|
54
|
+
/** Prisma client for database operations */
|
|
55
|
+
protected readonly prisma: PrismaClientLike;
|
|
56
|
+
/**
|
|
57
|
+
* Model name for Prisma operations (e.g., 'user', 'post').
|
|
58
|
+
* Must match the lowercase model name in your Prisma schema.
|
|
59
|
+
*/
|
|
60
|
+
abstract readonly modelName: string;
|
|
61
|
+
/**
|
|
62
|
+
* Define default attributes for new instances.
|
|
63
|
+
* Override this method to provide fake data generation.
|
|
64
|
+
*/
|
|
65
|
+
abstract definition(): TInput;
|
|
66
|
+
constructor(prisma: PrismaClientLike);
|
|
67
|
+
/**
|
|
68
|
+
* Register a named state modifier.
|
|
69
|
+
*
|
|
70
|
+
* @param name - State name (e.g., 'admin', 'verified')
|
|
71
|
+
* @param modifier - Function that modifies attributes
|
|
72
|
+
* @returns this for chaining during construction
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* constructor(prisma: PrismaClientLike) {
|
|
77
|
+
* super(prisma);
|
|
78
|
+
* this.registerState('admin', (attrs) => ({ ...attrs, role: 'admin' }));
|
|
79
|
+
* this.registerState('unverified', (attrs) => ({ ...attrs, emailVerified: null }));
|
|
80
|
+
* }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
protected registerState(name: string, modifier: StateModifier<TInput>): this;
|
|
84
|
+
/**
|
|
85
|
+
* Apply a named state modifier.
|
|
86
|
+
* Returns a new factory instance with the state applied.
|
|
87
|
+
*
|
|
88
|
+
* @param name - State name to apply
|
|
89
|
+
* @returns New factory instance with state active (preserves subclass type)
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* // Create an admin user
|
|
94
|
+
* await factory.get(UserFactory).state('admin').create();
|
|
95
|
+
*
|
|
96
|
+
* // Chain multiple states
|
|
97
|
+
* await factory.get(UserFactory).state('admin').state('verified').create();
|
|
98
|
+
*
|
|
99
|
+
* // Subclass methods preserved after state()
|
|
100
|
+
* const factory = new UserFactory(prisma);
|
|
101
|
+
* await factory.state('verified').admin().create(); // admin() still accessible
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
state(name: string): this;
|
|
105
|
+
/**
|
|
106
|
+
* Get list of available state names.
|
|
107
|
+
*/
|
|
108
|
+
getAvailableStates(): ReadonlyArray<string>;
|
|
109
|
+
/**
|
|
110
|
+
* Make a single instance without persisting to database.
|
|
111
|
+
*
|
|
112
|
+
* @param overrides - Attributes to override defaults
|
|
113
|
+
* @returns Generated attributes
|
|
114
|
+
*/
|
|
115
|
+
make(overrides?: Partial<TInput>): TInput;
|
|
116
|
+
/**
|
|
117
|
+
* Make multiple instances without persisting to database.
|
|
118
|
+
*
|
|
119
|
+
* @param count - Number of instances to make
|
|
120
|
+
* @param overrides - Attributes to override defaults for all instances
|
|
121
|
+
* @returns Array of generated attributes
|
|
122
|
+
*/
|
|
123
|
+
makeMany(count: number, overrides?: Partial<TInput>): TInput[];
|
|
124
|
+
/**
|
|
125
|
+
* Create a single instance in the database.
|
|
126
|
+
*
|
|
127
|
+
* @param overrides - Attributes to override defaults
|
|
128
|
+
* @returns Created database record
|
|
129
|
+
*/
|
|
130
|
+
create(overrides?: Partial<TInput>): Promise<TOutput>;
|
|
131
|
+
/**
|
|
132
|
+
* Create multiple instances in the database.
|
|
133
|
+
*
|
|
134
|
+
* @param count - Number of instances to create
|
|
135
|
+
* @param overrides - Attributes to override defaults for all instances
|
|
136
|
+
* @returns Array of created database records
|
|
137
|
+
*/
|
|
138
|
+
createMany(count: number, overrides?: Partial<TInput>): Promise<TOutput[]>;
|
|
139
|
+
/**
|
|
140
|
+
* Build attributes by applying definition, states, and overrides.
|
|
141
|
+
*/
|
|
142
|
+
private buildAttributes;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create a factory registry for managing factory instances.
|
|
146
|
+
*
|
|
147
|
+
* The registry caches factory instances and provides type-safe access.
|
|
148
|
+
*
|
|
149
|
+
* @param prisma - Prisma client to inject into factories
|
|
150
|
+
* @returns Factory registry instance
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* const registry = createFactoryRegistry(prisma);
|
|
155
|
+
*
|
|
156
|
+
* // Get or create factory instance
|
|
157
|
+
* const userFactory = registry.get(UserFactory);
|
|
158
|
+
* await userFactory.create();
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export declare function createFactoryRegistry(prisma: PrismaClientLike): FactoryRegistry;
|
|
162
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/seeding/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,OAAO,EAEP,eAAe,EACf,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAC;AA2BpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,8BAAsB,WAAW,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CACxF,YAAW,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,wCAAwC;IACxC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAa;IAEjE,mCAAmC;IACnC,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,CAAM;IAEtC,4CAA4C;IAC5C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAE5C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,UAAU,IAAI,MAAM;gBAEjB,MAAM,EAAE,gBAAgB;IAQpC;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAK5E;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAazB;;OAEG;IACH,kBAAkB,IAAI,aAAa,CAAC,MAAM,CAAC;IAQ3C;;;;;OAKG;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAIzC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAQ9D;;;;;OAKG;IACG,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB3D;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAiBhF;;OAEG;IACH,OAAO,CAAC,eAAe;CAmBxB;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAyB/E"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory System
|
|
3
|
+
*
|
|
4
|
+
* Base factory class and registry for generating fake data.
|
|
5
|
+
*/
|
|
6
|
+
import { factoryCreateFailed, stateNotFound } from './errors.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Base Factory
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Abstract base class for model factories.
|
|
12
|
+
*
|
|
13
|
+
* Provides a fluent API for creating model instances with fake data
|
|
14
|
+
* and named state variations.
|
|
15
|
+
*
|
|
16
|
+
* @template TInput - The input type for creating records
|
|
17
|
+
* @template TOutput - The output type returned from database (defaults to TInput)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { BaseFactory } from '@veloxts/cli';
|
|
22
|
+
* import { faker } from '@faker-js/faker';
|
|
23
|
+
*
|
|
24
|
+
* interface UserInput {
|
|
25
|
+
* email: string;
|
|
26
|
+
* name: string;
|
|
27
|
+
* role: 'admin' | 'user';
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* export class UserFactory extends BaseFactory<UserInput> {
|
|
31
|
+
* modelName = 'user';
|
|
32
|
+
*
|
|
33
|
+
* definition(): UserInput {
|
|
34
|
+
* return {
|
|
35
|
+
* email: faker.internet.email(),
|
|
36
|
+
* name: faker.person.fullName(),
|
|
37
|
+
* role: 'user',
|
|
38
|
+
* };
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* admin(): this {
|
|
42
|
+
* return this.state('admin');
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* constructor(prisma: PrismaClientLike) {
|
|
46
|
+
* super(prisma);
|
|
47
|
+
* this.registerState('admin', (attrs) => ({ ...attrs, role: 'admin' }));
|
|
48
|
+
* }
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export class BaseFactory {
|
|
53
|
+
/** Map of registered state modifiers */
|
|
54
|
+
states = new Map();
|
|
55
|
+
/** Currently active state names */
|
|
56
|
+
activeStates = [];
|
|
57
|
+
/** Prisma client for database operations */
|
|
58
|
+
prisma;
|
|
59
|
+
constructor(prisma) {
|
|
60
|
+
this.prisma = prisma;
|
|
61
|
+
}
|
|
62
|
+
// ==========================================================================
|
|
63
|
+
// State Management
|
|
64
|
+
// ==========================================================================
|
|
65
|
+
/**
|
|
66
|
+
* Register a named state modifier.
|
|
67
|
+
*
|
|
68
|
+
* @param name - State name (e.g., 'admin', 'verified')
|
|
69
|
+
* @param modifier - Function that modifies attributes
|
|
70
|
+
* @returns this for chaining during construction
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* constructor(prisma: PrismaClientLike) {
|
|
75
|
+
* super(prisma);
|
|
76
|
+
* this.registerState('admin', (attrs) => ({ ...attrs, role: 'admin' }));
|
|
77
|
+
* this.registerState('unverified', (attrs) => ({ ...attrs, emailVerified: null }));
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
registerState(name, modifier) {
|
|
82
|
+
this.states.set(name, modifier);
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Apply a named state modifier.
|
|
87
|
+
* Returns a new factory instance with the state applied.
|
|
88
|
+
*
|
|
89
|
+
* @param name - State name to apply
|
|
90
|
+
* @returns New factory instance with state active (preserves subclass type)
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* // Create an admin user
|
|
95
|
+
* await factory.get(UserFactory).state('admin').create();
|
|
96
|
+
*
|
|
97
|
+
* // Chain multiple states
|
|
98
|
+
* await factory.get(UserFactory).state('admin').state('verified').create();
|
|
99
|
+
*
|
|
100
|
+
* // Subclass methods preserved after state()
|
|
101
|
+
* const factory = new UserFactory(prisma);
|
|
102
|
+
* await factory.state('verified').admin().create(); // admin() still accessible
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
state(name) {
|
|
106
|
+
if (!this.states.has(name)) {
|
|
107
|
+
throw stateNotFound(this.constructor.name, name, Array.from(this.states.keys()));
|
|
108
|
+
}
|
|
109
|
+
// Create a shallow clone with the state added
|
|
110
|
+
const clone = Object.create(Object.getPrototypeOf(this));
|
|
111
|
+
Object.assign(clone, this);
|
|
112
|
+
clone.states = new Map(this.states);
|
|
113
|
+
clone.activeStates = [...this.activeStates, name];
|
|
114
|
+
return clone;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get list of available state names.
|
|
118
|
+
*/
|
|
119
|
+
getAvailableStates() {
|
|
120
|
+
return Array.from(this.states.keys());
|
|
121
|
+
}
|
|
122
|
+
// ==========================================================================
|
|
123
|
+
// Make (without persisting)
|
|
124
|
+
// ==========================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Make a single instance without persisting to database.
|
|
127
|
+
*
|
|
128
|
+
* @param overrides - Attributes to override defaults
|
|
129
|
+
* @returns Generated attributes
|
|
130
|
+
*/
|
|
131
|
+
make(overrides) {
|
|
132
|
+
return this.buildAttributes(overrides);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Make multiple instances without persisting to database.
|
|
136
|
+
*
|
|
137
|
+
* @param count - Number of instances to make
|
|
138
|
+
* @param overrides - Attributes to override defaults for all instances
|
|
139
|
+
* @returns Array of generated attributes
|
|
140
|
+
*/
|
|
141
|
+
makeMany(count, overrides) {
|
|
142
|
+
return Array.from({ length: count }, () => this.buildAttributes(overrides));
|
|
143
|
+
}
|
|
144
|
+
// ==========================================================================
|
|
145
|
+
// Create (persist to database)
|
|
146
|
+
// ==========================================================================
|
|
147
|
+
/**
|
|
148
|
+
* Create a single instance in the database.
|
|
149
|
+
*
|
|
150
|
+
* @param overrides - Attributes to override defaults
|
|
151
|
+
* @returns Created database record
|
|
152
|
+
*/
|
|
153
|
+
async create(overrides) {
|
|
154
|
+
const data = this.buildAttributes(overrides);
|
|
155
|
+
try {
|
|
156
|
+
// Access Prisma model dynamically with type-safe casting
|
|
157
|
+
// We use unknown as intermediate to avoid any, then cast to our defined type
|
|
158
|
+
const prismaWithModels = this.prisma;
|
|
159
|
+
const model = prismaWithModels[this.modelName];
|
|
160
|
+
if (!model || typeof model.create !== 'function') {
|
|
161
|
+
throw new Error(`Model '${this.modelName}' not found on Prisma client`);
|
|
162
|
+
}
|
|
163
|
+
return await model.create({ data });
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
167
|
+
throw factoryCreateFailed(this.modelName, err);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Create multiple instances in the database.
|
|
172
|
+
*
|
|
173
|
+
* @param count - Number of instances to create
|
|
174
|
+
* @param overrides - Attributes to override defaults for all instances
|
|
175
|
+
* @returns Array of created database records
|
|
176
|
+
*/
|
|
177
|
+
async createMany(count, overrides) {
|
|
178
|
+
const results = [];
|
|
179
|
+
// Create individually to get all returned records
|
|
180
|
+
// (createMany doesn't return created records in some databases)
|
|
181
|
+
for (let i = 0; i < count; i++) {
|
|
182
|
+
const record = await this.create(overrides);
|
|
183
|
+
results.push(record);
|
|
184
|
+
}
|
|
185
|
+
return results;
|
|
186
|
+
}
|
|
187
|
+
// ==========================================================================
|
|
188
|
+
// Private Helpers
|
|
189
|
+
// ==========================================================================
|
|
190
|
+
/**
|
|
191
|
+
* Build attributes by applying definition, states, and overrides.
|
|
192
|
+
*/
|
|
193
|
+
buildAttributes(overrides) {
|
|
194
|
+
// Start with definition
|
|
195
|
+
let attrs = this.definition();
|
|
196
|
+
// Apply active states in order
|
|
197
|
+
for (const stateName of this.activeStates) {
|
|
198
|
+
const modifier = this.states.get(stateName);
|
|
199
|
+
if (modifier) {
|
|
200
|
+
attrs = { ...attrs, ...modifier(attrs) };
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Apply overrides last
|
|
204
|
+
if (overrides) {
|
|
205
|
+
attrs = { ...attrs, ...overrides };
|
|
206
|
+
}
|
|
207
|
+
return attrs;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// Factory Registry
|
|
212
|
+
// ============================================================================
|
|
213
|
+
/**
|
|
214
|
+
* Create a factory registry for managing factory instances.
|
|
215
|
+
*
|
|
216
|
+
* The registry caches factory instances and provides type-safe access.
|
|
217
|
+
*
|
|
218
|
+
* @param prisma - Prisma client to inject into factories
|
|
219
|
+
* @returns Factory registry instance
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* const registry = createFactoryRegistry(prisma);
|
|
224
|
+
*
|
|
225
|
+
* // Get or create factory instance
|
|
226
|
+
* const userFactory = registry.get(UserFactory);
|
|
227
|
+
* await userFactory.create();
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export function createFactoryRegistry(prisma) {
|
|
231
|
+
// Use unknown for type-erased storage, similar to AnyGenerator pattern
|
|
232
|
+
const instances = new Map();
|
|
233
|
+
return {
|
|
234
|
+
get(FactoryClass) {
|
|
235
|
+
// Check cache first
|
|
236
|
+
let instance = instances.get(FactoryClass);
|
|
237
|
+
if (!instance) {
|
|
238
|
+
// Create new instance
|
|
239
|
+
instance = new FactoryClass(prisma);
|
|
240
|
+
instances.set(FactoryClass, instance);
|
|
241
|
+
}
|
|
242
|
+
// Type safety is maintained by the generic constraints on FactoryClass
|
|
243
|
+
return instance;
|
|
244
|
+
},
|
|
245
|
+
clear() {
|
|
246
|
+
instances.clear();
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/seeding/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @veloxts/cli - Database Seeding Module
|
|
3
|
+
*
|
|
4
|
+
* Laravel-inspired database seeding system with factories and seeders.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // In a seeder file (src/database/seeders/UserSeeder.ts)
|
|
9
|
+
* import type { Seeder, SeederContext } from '@veloxts/cli';
|
|
10
|
+
* import { UserFactory } from '../factories/UserFactory.js';
|
|
11
|
+
*
|
|
12
|
+
* export const UserSeeder: Seeder = {
|
|
13
|
+
* name: 'UserSeeder',
|
|
14
|
+
* dependencies: [],
|
|
15
|
+
*
|
|
16
|
+
* async run({ db, factory, log }) {
|
|
17
|
+
* await factory.get(UserFactory).createMany(10);
|
|
18
|
+
* log.success('Created 10 users');
|
|
19
|
+
* },
|
|
20
|
+
* };
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module @veloxts/cli/seeding
|
|
24
|
+
*/
|
|
25
|
+
export type { BatchSeederResult, Environment, Factory, FactoryConstructor, FactoryRegistry, LoadedSeeder, PrismaClientLike, SeedCommandOptions, Seeder, SeederContext, SeederLoadResult, SeederLogger, SeederResult, SeederRunOptions, StateModifier, } from './types.js';
|
|
26
|
+
export { circularDependency, dependencyNotFound, executionFailed, FactoryError, factoryCreateFailed, factoryNotFound, filesystemError, invalidExport, noSeedersFound, SeederError, SeederErrorCode, seederDatabaseError, seederNotFound, stateNotFound, truncationFailed, } from './errors.js';
|
|
27
|
+
export { BaseFactory, createFactoryRegistry } from './factory.js';
|
|
28
|
+
export { loadSeeders, seedersDirectoryExists } from './loader.js';
|
|
29
|
+
export { SeederRegistry } from './registry.js';
|
|
30
|
+
export { SeederRunner } from './runner.js';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seeding/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,YAAY,EACV,iBAAiB,EAEjB,WAAW,EAEX,OAAO,EACP,kBAAkB,EAClB,eAAe,EAEf,YAAY,EAEZ,gBAAgB,EAEhB,kBAAkB,EAElB,MAAM,EACN,aAAa,EACb,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AAMpB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,mBAAmB,EAEnB,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAMlE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|