@veloxts/cli 0.4.1 → 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.
- package/README.md +23 -144
- 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/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/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/migrations/rollback-runner.d.ts.map +1 -1
- package/dist/migrations/rollback-runner.js +13 -1
- package/dist/migrations/rollback-runner.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/package.json +6 -6
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeder Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates seeder files for VeloxTS applications.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox generate seeder <name> [options]
|
|
8
|
+
* velox g s <name> [options]
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* velox generate seeder user # Creates UserSeeder
|
|
12
|
+
* velox generate seeder post --factory # Also creates PostFactory
|
|
13
|
+
*/
|
|
14
|
+
import { BaseGenerator } from '../base.js';
|
|
15
|
+
import { type SeederOptions } from '../templates/seeder.js';
|
|
16
|
+
import type { GeneratorConfig, GeneratorMetadata, GeneratorOption, GeneratorOutput } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Seeder generator - creates seeder files for database seeding
|
|
19
|
+
*/
|
|
20
|
+
export declare class SeederGenerator extends BaseGenerator<SeederOptions> {
|
|
21
|
+
readonly metadata: GeneratorMetadata;
|
|
22
|
+
readonly options: ReadonlyArray<GeneratorOption>;
|
|
23
|
+
/**
|
|
24
|
+
* Validate and transform raw options
|
|
25
|
+
*/
|
|
26
|
+
validateOptions(raw: Record<string, unknown>): SeederOptions;
|
|
27
|
+
/**
|
|
28
|
+
* Generate seeder files
|
|
29
|
+
*/
|
|
30
|
+
generate(config: GeneratorConfig<SeederOptions>): Promise<GeneratorOutput>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new seeder generator instance
|
|
34
|
+
*/
|
|
35
|
+
export declare function createSeederGenerator(): SeederGenerator;
|
|
36
|
+
//# sourceMappingURL=seeder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.d.ts","sourceRoot":"","sources":["../../../src/generators/generators/seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAEV,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EAChB,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa,CAAC,aAAa,CAAC;IAC/D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAelC;IAEF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CAQ9C;IAEF;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAM5D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAiCjF;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeder Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates seeder files for VeloxTS applications.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox generate seeder <name> [options]
|
|
8
|
+
* velox g s <name> [options]
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* velox generate seeder user # Creates UserSeeder
|
|
12
|
+
* velox generate seeder post --factory # Also creates PostFactory
|
|
13
|
+
*/
|
|
14
|
+
import { BaseGenerator } from '../base.js';
|
|
15
|
+
import { factoryTemplate, getFactoryPath } from '../templates/factory.js';
|
|
16
|
+
import { getSeederInstructions, getSeederPath, seederTemplate, } from '../templates/seeder.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Generator Implementation
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Seeder generator - creates seeder files for database seeding
|
|
22
|
+
*/
|
|
23
|
+
export class SeederGenerator extends BaseGenerator {
|
|
24
|
+
metadata = {
|
|
25
|
+
name: 'seeder',
|
|
26
|
+
description: 'Generate a database seeder file',
|
|
27
|
+
longDescription: `
|
|
28
|
+
Generate a VeloxTS seeder file for populating the database with initial or test data.
|
|
29
|
+
|
|
30
|
+
Seeders are stored in src/database/seeders/ and implement the Seeder interface.
|
|
31
|
+
They can have dependencies on other seeders and are executed in the correct order.
|
|
32
|
+
|
|
33
|
+
Examples:
|
|
34
|
+
velox generate seeder user # Creates UserSeeder.ts
|
|
35
|
+
velox generate seeder post --factory # Creates PostSeeder.ts and PostFactory.ts
|
|
36
|
+
`,
|
|
37
|
+
aliases: ['s', 'seed'],
|
|
38
|
+
category: 'database',
|
|
39
|
+
};
|
|
40
|
+
options = [
|
|
41
|
+
{
|
|
42
|
+
name: 'factory',
|
|
43
|
+
short: 'f',
|
|
44
|
+
description: 'Also generate a factory for this model',
|
|
45
|
+
type: 'boolean',
|
|
46
|
+
default: false,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Validate and transform raw options
|
|
51
|
+
*/
|
|
52
|
+
validateOptions(raw) {
|
|
53
|
+
return {
|
|
54
|
+
factory: Boolean(raw.factory ?? false),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generate seeder files
|
|
59
|
+
*/
|
|
60
|
+
async generate(config) {
|
|
61
|
+
const context = this.createContext(config);
|
|
62
|
+
const { entity, options } = context;
|
|
63
|
+
const files = [];
|
|
64
|
+
// Generate seeder file
|
|
65
|
+
const seederContent = seederTemplate(context);
|
|
66
|
+
files.push({
|
|
67
|
+
path: getSeederPath(entity.pascal),
|
|
68
|
+
content: seederContent,
|
|
69
|
+
});
|
|
70
|
+
// Generate factory if requested
|
|
71
|
+
if (options.factory) {
|
|
72
|
+
const factoryContent = factoryTemplate({
|
|
73
|
+
entity: context.entity,
|
|
74
|
+
project: context.project,
|
|
75
|
+
options: {},
|
|
76
|
+
});
|
|
77
|
+
files.push({
|
|
78
|
+
path: getFactoryPath(entity.pascal),
|
|
79
|
+
content: factoryContent,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Generate post-creation instructions
|
|
83
|
+
const postInstructions = getSeederInstructions(entity.pascal, Boolean(options.factory));
|
|
84
|
+
return {
|
|
85
|
+
files,
|
|
86
|
+
postInstructions,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Export
|
|
92
|
+
// ============================================================================
|
|
93
|
+
/**
|
|
94
|
+
* Create a new seeder generator instance
|
|
95
|
+
*/
|
|
96
|
+
export function createSeederGenerator() {
|
|
97
|
+
return new SeederGenerator();
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=seeder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.js","sourceRoot":"","sources":["../../../src/generators/generators/seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,aAAa,EAEb,cAAc,GACf,MAAM,wBAAwB,CAAC;AAShC,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,aAA4B;IACtD,QAAQ,GAAsB;QACrC,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iCAAiC;QAC9C,eAAe,EAAE;;;;;;;;;CASpB;QACG,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,UAAU;KACrB,CAAC;IAEO,OAAO,GAAmC;QACjD;YACE,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,wCAAwC;YACrD,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACf;KACF,CAAC;IAEF;;OAEG;IACH,eAAe,CAAC,GAA4B;QAC1C,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAsC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QACpC,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,uBAAuB;QACvB,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QAEH,gCAAgC;QAChC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,cAAc,GAAG,eAAe,CAAC;gBACrC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;gBACnC,OAAO,EAAE,cAAc;aACxB,CAAC,CAAC;QACL,CAAC;QAED,sCAAsC;QACtC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAExF,OAAO;YACL,KAAK;YACL,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,eAAe,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory Templates
|
|
3
|
+
*
|
|
4
|
+
* Template functions for generating factory files.
|
|
5
|
+
*/
|
|
6
|
+
import type { TemplateContext } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options for factory generation
|
|
9
|
+
*/
|
|
10
|
+
export interface FactoryOptions {
|
|
11
|
+
/** Include a model type import hint */
|
|
12
|
+
model?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get the path for a factory file
|
|
16
|
+
*/
|
|
17
|
+
export declare function getFactoryPath(pascalName: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Generate factory file content
|
|
20
|
+
*/
|
|
21
|
+
export declare function factoryTemplate(context: TemplateContext<FactoryOptions>): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get post-generation instructions
|
|
24
|
+
*/
|
|
25
|
+
export declare function getFactoryInstructions(pascalName: string): string;
|
|
26
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzD;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,cAAc,CAAC,GAAG,MAAM,CAgFhF;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBjE"}
|
|
@@ -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
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback-runner.d.ts","sourceRoot":"","sources":["../../src/migrations/rollback-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,aAAa,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"rollback-runner.d.ts","sourceRoot":"","sources":["../../src/migrations/rollback-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,aAAa,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA6CzB;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,aAAa,EAAE,EAC3B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAoC9B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,aAAa,EAAE,EAC3B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAE9B;AAMD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,EAAE,CAAC,CAcnF;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,YAA2B,GACpC,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
|
|
@@ -38,7 +38,8 @@ export async function rollbackMigration(prisma, migration, options = {}) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
// Remove migration record from _prisma_migrations using parameterized query
|
|
41
|
-
|
|
41
|
+
// Use database-specific placeholder syntax ($1 for PostgreSQL, ? for SQLite/MySQL)
|
|
42
|
+
await prisma.$executeRawUnsafe(getDeleteMigrationQuery(options.database), migration.name);
|
|
42
43
|
return {
|
|
43
44
|
migration: migration.name,
|
|
44
45
|
success: true,
|
|
@@ -145,6 +146,17 @@ export async function checkMigrationsTableExists(prisma, database = 'postgresql'
|
|
|
145
146
|
// ============================================================================
|
|
146
147
|
// SQL Helpers
|
|
147
148
|
// ============================================================================
|
|
149
|
+
/**
|
|
150
|
+
* Get the DELETE query for removing a migration record, with correct
|
|
151
|
+
* parameter placeholder syntax for the target database.
|
|
152
|
+
*
|
|
153
|
+
* - PostgreSQL uses `$1`, `$2`, etc.
|
|
154
|
+
* - SQLite and MySQL use `?`
|
|
155
|
+
*/
|
|
156
|
+
function getDeleteMigrationQuery(database = 'postgresql') {
|
|
157
|
+
const placeholder = database === 'postgresql' ? '$1' : '?';
|
|
158
|
+
return `DELETE FROM "_prisma_migrations" WHERE "migration_name" = ${placeholder}`;
|
|
159
|
+
}
|
|
148
160
|
/**
|
|
149
161
|
* Split SQL into individual statements
|
|
150
162
|
* Handles basic cases - not a full SQL parser
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback-runner.js","sourceRoot":"","sources":["../../src/migrations/rollback-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuB5E,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,SAAwB,EACxB,UAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,iCAAiC;IACjC,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,IAAI;YACzB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE/D,iDAAiD;QACjD,8CAA8C;QAC9C,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE/C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,MAAM,MAAM,CAAC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"rollback-runner.js","sourceRoot":"","sources":["../../src/migrations/rollback-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|