@deessejs/cli 0.2.0 → 0.3.1
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 +14 -0
- package/dist/commands/db-generate.d.ts.map +1 -0
- package/dist/commands/db-generate.js +36 -0
- package/dist/commands/db-generate.js.map +1 -0
- package/dist/commands/db-introspect.d.ts +15 -0
- package/dist/commands/db-introspect.d.ts.map +1 -0
- package/dist/commands/db-introspect.js +60 -0
- package/dist/commands/db-introspect.js.map +1 -0
- package/dist/commands/db-migrate.d.ts +15 -0
- package/dist/commands/db-migrate.d.ts.map +1 -0
- package/dist/commands/db-migrate.js +41 -0
- package/dist/commands/db-migrate.js.map +1 -0
- package/dist/commands/db-push.d.ts +15 -0
- package/dist/commands/db-push.d.ts.map +1 -0
- package/dist/commands/db-push.js +41 -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 +10 -10
package/bin/deesse.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:generate command
|
|
3
|
+
*
|
|
4
|
+
* Generates migrations from schema changes by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit generate command
|
|
9
|
+
*/
|
|
10
|
+
export interface DbGenerateOptions {
|
|
11
|
+
cwd?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function dbGenerate(options?: DbGenerateOptions): Promise<void>;
|
|
14
|
+
//# 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;;;;;;;;GAQG;AAKH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B/E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:generate command
|
|
3
|
+
*
|
|
4
|
+
* Generates migrations from schema changes by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit generate command
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { verifySchemaPath, SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
12
|
+
export async function dbGenerate(options = {}) {
|
|
13
|
+
const cwd = options.cwd ?? process.cwd();
|
|
14
|
+
// Verify schema file exists
|
|
15
|
+
try {
|
|
16
|
+
await verifySchemaPath();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error(`db:generate requires ${SCHEMA_PATH} to exist.\n` +
|
|
20
|
+
`Please create this file and export your Drizzle tables.`);
|
|
21
|
+
}
|
|
22
|
+
console.warn('Generating migrations using drizzle-kit...');
|
|
23
|
+
try {
|
|
24
|
+
execSync('npx drizzle-kit generate', {
|
|
25
|
+
cwd,
|
|
26
|
+
stdio: 'inherit',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error.code === 'ENOENT') {
|
|
31
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=db-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-generate.js","sourceRoot":"","sources":["../../src/commands/db-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAM1E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,cAAc;YACjD,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,QAAQ,CAAC,0BAA0B,EAAE;YACnC,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,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:introspect command
|
|
3
|
+
*
|
|
4
|
+
* Introspects the database by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit introspect command
|
|
9
|
+
*/
|
|
10
|
+
export interface DbIntrospectOptions {
|
|
11
|
+
cwd?: string;
|
|
12
|
+
force?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function dbIntrospect(options?: DbIntrospectOptions): Promise<void>;
|
|
15
|
+
//# 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;;;;;;;;GAQG;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,CAgDnF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:introspect command
|
|
3
|
+
*
|
|
4
|
+
* Introspects the database by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit introspect command
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
12
|
+
import { loadConfig } from '../utils/config.js';
|
|
13
|
+
import { detectDialect } from '../utils/dialect.js';
|
|
14
|
+
import * as fs from 'node:fs/promises';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import * as p from '@clack/prompts';
|
|
17
|
+
export async function dbIntrospect(options = {}) {
|
|
18
|
+
const { cwd = process.cwd(), force = false } = options;
|
|
19
|
+
// Load config to verify database is configured
|
|
20
|
+
const { config } = await loadConfig();
|
|
21
|
+
const db = config.database;
|
|
22
|
+
if (!db) {
|
|
23
|
+
throw new Error('Config does not have a database instance');
|
|
24
|
+
}
|
|
25
|
+
// Detect dialect
|
|
26
|
+
const dialect = detectDialect(db);
|
|
27
|
+
console.warn(`Introspecting ${dialect} database...`);
|
|
28
|
+
// Check if schema file exists and warn
|
|
29
|
+
const schemaPath = path.join(cwd, SCHEMA_PATH);
|
|
30
|
+
try {
|
|
31
|
+
await fs.access(schemaPath);
|
|
32
|
+
if (!force) {
|
|
33
|
+
const confirm = await p.confirm({
|
|
34
|
+
message: `Warning: ${SCHEMA_PATH} already exists. Overwrite?`,
|
|
35
|
+
initialValue: false,
|
|
36
|
+
});
|
|
37
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
38
|
+
p.cancel('Introspect cancelled.');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// File doesn't exist, that's fine
|
|
45
|
+
}
|
|
46
|
+
console.warn('Introspecting database using drizzle-kit...');
|
|
47
|
+
try {
|
|
48
|
+
execSync('npx drizzle-kit introspect', {
|
|
49
|
+
cwd,
|
|
50
|
+
stdio: 'inherit',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error.code === 'ENOENT') {
|
|
55
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=db-introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-introspect.js","sourceRoot":"","sources":["../../src/commands/db-introspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAOpC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAA+B,EAAE;IAClE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEvD,+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,OAAO,CAAC,IAAI,CAAC,iBAAiB,OAAO,cAAc,CAAC,CAAC;IAErD,uCAAuC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;gBAC9B,OAAO,EAAE,YAAY,WAAW,6BAA6B;gBAC7D,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;YAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,QAAQ,CAAC,4BAA4B,EAAE;YACrC,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,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:migrate command
|
|
3
|
+
*
|
|
4
|
+
* Applies pending migrations by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit migrate command
|
|
9
|
+
*/
|
|
10
|
+
export interface DbMigrateOptions {
|
|
11
|
+
cwd?: string;
|
|
12
|
+
dryRun?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function dbMigrate(options?: DbMigrateOptions): Promise<void>;
|
|
15
|
+
//# 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;;;;;;;;GAQG;AAKH,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,CAiC7E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:migrate command
|
|
3
|
+
*
|
|
4
|
+
* Applies pending migrations by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit migrate command
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { verifySchemaPath, SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
12
|
+
export async function dbMigrate(options = {}) {
|
|
13
|
+
const { cwd = process.cwd(), dryRun = false } = options;
|
|
14
|
+
// Verify schema file exists
|
|
15
|
+
try {
|
|
16
|
+
await verifySchemaPath();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error(`db:migrate requires ${SCHEMA_PATH} to exist.\n` +
|
|
20
|
+
`Please create this file and export your Drizzle tables.`);
|
|
21
|
+
}
|
|
22
|
+
console.warn('Applying migrations using drizzle-kit...');
|
|
23
|
+
// Build the command
|
|
24
|
+
const args = ['drizzle-kit', 'migrate'];
|
|
25
|
+
if (dryRun) {
|
|
26
|
+
args.push('--dry-run');
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
execSync(`npx ${args.join(' ')}`, {
|
|
30
|
+
cwd,
|
|
31
|
+
stdio: 'inherit',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error.code === 'ENOENT') {
|
|
36
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=db-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-migrate.js","sourceRoot":"","sources":["../../src/commands/db-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA4B,EAAE;IAC5D,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAExD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uBAAuB,WAAW,cAAc;YAChD,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAEzD,oBAAoB;IACpB,MAAM,IAAI,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAExC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,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,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:push command
|
|
3
|
+
*
|
|
4
|
+
* Pushes schema changes directly to the database by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit push command
|
|
9
|
+
*/
|
|
10
|
+
export interface DbPushOptions {
|
|
11
|
+
force?: boolean;
|
|
12
|
+
cwd?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function dbPush(options?: DbPushOptions): Promise<void>;
|
|
15
|
+
//# 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;;;;;;;;GAQG;AAKH,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,CAiCvE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* db:push command
|
|
3
|
+
*
|
|
4
|
+
* Pushes schema changes directly to the database by spawning drizzle-kit CLI.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Verify schema exists at ./src/db/schema.ts
|
|
8
|
+
* 2. Spawn drizzle-kit push command
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { verifySchemaPath, SCHEMA_PATH } from '../utils/schema-loader.js';
|
|
12
|
+
export async function dbPush(options = {}) {
|
|
13
|
+
const { force = false, cwd = process.cwd() } = options;
|
|
14
|
+
// Verify schema file exists
|
|
15
|
+
try {
|
|
16
|
+
await verifySchemaPath();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error(`db:push requires ${SCHEMA_PATH} to exist.\n` +
|
|
20
|
+
`Please create this file and export your Drizzle tables.`);
|
|
21
|
+
}
|
|
22
|
+
console.warn('Pushing schema changes to database using drizzle-kit...');
|
|
23
|
+
// Build the command
|
|
24
|
+
const args = ['drizzle-kit', 'push'];
|
|
25
|
+
if (force) {
|
|
26
|
+
args.push('--force');
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
execSync(`npx ${args.join(' ')}`, {
|
|
30
|
+
cwd,
|
|
31
|
+
stdio: 'inherit',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error.code === 'ENOENT') {
|
|
36
|
+
throw new Error('drizzle-kit not found. Please install it: npm install drizzle-kit');
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# 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;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO1E,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAyB,EAAE;IACtD,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAEvD,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,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAExE,oBAAoB;IACpB,MAAM,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAErC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,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,MAAM,KAAK,CAAC;IACd,CAAC;AACH,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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
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
|
+
import { dbGenerate } from './db-generate.js';
|
|
12
|
+
import { dbMigrate } from './db-migrate.js';
|
|
13
|
+
import { dbPush } from './db-push.js';
|
|
14
|
+
import { dbStudio } from './db-studio.js';
|
|
15
|
+
import { dbIntrospect } from './db-introspect.js';
|
|
16
|
+
export async function runDbCommand(options) {
|
|
17
|
+
const { subcommand, args } = options;
|
|
18
|
+
switch (subcommand) {
|
|
19
|
+
case 'generate': {
|
|
20
|
+
const opts = parseDbGenerateArgs(args);
|
|
21
|
+
await dbGenerate(opts);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case 'migrate': {
|
|
25
|
+
const opts = parseDbMigrateArgs(args);
|
|
26
|
+
await dbMigrate(opts);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case 'push': {
|
|
30
|
+
const opts = parseDbPushArgs(args);
|
|
31
|
+
await dbPush(opts);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 'studio': {
|
|
35
|
+
const opts = parseDbStudioArgs(args);
|
|
36
|
+
await dbStudio(opts);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case 'introspect': {
|
|
40
|
+
const opts = parseDbIntrospectArgs(args);
|
|
41
|
+
await dbIntrospect(opts);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
default:
|
|
45
|
+
throw new Error(`Unknown db command: ${subcommand}\n` +
|
|
46
|
+
`Valid commands: generate, migrate, push, studio, introspect`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Argument parsers for each subcommand
|
|
50
|
+
function parseDbGenerateArgs(args) {
|
|
51
|
+
const opts = {};
|
|
52
|
+
for (let i = 0; i < args.length; i++) {
|
|
53
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
54
|
+
opts.cwd = args[++i];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return opts;
|
|
58
|
+
}
|
|
59
|
+
function parseDbMigrateArgs(args) {
|
|
60
|
+
const opts = {};
|
|
61
|
+
for (let i = 0; i < args.length; i++) {
|
|
62
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
63
|
+
opts.cwd = args[++i];
|
|
64
|
+
}
|
|
65
|
+
else if (args[i] === '--dry-run') {
|
|
66
|
+
opts.dryRun = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return opts;
|
|
70
|
+
}
|
|
71
|
+
function parseDbPushArgs(args) {
|
|
72
|
+
const opts = {};
|
|
73
|
+
for (let i = 0; i < args.length; i++) {
|
|
74
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
75
|
+
opts.cwd = args[++i];
|
|
76
|
+
}
|
|
77
|
+
else if (args[i] === '--force' || args[i] === '-f') {
|
|
78
|
+
opts.force = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return opts;
|
|
82
|
+
}
|
|
83
|
+
function parseDbStudioArgs(args) {
|
|
84
|
+
const opts = {};
|
|
85
|
+
for (let i = 0; i < args.length; i++) {
|
|
86
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
87
|
+
opts.cwd = args[++i];
|
|
88
|
+
}
|
|
89
|
+
else if (args[i] === '--port' && i + 1 < args.length) {
|
|
90
|
+
opts.port = parseInt(args[++i], 10);
|
|
91
|
+
}
|
|
92
|
+
else if (args[i] === '--host' && i + 1 < args.length) {
|
|
93
|
+
opts.host = args[++i];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return opts;
|
|
97
|
+
}
|
|
98
|
+
function parseDbIntrospectArgs(args) {
|
|
99
|
+
const opts = {};
|
|
100
|
+
for (let i = 0; i < args.length; i++) {
|
|
101
|
+
if (args[i] === '--cwd' && i + 1 < args.length) {
|
|
102
|
+
opts.cwd = args[++i];
|
|
103
|
+
}
|
|
104
|
+
else if (args[i] === '--force' || args[i] === '-f') {
|
|
105
|
+
opts.force = true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return opts;
|
|
109
|
+
}
|
|
110
|
+
export function showDbHelp() {
|
|
111
|
+
console.warn(`
|
|
112
|
+
Deesse DB Commands
|
|
113
|
+
|
|
114
|
+
Usage: npx deesse db:<command> [options]
|
|
115
|
+
|
|
116
|
+
Commands:
|
|
117
|
+
db:generate Generate migrations from schema changes
|
|
118
|
+
db:migrate Apply pending migrations to database
|
|
119
|
+
db:push Push schema changes directly (dev only)
|
|
120
|
+
db:studio Open Drizzle Studio (database browser)
|
|
121
|
+
db:introspect Introspect database and generate schema
|
|
122
|
+
|
|
123
|
+
Options:
|
|
124
|
+
|
|
125
|
+
db:generate
|
|
126
|
+
--cwd <path> Set working directory
|
|
127
|
+
|
|
128
|
+
db:migrate
|
|
129
|
+
--cwd <path> Set working directory
|
|
130
|
+
--dry-run Show what would be migrated without executing
|
|
131
|
+
|
|
132
|
+
db:push
|
|
133
|
+
--cwd <path> Set working directory
|
|
134
|
+
--force, -f Force push without confirmation
|
|
135
|
+
|
|
136
|
+
db:studio
|
|
137
|
+
--cwd <path> Set working directory
|
|
138
|
+
--port <port> Set studio port (default: 4983)
|
|
139
|
+
--host <host> Set studio host (default: 127.0.0.1)
|
|
140
|
+
|
|
141
|
+
db:introspect
|
|
142
|
+
--cwd <path> Set working directory
|
|
143
|
+
--force, -f Overwrite existing schema file
|
|
144
|
+
|
|
145
|
+
Examples:
|
|
146
|
+
npx deesse db:generate
|
|
147
|
+
npx deesse db:migrate --dry-run
|
|
148
|
+
npx deesse db:push --force
|
|
149
|
+
npx deesse db:studio --port 5000
|
|
150
|
+
npx deesse db:introspect --force
|
|
151
|
+
`);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import * as p from '@clack/prompts';
|
|
3
3
|
import { readFileSync } from 'node:fs';
|
|
4
4
|
import { execSync } from 'node:child_process';
|
|
5
|
+
import { runDbCommand, showDbHelp } from './commands/db.js';
|
|
5
6
|
const getVersion = () => {
|
|
6
7
|
try {
|
|
7
8
|
const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
|
@@ -12,22 +13,24 @@ const getVersion = () => {
|
|
|
12
13
|
}
|
|
13
14
|
};
|
|
14
15
|
const showHelp = () => {
|
|
15
|
-
console.
|
|
16
|
-
DeesseJS CLI v${getVersion()}
|
|
17
|
-
|
|
18
|
-
Usage: npx deesse <command>
|
|
19
|
-
|
|
20
|
-
Commands:
|
|
21
|
-
help Show this help message
|
|
22
|
-
init Initialize a new DeesseJS project in current directory
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
npx deesse
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
16
|
+
console.warn(`
|
|
17
|
+
DeesseJS CLI v${getVersion()}
|
|
18
|
+
|
|
19
|
+
Usage: npx deesse <command>
|
|
20
|
+
|
|
21
|
+
Commands:
|
|
22
|
+
help Show this help message
|
|
23
|
+
init Initialize a new DeesseJS project in current directory
|
|
24
|
+
db Database management commands (db:generate, db:push, etc.)
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
npx deesse help
|
|
28
|
+
npx deesse init
|
|
29
|
+
npx deesse db:generate
|
|
30
|
+
npx deesse db:push --force
|
|
31
|
+
npx deesse db:studio
|
|
32
|
+
|
|
33
|
+
For more information, visit: https://github.com/nesalia-inc/deessejs
|
|
31
34
|
`);
|
|
32
35
|
};
|
|
33
36
|
const runInit = async () => {
|
|
@@ -56,6 +59,30 @@ const runInit = async () => {
|
|
|
56
59
|
async function main() {
|
|
57
60
|
const args = process.argv.slice(2);
|
|
58
61
|
const command = args[0] || 'help';
|
|
62
|
+
// Handle db:* commands
|
|
63
|
+
if (command.startsWith('db:')) {
|
|
64
|
+
const subcommand = command.slice(3); // Remove 'db:' prefix
|
|
65
|
+
if (!subcommand) {
|
|
66
|
+
showDbHelp();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Special case: 'db help' or 'db --help'
|
|
70
|
+
if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
|
|
71
|
+
showDbHelp();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await runDbCommand({
|
|
76
|
+
subcommand,
|
|
77
|
+
args: args.slice(1), // Pass all args including the subcommand
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(`Error: ${error.message}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
59
86
|
switch (command) {
|
|
60
87
|
case 'help':
|
|
61
88
|
case '--help':
|
|
@@ -66,8 +93,8 @@ async function main() {
|
|
|
66
93
|
await runInit();
|
|
67
94
|
break;
|
|
68
95
|
default:
|
|
69
|
-
console.
|
|
70
|
-
console.
|
|
96
|
+
console.error(`Unknown command: ${command}`);
|
|
97
|
+
console.error('Run "npx deesse help" for usage information.');
|
|
71
98
|
process.exit(1);
|
|
72
99
|
}
|
|
73
100
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config loader utility
|
|
3
|
+
*
|
|
4
|
+
* Dynamically imports the user's deesse.config.ts to get the database instance.
|
|
5
|
+
*/
|
|
6
|
+
export interface DeesseConfig {
|
|
7
|
+
database: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface LoadedConfig {
|
|
10
|
+
config: DeesseConfig;
|
|
11
|
+
configPath: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function loadConfig(): Promise<LoadedConfig>;
|
|
14
|
+
export declare function verifyConfigPath(): Promise<string>;
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,CAoCxD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAaxD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config loader utility
|
|
3
|
+
*
|
|
4
|
+
* Dynamically imports the user's deesse.config.ts to get the database instance.
|
|
5
|
+
*/
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import * as url from 'node:url';
|
|
8
|
+
const CONFIG_PATH = './src/deesse.config.ts';
|
|
9
|
+
export async function loadConfig() {
|
|
10
|
+
const configPath = path.resolve(process.cwd(), CONFIG_PATH);
|
|
11
|
+
// Try to load the config file
|
|
12
|
+
let configModule;
|
|
13
|
+
try {
|
|
14
|
+
configModule = await import(url.pathToFileURL(configPath).href);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code === 'ENOENT') {
|
|
18
|
+
throw new Error(`Config file not found: ${CONFIG_PATH}\n` +
|
|
19
|
+
`Please create this file with your database configuration.`);
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
// Handle both named export and default export patterns
|
|
24
|
+
const config = configModule.config ?? configModule.default?.config;
|
|
25
|
+
if (!config) {
|
|
26
|
+
throw new Error(`Config file ${CONFIG_PATH} does not export a 'config' object.\n` +
|
|
27
|
+
`Please ensure your config file contains: export const config = defineConfig({ ... })`);
|
|
28
|
+
}
|
|
29
|
+
if (!config.database) {
|
|
30
|
+
throw new Error(`Config does not have a 'database' property.\n` +
|
|
31
|
+
`Please add a database configuration using drizzle().`);
|
|
32
|
+
}
|
|
33
|
+
return { config, configPath };
|
|
34
|
+
}
|
|
35
|
+
export async function verifyConfigPath() {
|
|
36
|
+
const { stat } = await import('node:fs/promises');
|
|
37
|
+
const configPath = path.resolve(process.cwd(), CONFIG_PATH);
|
|
38
|
+
try {
|
|
39
|
+
await stat(configPath);
|
|
40
|
+
return configPath;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(`Config file not found: ${CONFIG_PATH}\n` +
|
|
44
|
+
`Please create this file with your database configuration.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAWhC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5D,8BAA8B;IAC9B,IAAI,YAA4E,CAAC;IAEjF,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,0BAA0B,WAAW,IAAI;gBACzC,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,uDAAuD;IACvD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;IAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,eAAe,WAAW,uCAAuC;YACjE,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,+CAA+C;YAC/C,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,0BAA0B,WAAW,IAAI;YACzC,2DAA2D,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialect detection utility
|
|
3
|
+
*
|
|
4
|
+
* Detects the database dialect from a Drizzle database instance.
|
|
5
|
+
* Supports PostgreSQL, MySQL, and SQLite.
|
|
6
|
+
*/
|
|
7
|
+
export type Dialect = 'postgresql' | 'mysql' | 'sqlite';
|
|
8
|
+
/**
|
|
9
|
+
* Detect the database dialect from a Drizzle database instance
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectDialect(db: unknown): Dialect;
|
|
12
|
+
/**
|
|
13
|
+
* Get connection credentials from a database instance
|
|
14
|
+
*/
|
|
15
|
+
export interface ConnectionCredentials {
|
|
16
|
+
host: string;
|
|
17
|
+
port: number;
|
|
18
|
+
user: string;
|
|
19
|
+
password: string;
|
|
20
|
+
database: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function getConnectionCredentials(db: unknown): ConnectionCredentials;
|
|
23
|
+
//# sourceMappingURL=dialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/utils/dialect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CA6ClD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,OAAO,GAAG,qBAAqB,CA6C3E"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialect detection utility
|
|
3
|
+
*
|
|
4
|
+
* Detects the database dialect from a Drizzle database instance.
|
|
5
|
+
* Supports PostgreSQL, MySQL, and SQLite.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Detect the database dialect from a Drizzle database instance
|
|
9
|
+
*/
|
|
10
|
+
export function detectDialect(db) {
|
|
11
|
+
if (!db || typeof db !== 'object') {
|
|
12
|
+
throw new Error('Invalid database instance');
|
|
13
|
+
}
|
|
14
|
+
const dbObj = db;
|
|
15
|
+
const client = dbObj['$client'];
|
|
16
|
+
if (!client) {
|
|
17
|
+
throw new Error('Invalid database instance: no $client');
|
|
18
|
+
}
|
|
19
|
+
// For pg Pool - has query method
|
|
20
|
+
if (client['query'] !== undefined &&
|
|
21
|
+
typeof client['query'] === 'function') {
|
|
22
|
+
return 'postgresql';
|
|
23
|
+
}
|
|
24
|
+
// For postgres-js client - has options
|
|
25
|
+
if (client['options'] !== undefined) {
|
|
26
|
+
return 'postgresql';
|
|
27
|
+
}
|
|
28
|
+
// For mysql2 - has connection
|
|
29
|
+
if (client['connection'] !== undefined &&
|
|
30
|
+
client['query'] === undefined) {
|
|
31
|
+
return 'mysql';
|
|
32
|
+
}
|
|
33
|
+
// For SQLite (better-sqlite3 or libsql)
|
|
34
|
+
if (client['name'] === 'sqlite' ||
|
|
35
|
+
client['open'] !== undefined) {
|
|
36
|
+
return 'sqlite';
|
|
37
|
+
}
|
|
38
|
+
// Default to PostgreSQL as it's the most common
|
|
39
|
+
return 'postgresql';
|
|
40
|
+
}
|
|
41
|
+
export function getConnectionCredentials(db) {
|
|
42
|
+
const dbObj = db;
|
|
43
|
+
const client = dbObj['$client'];
|
|
44
|
+
if (!client) {
|
|
45
|
+
throw new Error('Cannot extract connection credentials: database instance has no $client');
|
|
46
|
+
}
|
|
47
|
+
// For pg Pool - has connectionParameters
|
|
48
|
+
if (client['connectionParameters']) {
|
|
49
|
+
const params = client['connectionParameters'];
|
|
50
|
+
return {
|
|
51
|
+
host: String(params['host'] ?? 'localhost'),
|
|
52
|
+
port: Number(params['port'] ?? 5432),
|
|
53
|
+
user: String(params['user'] ?? 'postgres'),
|
|
54
|
+
password: String(params['password'] ?? ''),
|
|
55
|
+
database: String(params['database'] ?? 'postgres'),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// For postgres-js
|
|
59
|
+
if (client['options']) {
|
|
60
|
+
const options = client['options'];
|
|
61
|
+
return {
|
|
62
|
+
host: String(options['host'] ?? 'localhost'),
|
|
63
|
+
port: Number(options['port'] ?? 5432),
|
|
64
|
+
user: String(options['user'] ?? 'postgres'),
|
|
65
|
+
password: String(options['password'] ?? ''),
|
|
66
|
+
database: String(options['database'] ?? 'postgres'),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// For mysql2
|
|
70
|
+
if (client['connection']) {
|
|
71
|
+
const conn = client['connection'];
|
|
72
|
+
return {
|
|
73
|
+
host: String(conn['host'] ?? 'localhost'),
|
|
74
|
+
port: Number(conn['port'] ?? 3306),
|
|
75
|
+
user: String(conn['user'] ?? 'root'),
|
|
76
|
+
password: String(conn['password'] ?? ''),
|
|
77
|
+
database: String(conn['database'] ?? 'mysql'),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
throw new Error('Cannot determine connection credentials from database client');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=dialect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.js","sourceRoot":"","sources":["../../src/utils/dialect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema generator utility
|
|
3
|
+
*
|
|
4
|
+
* Converts introspected database schema JSON to TypeScript code.
|
|
5
|
+
* This is used by db:introspect to generate a schema.ts file.
|
|
6
|
+
*/
|
|
7
|
+
import type { Dialect } from './dialect.js';
|
|
8
|
+
interface IntrospectedTable {
|
|
9
|
+
name: string;
|
|
10
|
+
schema?: string;
|
|
11
|
+
columns: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
type: string;
|
|
14
|
+
isNullable: boolean;
|
|
15
|
+
isArray?: boolean;
|
|
16
|
+
default?: string | null;
|
|
17
|
+
primaryKey?: boolean;
|
|
18
|
+
unique?: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare function generateSchema(schema: {
|
|
22
|
+
tables?: IntrospectedTable[];
|
|
23
|
+
}, dialect: Dialect): string;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=schema-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.d.ts","sourceRoot":"","sources":["../../src/utils/schema-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AA6JD,wBAAgB,cAAc,CAC5B,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAA;CAAE,EACxC,OAAO,EAAE,OAAO,GACf,MAAM,CAiCR"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema generator utility
|
|
3
|
+
*
|
|
4
|
+
* Converts introspected database schema JSON to TypeScript code.
|
|
5
|
+
* This is used by db:introspect to generate a schema.ts file.
|
|
6
|
+
*/
|
|
7
|
+
// Mapping of PostgreSQL column types to Drizzle column types
|
|
8
|
+
const PG_TYPE_TO_DRIZZLE = {
|
|
9
|
+
// Numeric types
|
|
10
|
+
'integer': 'integer',
|
|
11
|
+
'bigint': 'bigint',
|
|
12
|
+
'smallint': 'smallint',
|
|
13
|
+
'numeric': 'numeric',
|
|
14
|
+
'decimal': 'decimal',
|
|
15
|
+
'real': 'real',
|
|
16
|
+
'double precision': 'doublePrecision',
|
|
17
|
+
'serial': 'serial',
|
|
18
|
+
'bigserial': 'bigserial',
|
|
19
|
+
'smallserial': 'smallserial',
|
|
20
|
+
// Character types
|
|
21
|
+
'character varying': 'varchar',
|
|
22
|
+
'varchar': 'varchar',
|
|
23
|
+
'character': 'char',
|
|
24
|
+
'char': 'char',
|
|
25
|
+
'text': 'text',
|
|
26
|
+
// Date/time types
|
|
27
|
+
'timestamp': 'timestamp',
|
|
28
|
+
'timestamp without time zone': 'timestamp',
|
|
29
|
+
'timestamp with time zone': 'timestamp',
|
|
30
|
+
'date': 'date',
|
|
31
|
+
'time': 'time',
|
|
32
|
+
'time without time zone': 'time',
|
|
33
|
+
'time with time zone': 'time',
|
|
34
|
+
'interval': 'interval',
|
|
35
|
+
// Boolean
|
|
36
|
+
'boolean': 'boolean',
|
|
37
|
+
// UUID
|
|
38
|
+
'uuid': 'uuid',
|
|
39
|
+
// JSON types
|
|
40
|
+
'json': 'json',
|
|
41
|
+
'jsonb': 'jsonb',
|
|
42
|
+
// Binary
|
|
43
|
+
'bytea': 'bytea',
|
|
44
|
+
// Array types (simplified)
|
|
45
|
+
'array': 'array',
|
|
46
|
+
// Network types
|
|
47
|
+
'inet': 'inet',
|
|
48
|
+
'cidr': 'cidr',
|
|
49
|
+
'macaddr': 'macaddr',
|
|
50
|
+
'macaddr8': 'macaddr8',
|
|
51
|
+
// Other
|
|
52
|
+
'money': 'money',
|
|
53
|
+
'bit': 'bit',
|
|
54
|
+
'bit varying': 'varbit',
|
|
55
|
+
'xml': 'xml',
|
|
56
|
+
'point': 'point',
|
|
57
|
+
'line': 'line',
|
|
58
|
+
'lseg': 'lseg',
|
|
59
|
+
'box': 'box',
|
|
60
|
+
'path': 'path',
|
|
61
|
+
'polygon': 'polygon',
|
|
62
|
+
'circle': 'circle',
|
|
63
|
+
};
|
|
64
|
+
function mapColumnType(pgType, isArray) {
|
|
65
|
+
let drizzleType = PG_TYPE_TO_DRIZZLE[pgType.toLowerCase()];
|
|
66
|
+
if (!drizzleType) {
|
|
67
|
+
// For unknown types, use a placeholder or the original type
|
|
68
|
+
console.warn(`Unknown PostgreSQL type: ${pgType}, using 'text' as fallback`);
|
|
69
|
+
drizzleType = 'text';
|
|
70
|
+
}
|
|
71
|
+
if (isArray) {
|
|
72
|
+
return `(${drizzleType}())`;
|
|
73
|
+
}
|
|
74
|
+
return drizzleType;
|
|
75
|
+
}
|
|
76
|
+
function generateColumn(column) {
|
|
77
|
+
const { name, type, isNullable, isArray, default: defaultValue, primaryKey, unique } = column;
|
|
78
|
+
const columnName = name.includes(' ') || name.includes('-')
|
|
79
|
+
? `"${name}"`
|
|
80
|
+
: `'${name}'`;
|
|
81
|
+
let line = ` ${name.includes(' ') || name.includes('-') ? `"${name}"` : name}: ${mapColumnType(type, isArray ?? false)}(${columnName})`;
|
|
82
|
+
if (!isNullable) {
|
|
83
|
+
line += '.notNull()';
|
|
84
|
+
}
|
|
85
|
+
if (defaultValue !== undefined && defaultValue !== null) {
|
|
86
|
+
// Handle different default value formats
|
|
87
|
+
if (defaultValue === 'now()' || defaultValue === 'CURRENT_TIMESTAMP') {
|
|
88
|
+
line += '.defaultNow()';
|
|
89
|
+
}
|
|
90
|
+
else if (defaultValue === 'true' || defaultValue === 'false') {
|
|
91
|
+
line += `.default(${defaultValue})`;
|
|
92
|
+
}
|
|
93
|
+
else if (!isNaN(Number(defaultValue))) {
|
|
94
|
+
line += `.default(${defaultValue})`;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
line += `.default('${String(defaultValue).replace(/'/g, "\\'")}')`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (primaryKey) {
|
|
101
|
+
line += '.primaryKey()';
|
|
102
|
+
}
|
|
103
|
+
if (unique && !primaryKey) {
|
|
104
|
+
line += '.unique()';
|
|
105
|
+
}
|
|
106
|
+
return line;
|
|
107
|
+
}
|
|
108
|
+
function generateTable(table) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
// Determine table reference based on dialect
|
|
111
|
+
const tableRef = 'pgTable';
|
|
112
|
+
const importStatement = "import { pgTable } from 'drizzle-orm/pg-core';";
|
|
113
|
+
lines.push(importStatement);
|
|
114
|
+
lines.push('');
|
|
115
|
+
const tableName = table.name.includes(' ') || table.name.includes('-')
|
|
116
|
+
? `"${table.name}"`
|
|
117
|
+
: `'${table.name}'`;
|
|
118
|
+
lines.push(`export const ${table.name} = ${tableRef}(${tableName}, {`);
|
|
119
|
+
lines.push(' columns: {');
|
|
120
|
+
for (const column of table.columns) {
|
|
121
|
+
lines.push(generateColumn(column) + ',');
|
|
122
|
+
}
|
|
123
|
+
lines.push(' },');
|
|
124
|
+
lines.push('});');
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
export function generateSchema(schema, dialect) {
|
|
128
|
+
const lines = [];
|
|
129
|
+
// Add header
|
|
130
|
+
lines.push('/**');
|
|
131
|
+
lines.push(' * Auto-generated schema file');
|
|
132
|
+
lines.push(` * Dialect: ${dialect}`);
|
|
133
|
+
lines.push(` * Generated at: ${new Date().toISOString()}`);
|
|
134
|
+
lines.push(' */');
|
|
135
|
+
lines.push('');
|
|
136
|
+
// Add import
|
|
137
|
+
if (dialect === 'postgresql') {
|
|
138
|
+
lines.push("import { pgTable, text, integer, timestamp, boolean, uuid, jsonb, varchar } from 'drizzle-orm/pg-core';");
|
|
139
|
+
}
|
|
140
|
+
else if (dialect === 'mysql') {
|
|
141
|
+
lines.push("import { mysqlTable, text, int, timestamp, boolean, varchar } from 'drizzle-orm/mysql-core';");
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
lines.push("import { sqliteTable, text, integer, real } from 'drizzle-orm/sqlite-core';");
|
|
145
|
+
}
|
|
146
|
+
lines.push('');
|
|
147
|
+
// Generate tables
|
|
148
|
+
const tables = schema.tables ?? [];
|
|
149
|
+
for (let i = 0; i < tables.length; i++) {
|
|
150
|
+
lines.push(generateTable(tables[i]));
|
|
151
|
+
if (i < tables.length - 1) {
|
|
152
|
+
lines.push('');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return lines.join('\n');
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=schema-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.js","sourceRoot":"","sources":["../../src/utils/schema-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema loader utility
|
|
3
|
+
*
|
|
4
|
+
* Dynamically imports the user's schema from ./src/db/schema.ts
|
|
5
|
+
* This is required because drizzle-kit's programmatic API takes schema objects,
|
|
6
|
+
* not file paths.
|
|
7
|
+
*/
|
|
8
|
+
declare const SCHEMA_PATH = "./src/db/schema.ts";
|
|
9
|
+
export { SCHEMA_PATH };
|
|
10
|
+
export interface SchemaLoaderResult {
|
|
11
|
+
schema: Record<string, unknown>;
|
|
12
|
+
schemaPath: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function loadSchema(): Promise<SchemaLoaderResult>;
|
|
15
|
+
export declare function verifySchemaPath(): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=schema-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.d.ts","sourceRoot":"","sources":["../../src/utils/schema-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,QAAA,MAAM,WAAW,uBAAuB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC,CA2B9D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAaxD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema loader utility
|
|
3
|
+
*
|
|
4
|
+
* Dynamically imports the user's schema from ./src/db/schema.ts
|
|
5
|
+
* This is required because drizzle-kit's programmatic API takes schema objects,
|
|
6
|
+
* not file paths.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as url from 'node:url';
|
|
10
|
+
const SCHEMA_PATH = './src/db/schema.ts';
|
|
11
|
+
export { SCHEMA_PATH };
|
|
12
|
+
export async function loadSchema() {
|
|
13
|
+
const schemaPath = path.resolve(process.cwd(), SCHEMA_PATH);
|
|
14
|
+
// Dynamic import of the schema file
|
|
15
|
+
// This works because the user's tsconfig.json has @deesse-config alias
|
|
16
|
+
// and schema is at ./src/db/schema.ts
|
|
17
|
+
const schemaModule = await import(url.pathToFileURL(schemaPath).href);
|
|
18
|
+
// Extract all exports that are schema objects (tables, etc.)
|
|
19
|
+
const schema = {};
|
|
20
|
+
for (const [key, value] of Object.entries(schemaModule)) {
|
|
21
|
+
// Skip non-schema exports (like imports, types, etc.)
|
|
22
|
+
if (key === '__esModule' || key === 'default')
|
|
23
|
+
continue;
|
|
24
|
+
if (typeof value !== 'object' && typeof value !== 'function')
|
|
25
|
+
continue;
|
|
26
|
+
schema[key] = value;
|
|
27
|
+
}
|
|
28
|
+
if (Object.keys(schema).length === 0) {
|
|
29
|
+
throw new Error(`No schema objects found in ${SCHEMA_PATH}. ` +
|
|
30
|
+
`Please export your Drizzle tables from this file.`);
|
|
31
|
+
}
|
|
32
|
+
return { schema, schemaPath };
|
|
33
|
+
}
|
|
34
|
+
export async function verifySchemaPath() {
|
|
35
|
+
const { stat } = await import('node:fs/promises');
|
|
36
|
+
const schemaPath = path.resolve(process.cwd(), SCHEMA_PATH);
|
|
37
|
+
try {
|
|
38
|
+
await stat(schemaPath);
|
|
39
|
+
return schemaPath;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error(`Schema file not found: ${SCHEMA_PATH}\n` +
|
|
43
|
+
`Please create this file and export your Drizzle tables.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=schema-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.js","sourceRoot":"","sources":["../../src/utils/schema-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,CAAC;AAOvB,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5D,oCAAoC;IACpC,uEAAuE;IACvE,sCAAsC;IACtC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtE,6DAA6D;IAC7D,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,sDAAsD;QACtD,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU;YAAE,SAAS;QAEvE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,8BAA8B,WAAW,IAAI;YAC7C,mDAAmD,CACpD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,0BAA0B,WAAW,IAAI;YACzC,yDAAyD,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deessejs/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "DeesseJS CLI for managing DeesseJS projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,14 +16,6 @@
|
|
|
16
16
|
"bin",
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
|
-
"scripts": {
|
|
20
|
-
"dev": "tsc --watch",
|
|
21
|
-
"build": "tsc",
|
|
22
|
-
"type-check": "tsc --noEmit",
|
|
23
|
-
"lint": "eslint src",
|
|
24
|
-
"lint:fix": "eslint src --fix",
|
|
25
|
-
"clean": "rm -rf dist"
|
|
26
|
-
},
|
|
27
19
|
"keywords": [
|
|
28
20
|
"cli",
|
|
29
21
|
"deessejs",
|
|
@@ -40,5 +32,13 @@
|
|
|
40
32
|
},
|
|
41
33
|
"engines": {
|
|
42
34
|
"node": ">=18.0.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"dev": "tsc --watch",
|
|
38
|
+
"build": "tsc",
|
|
39
|
+
"type-check": "tsc --noEmit",
|
|
40
|
+
"lint": "eslint src",
|
|
41
|
+
"lint:fix": "eslint src --fix",
|
|
42
|
+
"clean": "rm -rf dist"
|
|
43
43
|
}
|
|
44
|
-
}
|
|
44
|
+
}
|