@deessejs/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/deesse.js +0 -0
- package/dist/commands/db-generate.d.ts +17 -0
- package/dist/commands/db-generate.d.ts.map +1 -0
- package/dist/commands/db-generate.js +67 -0
- package/dist/commands/db-generate.js.map +1 -0
- package/dist/commands/db-introspect.d.ts +16 -0
- package/dist/commands/db-introspect.d.ts.map +1 -0
- package/dist/commands/db-introspect.js +82 -0
- package/dist/commands/db-introspect.js.map +1 -0
- package/dist/commands/db-migrate.d.ts +16 -0
- package/dist/commands/db-migrate.d.ts.map +1 -0
- package/dist/commands/db-migrate.js +77 -0
- package/dist/commands/db-migrate.js.map +1 -0
- package/dist/commands/db-push.d.ts +18 -0
- package/dist/commands/db-push.d.ts.map +1 -0
- package/dist/commands/db-push.js +69 -0
- package/dist/commands/db-push.js.map +1 -0
- package/dist/commands/db-studio.d.ts +16 -0
- package/dist/commands/db-studio.d.ts.map +1 -0
- package/dist/commands/db-studio.js +72 -0
- package/dist/commands/db-studio.js.map +1 -0
- package/dist/commands/db.d.ts +17 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +153 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/index.js +45 -18
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +47 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/dialect.d.ts +23 -0
- package/dist/utils/dialect.d.ts.map +1 -0
- package/dist/utils/dialect.js +82 -0
- package/dist/utils/dialect.js.map +1 -0
- package/dist/utils/schema-generator.d.ts +25 -0
- package/dist/utils/schema-generator.d.ts.map +1 -0
- package/dist/utils/schema-generator.js +157 -0
- package/dist/utils/schema-generator.js.map +1 -0
- package/dist/utils/schema-loader.d.ts +16 -0
- package/dist/utils/schema-loader.d.ts.map +1 -0
- package/dist/utils/schema-loader.js +46 -0
- package/dist/utils/schema-loader.js.map +1 -0
- package/package.json +12 -11
package/bin/deesse.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:generate command
|
|
3
|
+
*
|
|
4
|
+
* Generates migrations from schema changes using drizzle-kit's programmatic API.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load schema from ./src/db/schema.ts
|
|
8
|
+
* 2. Get current schema snapshot using generateDrizzleJson
|
|
9
|
+
* 3. Get previous snapshot from ./src/db/meta/_snapshot.json (if exists)
|
|
10
|
+
* 4. Generate migration SQL using generateMigration
|
|
11
|
+
* 5. Save new snapshot and migration files
|
|
12
|
+
*/
|
|
13
|
+
export interface DbGenerateOptions {
|
|
14
|
+
cwd?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function dbGenerate(options?: DbGenerateOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=db-generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-generate.d.ts","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE/E"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:generate command
|
|
3
|
+
*
|
|
4
|
+
* Generates migrations from schema changes using drizzle-kit's programmatic API.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load schema from ./src/db/schema.ts
|
|
8
|
+
* 2. Get current schema snapshot using generateDrizzleJson
|
|
9
|
+
* 3. Get previous snapshot from ./src/db/meta/_snapshot.json (if exists)
|
|
10
|
+
* 4. Generate migration SQL using generateMigration
|
|
11
|
+
* 5. Save new snapshot and migration files
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs/promises';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { generateDrizzleJson, generateMigration, } from 'drizzle-kit/api';
|
|
16
|
+
import { loadSchema, verifySchemaPath } from '../utils/schema-loader.js';
|
|
17
|
+
const SCHEMA_PATH = './src/db/schema.ts';
|
|
18
|
+
const MIGRATIONS_DIR = './src/db/migrations';
|
|
19
|
+
const SNAPSHOT_DIR = './src/db/meta';
|
|
20
|
+
const SNAPSHOT_FILE = '_snapshot.json';
|
|
21
|
+
export async function dbGenerate(options = {}) {
|
|
22
|
+
const cwd = options.cwd ?? process.cwd();
|
|
23
|
+
// Verify schema file exists
|
|
24
|
+
try {
|
|
25
|
+
await verifySchemaPath();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error(`db:generate requires ${SCHEMA_PATH} to exist.\n` +
|
|
29
|
+
`Please create this file and export your Drizzle tables.`);
|
|
30
|
+
}
|
|
31
|
+
// Ensure migrations directory exists
|
|
32
|
+
await fs.mkdir(path.join(cwd, MIGRATIONS_DIR), { recursive: true });
|
|
33
|
+
// Ensure snapshot directory exists
|
|
34
|
+
await fs.mkdir(path.join(cwd, SNAPSHOT_DIR), { recursive: true });
|
|
35
|
+
// Load the schema
|
|
36
|
+
const { schema } = await loadSchema();
|
|
37
|
+
// Generate current schema snapshot
|
|
38
|
+
const currentSchema = generateDrizzleJson(schema);
|
|
39
|
+
// Load previous snapshot (if exists)
|
|
40
|
+
let prevSchema = null;
|
|
41
|
+
const snapshotPath = path.join(cwd, SNAPSHOT_DIR, SNAPSHOT_FILE);
|
|
42
|
+
try {
|
|
43
|
+
const snapshotContent = await fs.readFile(snapshotPath, 'utf-8');
|
|
44
|
+
prevSchema = JSON.parse(snapshotContent);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// No previous snapshot - this is the first migration
|
|
48
|
+
console.warn('No previous snapshot found. This will be the first migration.');
|
|
49
|
+
}
|
|
50
|
+
// Generate migration SQL
|
|
51
|
+
const migrationSql = await generateMigration(prevSchema ?? undefined, currentSchema);
|
|
52
|
+
if (!migrationSql || migrationSql.length === 0) {
|
|
53
|
+
console.warn('No changes detected. No migration to generate.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Generate migration file name based on timestamp
|
|
57
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
58
|
+
const migrationName = `${timestamp}_migration.sql`;
|
|
59
|
+
const migrationPath = path.join(cwd, MIGRATIONS_DIR, migrationName);
|
|
60
|
+
// Save migration file
|
|
61
|
+
await fs.writeFile(migrationPath, migrationSql.join('\n\n'));
|
|
62
|
+
// Save new snapshot
|
|
63
|
+
await fs.writeFile(snapshotPath, JSON.stringify(currentSchema, null, 2));
|
|
64
|
+
console.warn(`Generated migration: ${migrationName}`);
|
|
65
|
+
console.warn(`Migration saved to: ${MIGRATIONS_DIR}/${migrationName}`);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=db-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-generate.js","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:introspect command
|
|
3
|
+
*
|
|
4
|
+
* Introspects the database and generates a schema.ts file.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load config to verify database is configured
|
|
8
|
+
* 2. Spawn drizzle-kit introspect command
|
|
9
|
+
* 3. Note: Introspection result needs to be processed manually
|
|
10
|
+
*/
|
|
11
|
+
export interface DbIntrospectOptions {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
force?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function dbIntrospect(options?: DbIntrospectOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=db-introspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-introspect.d.ts","sourceRoot":"","sources":["../../src/commands/db-introspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEnF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:introspect command
|
|
3
|
+
*
|
|
4
|
+
* Introspects the database and generates a schema.ts file.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load config to verify database is configured
|
|
8
|
+
* 2. Spawn drizzle-kit introspect command
|
|
9
|
+
* 3. Note: Introspection result needs to be processed manually
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from 'node:child_process';
|
|
12
|
+
import { loadConfig } from '../utils/config.js';
|
|
13
|
+
import { detectDialect } from '../utils/dialect.js';
|
|
14
|
+
import { SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
15
|
+
import * as fs from 'node:fs/promises';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import * as p from '@clack/prompts';
|
|
18
|
+
export async function dbIntrospect(options = {}) {
|
|
19
|
+
const { cwd = process.cwd(), force = false } = options;
|
|
20
|
+
// Load config to verify database is configured
|
|
21
|
+
const { config } = await loadConfig();
|
|
22
|
+
const db = config.database;
|
|
23
|
+
if (!db) {
|
|
24
|
+
throw new Error('Config does not have a database instance');
|
|
25
|
+
}
|
|
26
|
+
// Detect dialect
|
|
27
|
+
const dialect = detectDialect(db);
|
|
28
|
+
console.warn(`Introspecting ${dialect} database...`);
|
|
29
|
+
console.warn('');
|
|
30
|
+
console.warn(`Note: db:introspect requires drizzle-kit CLI introspection.`);
|
|
31
|
+
console.warn(`This command will attempt to use 'npx drizzle-kit introspect'.`);
|
|
32
|
+
console.warn('');
|
|
33
|
+
// Build the command
|
|
34
|
+
const args = [
|
|
35
|
+
'drizzle-kit',
|
|
36
|
+
'introspect',
|
|
37
|
+
];
|
|
38
|
+
// Check if schema file exists and warn
|
|
39
|
+
const schemaPath = path.join(cwd, SCHEMA_PATH);
|
|
40
|
+
try {
|
|
41
|
+
await fs.access(schemaPath);
|
|
42
|
+
if (!force) {
|
|
43
|
+
const confirm = await p.confirm({
|
|
44
|
+
message: `Warning: ${SCHEMA_PATH} already exists. Overwrite?`,
|
|
45
|
+
initialValue: false,
|
|
46
|
+
});
|
|
47
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
48
|
+
p.cancel('Introspect cancelled.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// File doesn't exist, that's fine
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// Try to run drizzle-kit introspect
|
|
58
|
+
// Note: This requires drizzle.config.ts to be configured properly
|
|
59
|
+
execSync(`npx ${args.join(' ')}`, {
|
|
60
|
+
cwd,
|
|
61
|
+
stdio: 'inherit',
|
|
62
|
+
});
|
|
63
|
+
console.warn('');
|
|
64
|
+
console.warn('Introspection complete!');
|
|
65
|
+
console.warn('');
|
|
66
|
+
console.warn('Note: drizzle-kit generates a drizzle schema file, not src/db/schema.ts.');
|
|
67
|
+
console.warn('You may need to manually copy the generated schema to src/db/schema.ts');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error.code === 'ENOENT') {
|
|
71
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
72
|
+
}
|
|
73
|
+
console.warn('');
|
|
74
|
+
console.warn('Drizzle Kit introspection requires a drizzle.config.ts file.');
|
|
75
|
+
console.warn('For full introspection support, please:');
|
|
76
|
+
console.warn('1. Create a drizzle.config.ts file');
|
|
77
|
+
console.warn('2. Run: npx drizzle-kit introspect');
|
|
78
|
+
console.warn('');
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=db-introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-introspect.js","sourceRoot":"","sources":["../../src/commands/db-introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:migrate command
|
|
3
|
+
*
|
|
4
|
+
* Applies pending migrations to the database.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load config to get database instance
|
|
8
|
+
* 2. Get migration files from ./src/db/migrations
|
|
9
|
+
* 3. Execute each migration in order
|
|
10
|
+
*/
|
|
11
|
+
export interface DbMigrateOptions {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function dbMigrate(options?: DbMigrateOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=db-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-migrate.d.ts","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8BH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD7E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:migrate command
|
|
3
|
+
*
|
|
4
|
+
* Applies pending migrations to the database.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load config to get database instance
|
|
8
|
+
* 2. Get migration files from ./src/db/migrations
|
|
9
|
+
* 3. Execute each migration in order
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'node:fs/promises';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { loadConfig } from '../utils/config.js';
|
|
14
|
+
const MIGRATIONS_DIR = './src/db/migrations';
|
|
15
|
+
async function getMigrationFiles(cwd) {
|
|
16
|
+
const migrationsPath = path.join(cwd, MIGRATIONS_DIR);
|
|
17
|
+
try {
|
|
18
|
+
const files = await fs.readdir(migrationsPath);
|
|
19
|
+
return files
|
|
20
|
+
.filter((file) => file.endsWith('.sql'))
|
|
21
|
+
.map((name) => ({
|
|
22
|
+
name,
|
|
23
|
+
path: path.join(migrationsPath, name),
|
|
24
|
+
}))
|
|
25
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function dbMigrate(options = {}) {
|
|
32
|
+
const { cwd = process.cwd(), dryRun = false } = options;
|
|
33
|
+
// Load config to get database instance
|
|
34
|
+
const { config } = await loadConfig();
|
|
35
|
+
const db = config.database;
|
|
36
|
+
if (!db) {
|
|
37
|
+
throw new Error('Config does not have a database instance');
|
|
38
|
+
}
|
|
39
|
+
// Get migration files
|
|
40
|
+
const files = await getMigrationFiles(cwd);
|
|
41
|
+
if (files.length === 0) {
|
|
42
|
+
console.warn('No migrations to apply.');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
console.warn(`Found ${files.length} migration(s) to apply.\n`);
|
|
46
|
+
if (dryRun) {
|
|
47
|
+
console.warn('Dry run - showing migrations that would be applied:');
|
|
48
|
+
for (const file of files) {
|
|
49
|
+
console.warn(` - ${file.name}`);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Apply each migration
|
|
54
|
+
for (const file of files) {
|
|
55
|
+
const sql = await fs.readFile(file.path, 'utf-8');
|
|
56
|
+
console.warn(`Applying: ${file.name}`);
|
|
57
|
+
try {
|
|
58
|
+
// Execute the migration
|
|
59
|
+
// Note: The actual execution depends on the database driver
|
|
60
|
+
// For pg, we use db.execute() which returns a query result
|
|
61
|
+
if (typeof db.execute === 'function') {
|
|
62
|
+
await db.execute(sql);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error('Database driver does not support execute(). ' +
|
|
66
|
+
'Please use a supported driver like drizzle-orm/node-postgres.');
|
|
67
|
+
}
|
|
68
|
+
console.warn(` Applied successfully`);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error(` Failed: ${error.message}`);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
console.warn(`\nSuccessfully applied ${files.length} migration(s).`);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=db-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-migrate.js","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:push command
|
|
3
|
+
*
|
|
4
|
+
* Pushes schema changes directly to the database (dev only).
|
|
5
|
+
* Uses drizzle-kit's pushSchema programmatic API.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Load schema from ./src/db/schema.ts
|
|
9
|
+
* 2. Load config to get database instance
|
|
10
|
+
* 3. Call pushSchema with the schema
|
|
11
|
+
* 4. Show warnings and apply if confirmed (or force)
|
|
12
|
+
*/
|
|
13
|
+
export interface DbPushOptions {
|
|
14
|
+
force?: boolean;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function dbPush(options?: DbPushOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=db-push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-push.d.ts","sourceRoot":"","sources":["../../src/commands/db-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DvE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:push command
|
|
3
|
+
*
|
|
4
|
+
* Pushes schema changes directly to the database (dev only).
|
|
5
|
+
* Uses drizzle-kit's pushSchema programmatic API.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Load schema from ./src/db/schema.ts
|
|
9
|
+
* 2. Load config to get database instance
|
|
10
|
+
* 3. Call pushSchema with the schema
|
|
11
|
+
* 4. Show warnings and apply if confirmed (or force)
|
|
12
|
+
*/
|
|
13
|
+
import { pushSchema } from 'drizzle-kit/api';
|
|
14
|
+
import { loadConfig } from '../utils/config.js';
|
|
15
|
+
import { loadSchema, verifySchemaPath, SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
16
|
+
import * as p from '@clack/prompts';
|
|
17
|
+
export async function dbPush(options = {}) {
|
|
18
|
+
const { force = false } = options;
|
|
19
|
+
// Verify schema file exists
|
|
20
|
+
try {
|
|
21
|
+
await verifySchemaPath();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new Error(`db:push requires ${SCHEMA_PATH} to exist.\n` +
|
|
25
|
+
`Please create this file and export your Drizzle tables.`);
|
|
26
|
+
}
|
|
27
|
+
// Load config to get database instance
|
|
28
|
+
const { config } = await loadConfig();
|
|
29
|
+
const db = config.database;
|
|
30
|
+
if (!db) {
|
|
31
|
+
throw new Error('Config does not have a database instance');
|
|
32
|
+
}
|
|
33
|
+
// Load the schema
|
|
34
|
+
const { schema } = await loadSchema();
|
|
35
|
+
// Push schema to database
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
const result = await pushSchema(schema, db);
|
|
38
|
+
// Check for data loss
|
|
39
|
+
if (result.hasDataLoss && !force) {
|
|
40
|
+
p.note('The following changes may cause data loss:', 'Warning');
|
|
41
|
+
for (const warning of result.warnings) {
|
|
42
|
+
console.warn(` - ${warning}`);
|
|
43
|
+
}
|
|
44
|
+
console.warn('');
|
|
45
|
+
const confirm = await p.confirm({
|
|
46
|
+
message: 'Do you want to apply these changes anyway?',
|
|
47
|
+
initialValue: false,
|
|
48
|
+
});
|
|
49
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
50
|
+
p.cancel('Push cancelled.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (result.warnings.length > 0) {
|
|
55
|
+
p.note(result.warnings.join('\n'), 'Warnings');
|
|
56
|
+
}
|
|
57
|
+
// Show statements that will be executed
|
|
58
|
+
if (result.statementsToExecute.length > 0) {
|
|
59
|
+
console.warn('The following SQL will be executed:');
|
|
60
|
+
for (const stmt of result.statementsToExecute) {
|
|
61
|
+
console.warn(` ${stmt}`);
|
|
62
|
+
}
|
|
63
|
+
console.warn('');
|
|
64
|
+
}
|
|
65
|
+
// Apply the changes
|
|
66
|
+
await result.apply();
|
|
67
|
+
console.warn(`Successfully pushed ${result.statementsToExecute.length} changes to the database.`);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=db-push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-push.js","sourceRoot":"","sources":["../../src/commands/db-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAOpC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAyB,EAAE;IACtD,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAElC,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,oBAAoB,WAAW,cAAc;YAC7C,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE3B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,kBAAkB;IAClB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IAEtC,0BAA0B;IAC1B,8DAA8D;IAC9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,EAAS,CAAC,CAAC;IAEnD,sBAAsB;IACtB,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,4CAA4C,EAAE,SAAS,CAAC,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YAC9B,OAAO,EAAE,4CAA4C;YACrD,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,mBAAmB,CAAC,MAAM,2BAA2B,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:studio command
|
|
3
|
+
*
|
|
4
|
+
* Opens Drizzle Studio (database browser) by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists
|
|
8
|
+
* 2. Spawn drizzle-kit studio command with appropriate arguments
|
|
9
|
+
*/
|
|
10
|
+
export interface DbStudioOptions {
|
|
11
|
+
port?: number;
|
|
12
|
+
host?: string;
|
|
13
|
+
cwd?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function dbStudio(options?: DbStudioOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=db-studio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-studio.d.ts","sourceRoot":"","sources":["../../src/commands/db-studio.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE3E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:studio command
|
|
3
|
+
*
|
|
4
|
+
* Opens Drizzle Studio (database browser) by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists
|
|
8
|
+
* 2. Spawn drizzle-kit studio command with appropriate arguments
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { verifySchemaPath, SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
12
|
+
import { detectDialect } from '../utils/dialect.js';
|
|
13
|
+
import { loadConfig } from '../utils/config.js';
|
|
14
|
+
export async function dbStudio(options = {}) {
|
|
15
|
+
const cwd = options.cwd ?? process.cwd();
|
|
16
|
+
const port = options.port ?? parseInt(process.env['DB_STUDIO_PORT'] ?? '4983', 10);
|
|
17
|
+
const host = options.host ?? process.env['DB_STUDIO_HOST'] ?? '127.0.0.1';
|
|
18
|
+
// Verify schema file exists
|
|
19
|
+
try {
|
|
20
|
+
await verifySchemaPath();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error(`db:studio requires ${SCHEMA_PATH} to exist.\n` +
|
|
24
|
+
`Please create this file and export your Drizzle tables.`);
|
|
25
|
+
}
|
|
26
|
+
// Load config to verify database is configured
|
|
27
|
+
const { config } = await loadConfig();
|
|
28
|
+
const db = config.database;
|
|
29
|
+
if (!db) {
|
|
30
|
+
throw new Error('Config does not have a database instance');
|
|
31
|
+
}
|
|
32
|
+
// Detect dialect
|
|
33
|
+
const dialect = detectDialect(db);
|
|
34
|
+
if (dialect !== 'postgresql') {
|
|
35
|
+
throw new Error(`Drizzle Studio currently only supports PostgreSQL.\n` +
|
|
36
|
+
`Detected dialect: ${dialect}`);
|
|
37
|
+
}
|
|
38
|
+
// Build drizzle-kit studio command
|
|
39
|
+
// Note: drizzle-kit studio uses drizzle.config.ts which we don't have
|
|
40
|
+
// So we use a different approach - spawn drizzle-kit with --schema pointing to our schema
|
|
41
|
+
const args = [
|
|
42
|
+
'drizzle-kit',
|
|
43
|
+
'studio',
|
|
44
|
+
'--port', String(port),
|
|
45
|
+
'--host', host,
|
|
46
|
+
];
|
|
47
|
+
console.warn(`Starting Drizzle Studio...`);
|
|
48
|
+
console.warn(`Command: npx ${args.join(' ')}`);
|
|
49
|
+
console.warn('');
|
|
50
|
+
console.warn(`Note: This command requires a drizzle.config.ts file.`);
|
|
51
|
+
console.warn(`Since we don't use drizzle.config.ts, please either:`);
|
|
52
|
+
console.warn(`1. Create a minimal drizzle.config.ts pointing to your schema`);
|
|
53
|
+
console.warn(`2. Or use 'npx drizzle-kit studio' directly with a config file`);
|
|
54
|
+
console.warn('');
|
|
55
|
+
// Try to spawn drizzle-kit anyway - it might work if user has a config
|
|
56
|
+
try {
|
|
57
|
+
execSync(`npx ${args.join(' ')}`, {
|
|
58
|
+
cwd,
|
|
59
|
+
stdio: 'inherit',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error.code === 'ENOENT') {
|
|
64
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
65
|
+
}
|
|
66
|
+
// Drizzle-kit studio might fail if no config - show helpful message
|
|
67
|
+
console.warn('Drizzle Studio requires a drizzle.config.ts file to work.');
|
|
68
|
+
console.warn('For now, please use: npx drizzle-kit studio');
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=db-studio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-studio.js","sourceRoot":"","sources":["../../src/commands/db-studio.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAA2B,EAAE;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC;IAE1E,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sBAAsB,WAAW,cAAc;YAC/C,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE3B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAElC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,qBAAqB,OAAO,EAAE,CAC/B,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,sEAAsE;IACtE,0FAA0F;IAC1F,MAAM,IAAI,GAAG;QACX,aAAa;QACb,QAAQ;QACR,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;QACtB,QAAQ,EAAE,IAAI;KACf,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjB,uEAAuE;IACvE,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;YAChC,GAAG;YACH,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,oEAAoE;QACpE,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db command dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Handles all db:* subcommands:
|
|
5
|
+
* - db:generate Generate migrations from schema changes
|
|
6
|
+
* - db:migrate Apply pending migrations to database
|
|
7
|
+
* - db:push Push schema changes directly (dev only)
|
|
8
|
+
* - db:studio Open Drizzle Studio (database browser)
|
|
9
|
+
* - db:introspect Introspect database and generate schema
|
|
10
|
+
*/
|
|
11
|
+
export interface DbCommandOptions {
|
|
12
|
+
subcommand: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function runDbCommand(options: DbCommandOptions): Promise<void>;
|
|
16
|
+
export declare function showDbHelp(): void;
|
|
17
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC3E;AA8ED,wBAAgB,UAAU,IAAI,IAAI,CA0CjC"}
|