@veloxts/cli 0.4.0 → 0.4.2
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 +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/generate.d.ts +17 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +219 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/migrate.d.ts +8 -3
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +17 -123
- package/dist/commands/migrate.js.map +1 -1
- package/dist/generators/base.d.ts +76 -0
- package/dist/generators/base.d.ts.map +1 -0
- package/dist/generators/base.js +271 -0
- package/dist/generators/base.js.map +1 -0
- package/dist/generators/generators/index.d.ts +17 -0
- package/dist/generators/generators/index.d.ts.map +1 -0
- package/dist/generators/generators/index.js +43 -0
- package/dist/generators/generators/index.js.map +1 -0
- package/dist/generators/generators/migration.d.ts +43 -0
- package/dist/generators/generators/migration.d.ts.map +1 -0
- package/dist/generators/generators/migration.js +121 -0
- package/dist/generators/generators/migration.js.map +1 -0
- package/dist/generators/generators/model.d.ts +38 -0
- package/dist/generators/generators/model.d.ts.map +1 -0
- package/dist/generators/generators/model.js +108 -0
- package/dist/generators/generators/model.js.map +1 -0
- package/dist/generators/generators/procedure.d.ts +37 -0
- package/dist/generators/generators/procedure.d.ts.map +1 -0
- package/dist/generators/generators/procedure.js +99 -0
- package/dist/generators/generators/procedure.js.map +1 -0
- package/dist/generators/generators/resource.d.ts +29 -0
- package/dist/generators/generators/resource.d.ts.map +1 -0
- package/dist/generators/generators/resource.js +124 -0
- package/dist/generators/generators/resource.js.map +1 -0
- package/dist/generators/generators/schema.d.ts +28 -0
- package/dist/generators/generators/schema.d.ts.map +1 -0
- package/dist/generators/generators/schema.js +83 -0
- package/dist/generators/generators/schema.js.map +1 -0
- package/dist/generators/generators/test.d.ts +28 -0
- package/dist/generators/generators/test.d.ts.map +1 -0
- package/dist/generators/generators/test.js +96 -0
- package/dist/generators/generators/test.js.map +1 -0
- package/dist/generators/index.d.ts +16 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +16 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/registry.d.ts +97 -0
- package/dist/generators/registry.d.ts.map +1 -0
- package/dist/generators/registry.js +253 -0
- package/dist/generators/registry.js.map +1 -0
- package/dist/generators/templates/migration.d.ts +23 -0
- package/dist/generators/templates/migration.d.ts.map +1 -0
- package/dist/generators/templates/migration.js +389 -0
- package/dist/generators/templates/migration.js.map +1 -0
- package/dist/generators/templates/model.d.ts +37 -0
- package/dist/generators/templates/model.d.ts.map +1 -0
- package/dist/generators/templates/model.js +374 -0
- package/dist/generators/templates/model.js.map +1 -0
- package/dist/generators/templates/procedure.d.ts +25 -0
- package/dist/generators/templates/procedure.d.ts.map +1 -0
- package/dist/generators/templates/procedure.js +274 -0
- package/dist/generators/templates/procedure.js.map +1 -0
- package/dist/generators/templates/resource.d.ts +34 -0
- package/dist/generators/templates/resource.d.ts.map +1 -0
- package/dist/generators/templates/resource.js +550 -0
- package/dist/generators/templates/resource.js.map +1 -0
- package/dist/generators/templates/schema.d.ts +33 -0
- package/dist/generators/templates/schema.d.ts.map +1 -0
- package/dist/generators/templates/schema.js +248 -0
- package/dist/generators/templates/schema.js.map +1 -0
- package/dist/generators/templates/test.d.ts +31 -0
- package/dist/generators/templates/test.d.ts.map +1 -0
- package/dist/generators/templates/test.js +882 -0
- package/dist/generators/templates/test.js.map +1 -0
- package/dist/generators/types.d.ts +211 -0
- package/dist/generators/types.d.ts.map +1 -0
- package/dist/generators/types.js +54 -0
- package/dist/generators/types.js.map +1 -0
- package/dist/generators/utils/filesystem.d.ts +68 -0
- package/dist/generators/utils/filesystem.d.ts.map +1 -0
- package/dist/generators/utils/filesystem.js +217 -0
- package/dist/generators/utils/filesystem.js.map +1 -0
- package/dist/generators/utils/naming.d.ts +122 -0
- package/dist/generators/utils/naming.d.ts.map +1 -0
- package/dist/generators/utils/naming.js +198 -0
- package/dist/generators/utils/naming.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/commands/fresh.d.ts +11 -0
- package/dist/migrations/commands/fresh.d.ts.map +1 -0
- package/dist/migrations/commands/fresh.js +164 -0
- package/dist/migrations/commands/fresh.js.map +1 -0
- package/dist/migrations/commands/index.d.ts +11 -0
- package/dist/migrations/commands/index.d.ts.map +1 -0
- package/dist/migrations/commands/index.js +11 -0
- package/dist/migrations/commands/index.js.map +1 -0
- package/dist/migrations/commands/reset.d.ts +11 -0
- package/dist/migrations/commands/reset.d.ts.map +1 -0
- package/dist/migrations/commands/reset.js +258 -0
- package/dist/migrations/commands/reset.js.map +1 -0
- package/dist/migrations/commands/rollback.d.ts +11 -0
- package/dist/migrations/commands/rollback.d.ts.map +1 -0
- package/dist/migrations/commands/rollback.js +241 -0
- package/dist/migrations/commands/rollback.js.map +1 -0
- package/dist/migrations/commands/run.d.ts +11 -0
- package/dist/migrations/commands/run.d.ts.map +1 -0
- package/dist/migrations/commands/run.js +183 -0
- package/dist/migrations/commands/run.js.map +1 -0
- package/dist/migrations/commands/status.d.ts +11 -0
- package/dist/migrations/commands/status.d.ts.map +1 -0
- package/dist/migrations/commands/status.js +154 -0
- package/dist/migrations/commands/status.js.map +1 -0
- package/dist/migrations/errors.d.ts +74 -0
- package/dist/migrations/errors.d.ts.map +1 -0
- package/dist/migrations/errors.js +155 -0
- package/dist/migrations/errors.js.map +1 -0
- package/dist/migrations/index.d.ts +13 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +17 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/loader.d.ts +44 -0
- package/dist/migrations/loader.d.ts.map +1 -0
- package/dist/migrations/loader.js +181 -0
- package/dist/migrations/loader.js.map +1 -0
- package/dist/migrations/prisma-wrapper.d.ts +60 -0
- package/dist/migrations/prisma-wrapper.d.ts.map +1 -0
- package/dist/migrations/prisma-wrapper.js +184 -0
- package/dist/migrations/prisma-wrapper.js.map +1 -0
- package/dist/migrations/rollback-runner.d.ts +40 -0
- package/dist/migrations/rollback-runner.d.ts.map +1 -0
- package/dist/migrations/rollback-runner.js +203 -0
- package/dist/migrations/rollback-runner.js.map +1 -0
- package/dist/migrations/types.d.ts +214 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +19 -0
- package/dist/migrations/types.js.map +1 -0
- package/package.json +29 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,WAAW;AACX,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,cAAc,EAEd,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,SAAS;AACT,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,EAChC,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,iBAAiB;AACjB,OAAO,EACL,iBAAiB,EAEjB,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,kBAAkB;AAClB,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EAEpB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAmB9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads migration files from the filesystem.
|
|
5
|
+
*/
|
|
6
|
+
import type { MigrationFile, MigrationStatus, PrismaMigrationRecord } from './types.js';
|
|
7
|
+
/** Default migrations directory (relative to project root) */
|
|
8
|
+
export declare const DEFAULT_MIGRATIONS_PATH = "prisma/migrations";
|
|
9
|
+
/**
|
|
10
|
+
* Load all migrations from the migrations directory
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadMigrations(cwd: string, migrationsPath?: string): Promise<MigrationFile[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Get a migration by name
|
|
15
|
+
*/
|
|
16
|
+
export declare function getMigrationByName(cwd: string, name: string, migrationsPath?: string): Promise<MigrationFile>;
|
|
17
|
+
/**
|
|
18
|
+
* Read migration SQL content
|
|
19
|
+
*/
|
|
20
|
+
export declare function readMigrationSql(migration: MigrationFile): Promise<{
|
|
21
|
+
up: string;
|
|
22
|
+
down: string | null;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Query to get applied migrations from _prisma_migrations table
|
|
26
|
+
*/
|
|
27
|
+
export declare const GET_APPLIED_MIGRATIONS_SQL = "\n SELECT * FROM \"_prisma_migrations\"\n WHERE \"finished_at\" IS NOT NULL\n ORDER BY \"started_at\" ASC\n";
|
|
28
|
+
/**
|
|
29
|
+
* Compute migration status by comparing files with database records
|
|
30
|
+
*/
|
|
31
|
+
export declare function computeMigrationStatus(files: MigrationFile[], records: PrismaMigrationRecord[]): MigrationStatus[];
|
|
32
|
+
/**
|
|
33
|
+
* Get pending migrations
|
|
34
|
+
*/
|
|
35
|
+
export declare function getPendingMigrations(files: MigrationFile[], records: PrismaMigrationRecord[]): MigrationFile[];
|
|
36
|
+
/**
|
|
37
|
+
* Get applied migrations with rollback capability
|
|
38
|
+
*/
|
|
39
|
+
export declare function getAppliedMigrationsWithRollback(files: MigrationFile[], records: PrismaMigrationRecord[]): MigrationFile[];
|
|
40
|
+
/**
|
|
41
|
+
* Check if migrations directory exists
|
|
42
|
+
*/
|
|
43
|
+
export declare function migrationsDirExists(cwd: string, migrationsPath?: string): Promise<boolean>;
|
|
44
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/migrations/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAMxF,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAe3D;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,cAAc,SAA0B,GACvC,OAAO,CAAC,aAAa,EAAE,CAAC,CAkE1B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,cAAc,SAA0B,GACvC,OAAO,CAAC,aAAa,CAAC,CASxB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAK9C;AAMD;;GAEG;AACH,eAAO,MAAM,0BAA0B,mHAItC,CAAC;AAMF;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,EAAE,qBAAqB,EAAE,GAC/B,eAAe,EAAE,CAsCnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,EAAE,qBAAqB,EAAE,GAC/B,aAAa,EAAE,CAGjB;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,EAAE,qBAAqB,EAAE,GAC/B,aAAa,EAAE,CAGjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,cAAc,SAA0B,GACvC,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads migration files from the filesystem.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { migrationNotFound, migrationsDirNotFound } from './errors.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Constants
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/** Default migrations directory (relative to project root) */
|
|
13
|
+
export const DEFAULT_MIGRATIONS_PATH = 'prisma/migrations';
|
|
14
|
+
/** Migration SQL file name */
|
|
15
|
+
const MIGRATION_FILE = 'migration.sql';
|
|
16
|
+
/** Rollback SQL file name */
|
|
17
|
+
const DOWN_FILE = 'down.sql';
|
|
18
|
+
/** Migration folder pattern: timestamp_description */
|
|
19
|
+
const MIGRATION_PATTERN = /^(\d{14})_(.+)$/;
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// File Loading
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Load all migrations from the migrations directory
|
|
25
|
+
*/
|
|
26
|
+
export async function loadMigrations(cwd, migrationsPath = DEFAULT_MIGRATIONS_PATH) {
|
|
27
|
+
const fullPath = path.join(cwd, migrationsPath);
|
|
28
|
+
// Check if directory exists
|
|
29
|
+
try {
|
|
30
|
+
await fs.access(fullPath);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw migrationsDirNotFound(fullPath);
|
|
34
|
+
}
|
|
35
|
+
// Read directory contents
|
|
36
|
+
const entries = await fs.readdir(fullPath, { withFileTypes: true });
|
|
37
|
+
const migrations = [];
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
// Skip non-directories and migration_lock.toml
|
|
40
|
+
if (!entry.isDirectory()) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// Parse migration name
|
|
44
|
+
const match = MIGRATION_PATTERN.exec(entry.name);
|
|
45
|
+
if (!match) {
|
|
46
|
+
continue; // Skip folders that don't match pattern
|
|
47
|
+
}
|
|
48
|
+
const [, timestamp, description] = match;
|
|
49
|
+
const migrationDir = path.join(fullPath, entry.name);
|
|
50
|
+
// Check for migration.sql
|
|
51
|
+
const upPath = path.join(migrationDir, MIGRATION_FILE);
|
|
52
|
+
const downPath = path.join(migrationDir, DOWN_FILE);
|
|
53
|
+
let hasUp = false;
|
|
54
|
+
let hasDown = false;
|
|
55
|
+
try {
|
|
56
|
+
await fs.access(upPath);
|
|
57
|
+
hasUp = true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// No migration.sql
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await fs.access(downPath);
|
|
64
|
+
hasDown = true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// No down.sql
|
|
68
|
+
}
|
|
69
|
+
// Only include if has migration.sql
|
|
70
|
+
if (hasUp) {
|
|
71
|
+
migrations.push({
|
|
72
|
+
name: entry.name,
|
|
73
|
+
timestamp,
|
|
74
|
+
description,
|
|
75
|
+
upPath,
|
|
76
|
+
downPath: hasDown ? downPath : null,
|
|
77
|
+
hasRollback: hasDown,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Sort by timestamp (ascending)
|
|
82
|
+
return migrations.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get a migration by name
|
|
86
|
+
*/
|
|
87
|
+
export async function getMigrationByName(cwd, name, migrationsPath = DEFAULT_MIGRATIONS_PATH) {
|
|
88
|
+
const migrations = await loadMigrations(cwd, migrationsPath);
|
|
89
|
+
const migration = migrations.find((m) => m.name === name);
|
|
90
|
+
if (!migration) {
|
|
91
|
+
throw migrationNotFound(name);
|
|
92
|
+
}
|
|
93
|
+
return migration;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Read migration SQL content
|
|
97
|
+
*/
|
|
98
|
+
export async function readMigrationSql(migration) {
|
|
99
|
+
const up = await fs.readFile(migration.upPath, 'utf-8');
|
|
100
|
+
const down = migration.downPath ? await fs.readFile(migration.downPath, 'utf-8') : null;
|
|
101
|
+
return { up, down };
|
|
102
|
+
}
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// Database Query Helpers
|
|
105
|
+
// ============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Query to get applied migrations from _prisma_migrations table
|
|
108
|
+
*/
|
|
109
|
+
export const GET_APPLIED_MIGRATIONS_SQL = `
|
|
110
|
+
SELECT * FROM "_prisma_migrations"
|
|
111
|
+
WHERE "finished_at" IS NOT NULL
|
|
112
|
+
ORDER BY "started_at" ASC
|
|
113
|
+
`;
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Status Computation
|
|
116
|
+
// ============================================================================
|
|
117
|
+
/**
|
|
118
|
+
* Compute migration status by comparing files with database records
|
|
119
|
+
*/
|
|
120
|
+
export function computeMigrationStatus(files, records) {
|
|
121
|
+
// Create a map of applied migrations
|
|
122
|
+
const appliedMap = new Map();
|
|
123
|
+
for (const record of records) {
|
|
124
|
+
appliedMap.set(record.migration_name, record);
|
|
125
|
+
}
|
|
126
|
+
const statuses = [];
|
|
127
|
+
for (const file of files) {
|
|
128
|
+
const record = appliedMap.get(file.name);
|
|
129
|
+
if (record) {
|
|
130
|
+
// Migration is applied
|
|
131
|
+
const status = {
|
|
132
|
+
name: file.name,
|
|
133
|
+
status: record.finished_at ? 'applied' : 'failed',
|
|
134
|
+
appliedAt: record.finished_at,
|
|
135
|
+
hasRollback: file.hasRollback,
|
|
136
|
+
duration: record.finished_at && record.started_at
|
|
137
|
+
? new Date(record.finished_at).getTime() - new Date(record.started_at).getTime()
|
|
138
|
+
: null,
|
|
139
|
+
};
|
|
140
|
+
statuses.push(status);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Migration is pending
|
|
144
|
+
statuses.push({
|
|
145
|
+
name: file.name,
|
|
146
|
+
status: 'pending',
|
|
147
|
+
appliedAt: null,
|
|
148
|
+
hasRollback: file.hasRollback,
|
|
149
|
+
duration: null,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return statuses;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get pending migrations
|
|
157
|
+
*/
|
|
158
|
+
export function getPendingMigrations(files, records) {
|
|
159
|
+
const appliedNames = new Set(records.map((r) => r.migration_name));
|
|
160
|
+
return files.filter((f) => !appliedNames.has(f.name));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get applied migrations with rollback capability
|
|
164
|
+
*/
|
|
165
|
+
export function getAppliedMigrationsWithRollback(files, records) {
|
|
166
|
+
const appliedNames = new Set(records.map((r) => r.migration_name));
|
|
167
|
+
return files.filter((f) => appliedNames.has(f.name)).reverse(); // Most recent first for rollback order
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if migrations directory exists
|
|
171
|
+
*/
|
|
172
|
+
export async function migrationsDirExists(cwd, migrationsPath = DEFAULT_MIGRATIONS_PATH) {
|
|
173
|
+
try {
|
|
174
|
+
await fs.access(path.join(cwd, migrationsPath));
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/migrations/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma CLI Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Executes Prisma CLI commands programmatically and parses output.
|
|
5
|
+
*/
|
|
6
|
+
import type { PrismaResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Execute a Prisma CLI command
|
|
9
|
+
*/
|
|
10
|
+
export declare function runPrismaCommand(command: string[], cwd: string): Promise<PrismaResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Execute a Prisma CLI command with inherited stdio (shows output in terminal)
|
|
13
|
+
*/
|
|
14
|
+
export declare function runPrismaCommandInteractive(command: string[], cwd: string): Promise<PrismaResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Run `prisma migrate status`
|
|
17
|
+
*/
|
|
18
|
+
export declare function prismaMigrateStatus(cwd: string): Promise<PrismaResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Run `prisma migrate deploy` (production)
|
|
21
|
+
*/
|
|
22
|
+
export declare function prismaMigrateDeploy(cwd: string): Promise<PrismaResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Run `prisma migrate dev` (development)
|
|
25
|
+
*/
|
|
26
|
+
export declare function prismaMigrateDev(cwd: string, name?: string): Promise<PrismaResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Run `prisma migrate reset` (drop all + re-run)
|
|
29
|
+
*/
|
|
30
|
+
export declare function prismaMigrateReset(cwd: string, force?: boolean): Promise<PrismaResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Run `prisma db push` (sync schema without migrations)
|
|
33
|
+
*/
|
|
34
|
+
export declare function prismaDbPush(cwd: string, skipGenerate?: boolean): Promise<PrismaResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Run `prisma db seed`
|
|
37
|
+
*/
|
|
38
|
+
export declare function prismaDbSeed(cwd: string): Promise<PrismaResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Parse migration status from Prisma output
|
|
41
|
+
*/
|
|
42
|
+
export interface ParsedMigrationStatus {
|
|
43
|
+
/** List of applied migrations */
|
|
44
|
+
applied: string[];
|
|
45
|
+
/** List of pending migrations */
|
|
46
|
+
pending: string[];
|
|
47
|
+
/** Whether database is in sync */
|
|
48
|
+
inSync: boolean;
|
|
49
|
+
/** Any warnings from Prisma */
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse the output of `prisma migrate status`
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseMigrateStatusOutput(output: string): ParsedMigrationStatus;
|
|
56
|
+
/**
|
|
57
|
+
* Check if Prisma is installed and available
|
|
58
|
+
*/
|
|
59
|
+
export declare function isPrismaAvailable(cwd: string): Promise<boolean>;
|
|
60
|
+
//# sourceMappingURL=prisma-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-wrapper.d.ts","sourceRoot":"","sources":["../../src/migrations/prisma-wrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuC5F;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,CAAC,CA8BvB;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAMxF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAM1F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAM3F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAErE;AAMD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAmD9E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrE"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma CLI Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Executes Prisma CLI commands programmatically and parses output.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Core Execution
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Execute a Prisma CLI command
|
|
12
|
+
*/
|
|
13
|
+
export async function runPrismaCommand(command, cwd) {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
const fullCommand = ['prisma', ...command];
|
|
16
|
+
let stdout = '';
|
|
17
|
+
let stderr = '';
|
|
18
|
+
const prismaProcess = spawn('npx', fullCommand, {
|
|
19
|
+
cwd,
|
|
20
|
+
shell: true,
|
|
21
|
+
env: process.env,
|
|
22
|
+
});
|
|
23
|
+
prismaProcess.stdout?.on('data', (data) => {
|
|
24
|
+
stdout += data.toString();
|
|
25
|
+
});
|
|
26
|
+
prismaProcess.stderr?.on('data', (data) => {
|
|
27
|
+
stderr += data.toString();
|
|
28
|
+
});
|
|
29
|
+
prismaProcess.on('error', (err) => {
|
|
30
|
+
resolve({
|
|
31
|
+
success: false,
|
|
32
|
+
output: stdout,
|
|
33
|
+
error: err.message,
|
|
34
|
+
exitCode: 1,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
prismaProcess.on('close', (code) => {
|
|
38
|
+
const exitCode = code ?? 1;
|
|
39
|
+
resolve({
|
|
40
|
+
success: exitCode === 0,
|
|
41
|
+
output: stdout,
|
|
42
|
+
error: exitCode !== 0 ? stderr || stdout : undefined,
|
|
43
|
+
exitCode,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Execute a Prisma CLI command with inherited stdio (shows output in terminal)
|
|
50
|
+
*/
|
|
51
|
+
export async function runPrismaCommandInteractive(command, cwd) {
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
const fullCommand = ['prisma', ...command];
|
|
54
|
+
const prismaProcess = spawn('npx', fullCommand, {
|
|
55
|
+
cwd,
|
|
56
|
+
shell: true,
|
|
57
|
+
env: process.env,
|
|
58
|
+
stdio: 'inherit',
|
|
59
|
+
});
|
|
60
|
+
prismaProcess.on('error', (err) => {
|
|
61
|
+
resolve({
|
|
62
|
+
success: false,
|
|
63
|
+
output: '',
|
|
64
|
+
error: err.message,
|
|
65
|
+
exitCode: 1,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
prismaProcess.on('close', (code) => {
|
|
69
|
+
const exitCode = code ?? 1;
|
|
70
|
+
resolve({
|
|
71
|
+
success: exitCode === 0,
|
|
72
|
+
output: '',
|
|
73
|
+
error: exitCode !== 0 ? `Prisma exited with code ${exitCode}` : undefined,
|
|
74
|
+
exitCode,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Specific Commands
|
|
81
|
+
// ============================================================================
|
|
82
|
+
/**
|
|
83
|
+
* Run `prisma migrate status`
|
|
84
|
+
*/
|
|
85
|
+
export async function prismaMigrateStatus(cwd) {
|
|
86
|
+
return runPrismaCommand(['migrate', 'status'], cwd);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Run `prisma migrate deploy` (production)
|
|
90
|
+
*/
|
|
91
|
+
export async function prismaMigrateDeploy(cwd) {
|
|
92
|
+
return runPrismaCommandInteractive(['migrate', 'deploy'], cwd);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run `prisma migrate dev` (development)
|
|
96
|
+
*/
|
|
97
|
+
export async function prismaMigrateDev(cwd, name) {
|
|
98
|
+
const args = ['migrate', 'dev'];
|
|
99
|
+
if (name) {
|
|
100
|
+
args.push('--name', name);
|
|
101
|
+
}
|
|
102
|
+
return runPrismaCommandInteractive(args, cwd);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Run `prisma migrate reset` (drop all + re-run)
|
|
106
|
+
*/
|
|
107
|
+
export async function prismaMigrateReset(cwd, force = false) {
|
|
108
|
+
const args = ['migrate', 'reset'];
|
|
109
|
+
if (force) {
|
|
110
|
+
args.push('--force');
|
|
111
|
+
}
|
|
112
|
+
return runPrismaCommandInteractive(args, cwd);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Run `prisma db push` (sync schema without migrations)
|
|
116
|
+
*/
|
|
117
|
+
export async function prismaDbPush(cwd, skipGenerate = false) {
|
|
118
|
+
const args = ['db', 'push'];
|
|
119
|
+
if (skipGenerate) {
|
|
120
|
+
args.push('--skip-generate');
|
|
121
|
+
}
|
|
122
|
+
return runPrismaCommandInteractive(args, cwd);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Run `prisma db seed`
|
|
126
|
+
*/
|
|
127
|
+
export async function prismaDbSeed(cwd) {
|
|
128
|
+
return runPrismaCommandInteractive(['db', 'seed'], cwd);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse the output of `prisma migrate status`
|
|
132
|
+
*/
|
|
133
|
+
export function parseMigrateStatusOutput(output) {
|
|
134
|
+
const applied = [];
|
|
135
|
+
const pending = [];
|
|
136
|
+
const warnings = [];
|
|
137
|
+
const lines = output.split('\n');
|
|
138
|
+
let inAppliedSection = false;
|
|
139
|
+
let inPendingSection = false;
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
const trimmed = line.trim();
|
|
142
|
+
// Detect sections - check pending first since "not yet applied" also contains "applied"
|
|
143
|
+
if (trimmed.includes('following migration') && trimmed.includes('not yet applied')) {
|
|
144
|
+
inAppliedSection = false;
|
|
145
|
+
inPendingSection = true;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (trimmed.includes('following migration') &&
|
|
149
|
+
trimmed.includes('applied') &&
|
|
150
|
+
!trimmed.includes('not yet')) {
|
|
151
|
+
inAppliedSection = true;
|
|
152
|
+
inPendingSection = false;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Parse migration names (they typically start with a timestamp)
|
|
156
|
+
const migrationMatch = trimmed.match(/^(\d{14}_\S+)/);
|
|
157
|
+
if (migrationMatch) {
|
|
158
|
+
if (inAppliedSection) {
|
|
159
|
+
applied.push(migrationMatch[1]);
|
|
160
|
+
}
|
|
161
|
+
else if (inPendingSection) {
|
|
162
|
+
pending.push(migrationMatch[1]);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Detect warnings
|
|
166
|
+
if (trimmed.toLowerCase().includes('warning')) {
|
|
167
|
+
warnings.push(trimmed);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
applied,
|
|
172
|
+
pending,
|
|
173
|
+
inSync: pending.length === 0,
|
|
174
|
+
warnings,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if Prisma is installed and available
|
|
179
|
+
*/
|
|
180
|
+
export async function isPrismaAvailable(cwd) {
|
|
181
|
+
const result = await runPrismaCommand(['--version'], cwd);
|
|
182
|
+
return result.success;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=prisma-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-wrapper.js","sourceRoot":"","sources":["../../src/migrations/prisma-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rollback Runner
|
|
3
|
+
*
|
|
4
|
+
* Custom rollback execution using down.sql files.
|
|
5
|
+
*/
|
|
6
|
+
import type { BatchRollbackResult, DatabaseType, MigrationFile, PrismaClientLike, RollbackResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options for rollback execution
|
|
9
|
+
*/
|
|
10
|
+
export interface RollbackOptions {
|
|
11
|
+
/** Dry run mode - don't execute, just report */
|
|
12
|
+
dryRun?: boolean;
|
|
13
|
+
/** Database type for SQL dialect */
|
|
14
|
+
database?: DatabaseType;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Rollback a single migration
|
|
18
|
+
*/
|
|
19
|
+
export declare function rollbackMigration(prisma: PrismaClientLike, migration: MigrationFile, options?: RollbackOptions): Promise<RollbackResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Rollback multiple migrations in order (most recent first)
|
|
22
|
+
*/
|
|
23
|
+
export declare function rollbackMultiple(prisma: PrismaClientLike, migrations: MigrationFile[], options?: RollbackOptions): Promise<BatchRollbackResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Rollback all migrations
|
|
26
|
+
*/
|
|
27
|
+
export declare function rollbackAll(prisma: PrismaClientLike, migrations: MigrationFile[], options?: RollbackOptions): Promise<BatchRollbackResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Get applied migrations from the database
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAppliedMigrations(prisma: PrismaClientLike): Promise<{
|
|
32
|
+
migration_name: string;
|
|
33
|
+
started_at: Date;
|
|
34
|
+
finished_at: Date | null;
|
|
35
|
+
}[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if _prisma_migrations table exists
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkMigrationsTableExists(prisma: PrismaClientLike, database?: DatabaseType): Promise<boolean>;
|
|
40
|
+
//# sourceMappingURL=rollback-runner.d.ts.map
|
|
@@ -0,0 +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,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"}
|