db-ai 1.0.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/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # db-ai
2
+
3
+ A package to allow AI to access databases with ease using Prisma.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install db-ai
9
+ ```
10
+
11
+ Make sure to install the required database driver for your database provider:
12
+
13
+ - **PostgreSQL**: `npm install pg`
14
+ - **MySQL**: `npm install mysql2`
15
+ - **SQLite**: `npm install better-sqlite3`
16
+ - **SQL Server**: `npm install @prisma/adapter-sqlserver`
17
+
18
+ Note: `@prisma/client` is already included as a dependency and works with all database providers.
19
+
20
+ ## Quick Start
21
+
22
+ ### 1. Initialize
23
+
24
+ Run the init command to create the configuration folder:
25
+
26
+ ```bash
27
+ db-ai init
28
+ ```
29
+
30
+ This creates a `.db-ai` folder with:
31
+ - `dbConfig.json` - Database configuration file
32
+ - `instructions.md` - Reference guide for AI
33
+ - `Script1.ts` - Template script for running queries
34
+
35
+ ### 2. Configure Database
36
+
37
+ Edit `.db-ai/dbConfig.json` with your database credentials:
38
+
39
+ ```json
40
+ {
41
+ "provider": "postgresql",
42
+ "host": "localhost",
43
+ "port": 5432,
44
+ "user": "your_username",
45
+ "password": "your_password",
46
+ "database": "your_database",
47
+ "OPERATIONS_ALLOWED": ["SELECT"],
48
+ "outputFileName": "output.txt"
49
+ }
50
+ ```
51
+
52
+ **Configuration Fields:**
53
+ - `provider`: Database type (postgresql, mysql, sqlite, sqlserver, etc.)
54
+ - `host`: Database host
55
+ - `port`: Database port
56
+ - `user`: Database username
57
+ - `password`: Database password
58
+ - `database`: Database name
59
+ - `OPERATIONS_ALLOWED`: Array of allowed SQL operations (default: `["SELECT"]`)
60
+ - `outputFileName`: Optional file name for logging query results with timestamps
61
+
62
+ **Note**: Make sure to install the required database driver package for your database provider (e.g., `pg` for PostgreSQL, `mysql2` for MySQL, `better-sqlite3` for SQLite, `@prisma/adapter-sqlserver` for SQL Server).
63
+
64
+ ### 3. Pull Database Schema
65
+
66
+ Run the start command to introspect your database and generate the schema:
67
+
68
+ ```bash
69
+ db-ai start
70
+ ```
71
+
72
+ This will:
73
+ - Create `schema.prisma` file in `.db-ai/` folder
74
+ - Pull the database schema using Prisma introspection
75
+ - Generate Prisma Client
76
+
77
+ ### 4. Run Queries
78
+
79
+ You can run SQL queries in two ways:
80
+
81
+ #### Direct SQL Query
82
+
83
+ ```bash
84
+ db-ai run --sql "SELECT * FROM users LIMIT 10"
85
+ ```
86
+
87
+ #### TypeScript File
88
+
89
+ ```bash
90
+ db-ai run --file Script1.ts
91
+ ```
92
+
93
+ Or with a relative path:
94
+
95
+ ```bash
96
+ db-ai run --file .db-ai/Script1.ts
97
+ ```
98
+
99
+ ## Usage in TypeScript Files
100
+
101
+ You can create TypeScript files to run SQL queries. Import the query functions:
102
+
103
+ ```typescript
104
+ import { executeQuery, executeAndPrint } from 'db-ai/dist/core/queryExecutor';
105
+
106
+ async function main() {
107
+ // Execute query and get result
108
+ const result = await executeQuery("SELECT * FROM users LIMIT 10");
109
+ console.log(result.data);
110
+
111
+ // Execute query and print result
112
+ await executeAndPrint("SELECT COUNT(*) FROM users");
113
+ }
114
+
115
+ main();
116
+ ```
117
+
118
+ ## Available Functions
119
+
120
+ ### `executeQuery(sql: string)`
121
+
122
+ Executes a SQL query and returns the result.
123
+
124
+ - **Parameters**: `sql` - SQL query string
125
+ - **Returns**: `QueryResult` object with `data`, `timestamp`, and `query` fields
126
+
127
+ ### `executeAndPrint(sql: string)`
128
+
129
+ Executes a SQL query, returns the result, and prints it to the console.
130
+
131
+ - **Parameters**: `sql` - SQL query string
132
+ - **Returns**: `QueryResult` object with `data`, `timestamp`, and `query` fields
133
+
134
+ ## Security
135
+
136
+ The package validates SQL operations against the `OPERATIONS_ALLOWED` array in the configuration. By default, only `SELECT` operations are allowed. To allow other operations, update `OPERATIONS_ALLOWED` in `dbConfig.json`:
137
+
138
+ ```json
139
+ {
140
+ "OPERATIONS_ALLOWED": ["SELECT", "INSERT", "UPDATE"]
141
+ }
142
+ ```
143
+
144
+ ## Output Logging
145
+
146
+ If `outputFileName` is specified in `dbConfig.json`, all query results are automatically appended to that file with timestamps. The file is created in the `.db-ai/` folder.
147
+
148
+ ## Schema File
149
+
150
+ The database schema is stored in `.db-ai/schema.prisma`. This file contains the up-to-date database structure and is updated when you run `db-ai start`.
151
+
152
+ ## License
153
+
154
+ MIT
155
+
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,kBAsGhC"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.initCommand = initCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const config_1 = require("../core/config");
44
+ const TEMPLATES_DIR = path.join(__dirname, '../templates');
45
+ async function initCommand() {
46
+ const configDir = (0, config_1.getConfigDir)();
47
+ try {
48
+ // Create .db-ai directory
49
+ if (!fs.existsSync(configDir)) {
50
+ fs.mkdirSync(configDir, { recursive: true });
51
+ console.log(chalk_1.default.green(`✓ Created directory: ${configDir}`));
52
+ }
53
+ else {
54
+ console.log(chalk_1.default.yellow(`⚠ Directory already exists: ${configDir}`));
55
+ }
56
+ // Create dbConfig.json
57
+ const configPath = path.join(configDir, 'dbConfig.json');
58
+ if (!fs.existsSync(configPath)) {
59
+ const configTemplate = {
60
+ provider: "postgresql",
61
+ host: "localhost",
62
+ port: 5432,
63
+ user: "your_username",
64
+ password: "your_password",
65
+ database: "your_database",
66
+ OPERATIONS_ALLOWED: ["SELECT"],
67
+ outputFileName: "output.txt"
68
+ };
69
+ const configContent = JSON.stringify(configTemplate, null, 2);
70
+ // Since JSON doesn't support comments, we'll write a note file instead
71
+ fs.writeFileSync(configPath, configContent, 'utf-8');
72
+ // Create a note file about provider
73
+ const notePath = path.join(configDir, 'CONFIG_NOTES.md');
74
+ const noteContent = `# Configuration Notes
75
+
76
+ ## Database Provider
77
+
78
+ The \`provider\` field in dbConfig.json specifies your database type:
79
+ - \`postgresql\` - PostgreSQL
80
+ - \`mysql\` - MySQL
81
+ - \`sqlite\` - SQLite
82
+ - \`sqlserver\` - SQL Server
83
+
84
+ **Important**: Make sure to install the required database driver package for your database provider:
85
+ - PostgreSQL: \`npm install pg\`
86
+ - MySQL: \`npm install mysql2\`
87
+ - SQLite: \`npm install better-sqlite3\`
88
+ - SQL Server: \`npm install @prisma/adapter-sqlserver\`
89
+
90
+ Note: \`@prisma/client\` is already included and works with all database providers.
91
+
92
+ ## OPERATIONS_ALLOWED
93
+
94
+ This array specifies which SQL operations are allowed:
95
+ - \`SELECT\` - Read queries
96
+ - \`INSERT\` - Insert operations
97
+ - \`UPDATE\` - Update operations
98
+ - \`DELETE\` - Delete operations
99
+ - \`CREATE\` - Create table/index operations
100
+ - \`DROP\` - Drop operations
101
+ - \`ALTER\` - Alter table operations
102
+
103
+ Default is \`["SELECT"]\` for safety.
104
+
105
+ ## outputFileName
106
+
107
+ If specified, all query results will be appended to this file with timestamps.
108
+ Leave empty or remove this field to disable file logging.
109
+ `;
110
+ fs.writeFileSync(notePath, noteContent, 'utf-8');
111
+ console.log(chalk_1.default.green(`✓ Created configuration file: ${configPath}`));
112
+ console.log(chalk_1.default.yellow(`⚠ Please update ${configPath} with your database credentials`));
113
+ }
114
+ else {
115
+ console.log(chalk_1.default.yellow(`⚠ Configuration file already exists: ${configPath}`));
116
+ }
117
+ // Copy instructions.md
118
+ const instructionsSource = path.join(TEMPLATES_DIR, 'instructions.md');
119
+ const instructionsDest = path.join(configDir, 'instructions.md');
120
+ if (fs.existsSync(instructionsSource)) {
121
+ fs.copyFileSync(instructionsSource, instructionsDest);
122
+ console.log(chalk_1.default.green(`✓ Created instructions.md`));
123
+ }
124
+ // Copy Script1.ts
125
+ const scriptSource = path.join(TEMPLATES_DIR, 'Script1.ts');
126
+ const scriptDest = path.join(configDir, 'Script1.ts');
127
+ if (fs.existsSync(scriptSource)) {
128
+ fs.copyFileSync(scriptSource, scriptDest);
129
+ console.log(chalk_1.default.green(`✓ Created Script1.ts`));
130
+ }
131
+ console.log(chalk_1.default.green('\n✓ Initialization complete!'));
132
+ console.log(chalk_1.default.cyan('\nNext steps:'));
133
+ console.log(chalk_1.default.cyan('1. Update .db-ai/dbConfig.json with your database credentials'));
134
+ console.log(chalk_1.default.cyan('2. Run "db-ai start" to pull your database schema'));
135
+ }
136
+ catch (error) {
137
+ console.error(chalk_1.default.red('Error during initialization:'), error.message);
138
+ process.exit(1);
139
+ }
140
+ }
141
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface RunOptions {
2
+ sql?: string;
3
+ file?: string;
4
+ }
5
+ export declare function runCommand(options: RunOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,iBA6CnD"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runCommand = runCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const child_process_1 = require("child_process");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const config_1 = require("../core/config");
45
+ const queryExecutor_1 = require("../core/queryExecutor");
46
+ async function runCommand(options) {
47
+ try {
48
+ if (!options.sql && !options.file) {
49
+ console.error(chalk_1.default.red('Error: Either --sql or --file option must be provided'));
50
+ console.log(chalk_1.default.yellow('Usage:'));
51
+ console.log(chalk_1.default.yellow(' db-ai run --sql "SELECT * FROM users"'));
52
+ console.log(chalk_1.default.yellow(' db-ai run --file Script1.ts'));
53
+ process.exit(1);
54
+ }
55
+ if (options.sql && options.file) {
56
+ console.error(chalk_1.default.red('Error: Cannot use both --sql and --file options at the same time'));
57
+ process.exit(1);
58
+ }
59
+ if (options.sql) {
60
+ // Execute SQL directly
61
+ console.log(chalk_1.default.blue('Executing SQL query...'));
62
+ const result = await (0, queryExecutor_1.executeAndPrint)(options.sql);
63
+ console.log(chalk_1.default.green('✓ Query executed successfully'));
64
+ }
65
+ else if (options.file) {
66
+ // Execute TypeScript file
67
+ const filePath = path.isAbsolute(options.file)
68
+ ? options.file
69
+ : path.join(process.cwd(), options.file);
70
+ if (!fs.existsSync(filePath)) {
71
+ // Try relative to config dir
72
+ const configDir = (0, config_1.getConfigDir)();
73
+ const altPath = path.join(configDir, options.file);
74
+ if (fs.existsSync(altPath)) {
75
+ await executeTypeScriptFile(altPath);
76
+ }
77
+ else {
78
+ console.error(chalk_1.default.red(`Error: File not found: ${filePath}`));
79
+ process.exit(1);
80
+ }
81
+ }
82
+ else {
83
+ await executeTypeScriptFile(filePath);
84
+ }
85
+ }
86
+ }
87
+ catch (error) {
88
+ console.error(chalk_1.default.red('Error executing query:'), error.message);
89
+ process.exit(1);
90
+ }
91
+ }
92
+ async function executeTypeScriptFile(filePath) {
93
+ console.log(chalk_1.default.blue(`Executing TypeScript file: ${filePath}`));
94
+ try {
95
+ // Use ts-node to execute the TypeScript file
96
+ const configDir = (0, config_1.getConfigDir)();
97
+ const fileDir = path.dirname(filePath);
98
+ const projectRoot = process.cwd();
99
+ const packageDistPath = path.join(projectRoot, 'dist');
100
+ // Set up NODE_PATH to include the dist folder and project root so imports work
101
+ // Also add node_modules so 'db-ai' package can be resolved
102
+ const nodePath = [
103
+ packageDistPath,
104
+ projectRoot,
105
+ path.join(projectRoot, 'node_modules'),
106
+ process.env.NODE_PATH || '',
107
+ ].filter(Boolean).join(path.delimiter);
108
+ // Also set up module resolution by creating a symlink or using the dist folder
109
+ // For local development, we'll make db-ai resolve to the dist folder
110
+ const dbAiModulePath = path.join(projectRoot, 'node_modules', 'db-ai');
111
+ if (!fs.existsSync(dbAiModulePath)) {
112
+ // Create a symlink to dist for local development
113
+ try {
114
+ fs.symlinkSync(path.join(projectRoot, 'dist'), dbAiModulePath, 'dir');
115
+ }
116
+ catch (error) {
117
+ // Symlink might already exist or fail, that's okay
118
+ }
119
+ }
120
+ // Execute with ts-node, using tsconfig that allows the imports
121
+ // Run from project root so config paths resolve correctly
122
+ (0, child_process_1.execSync)(`npx --yes ts-node --compiler-options '{"module":"commonjs","esModuleInterop":true}' "${filePath}"`, {
123
+ cwd: projectRoot,
124
+ stdio: 'inherit',
125
+ env: {
126
+ ...process.env,
127
+ NODE_PATH: nodePath,
128
+ },
129
+ });
130
+ console.log(chalk_1.default.green('✓ File executed successfully'));
131
+ }
132
+ catch (error) {
133
+ console.error(chalk_1.default.red('Error executing TypeScript file:'), error.message);
134
+ throw error;
135
+ }
136
+ }
137
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startCommand(): Promise<void>;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,kBA2EjC"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.startCommand = startCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const child_process_1 = require("child_process");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const config_1 = require("../core/config");
45
+ async function startCommand() {
46
+ try {
47
+ console.log(chalk_1.default.blue('Starting database introspection...'));
48
+ // Load configuration
49
+ const config = (0, config_1.loadConfig)();
50
+ const configDir = (0, config_1.getConfigDir)();
51
+ // Set DATABASE_URL environment variable
52
+ const connectionString = (0, config_1.getConnectionString)(config);
53
+ process.env.DATABASE_URL = connectionString;
54
+ // Create Prisma schema file
55
+ const schemaPath = path.join(configDir, 'schema.prisma');
56
+ const schemaContent = `// This file was auto-generated by db-ai
57
+ // It contains the database schema pulled from your database
58
+
59
+ generator client {
60
+ provider = "prisma-client-js"
61
+ output = "../node_modules/.prisma/client"
62
+ }
63
+
64
+ datasource db {
65
+ provider = "${config.provider}"
66
+ url = env("DATABASE_URL")
67
+ }
68
+ `;
69
+ fs.writeFileSync(schemaPath, schemaContent, 'utf-8');
70
+ console.log(chalk_1.default.green(`✓ Created schema.prisma at ${schemaPath}`));
71
+ // Run prisma db pull to introspect the database
72
+ console.log(chalk_1.default.blue('Pulling database schema...'));
73
+ try {
74
+ (0, child_process_1.execSync)('npx prisma db pull', {
75
+ cwd: configDir,
76
+ stdio: 'inherit',
77
+ env: {
78
+ ...process.env,
79
+ DATABASE_URL: connectionString,
80
+ },
81
+ });
82
+ console.log(chalk_1.default.green('✓ Database schema pulled successfully'));
83
+ }
84
+ catch (error) {
85
+ console.error(chalk_1.default.red('Error pulling database schema:'), error.message);
86
+ console.log(chalk_1.default.yellow('Make sure you have the correct database credentials and the database is accessible.'));
87
+ throw error;
88
+ }
89
+ // Generate Prisma Client
90
+ console.log(chalk_1.default.blue('Generating Prisma Client...'));
91
+ try {
92
+ (0, child_process_1.execSync)('npx prisma generate', {
93
+ cwd: configDir,
94
+ stdio: 'inherit',
95
+ env: {
96
+ ...process.env,
97
+ DATABASE_URL: connectionString,
98
+ },
99
+ });
100
+ console.log(chalk_1.default.green('✓ Prisma Client generated successfully'));
101
+ }
102
+ catch (error) {
103
+ console.error(chalk_1.default.red('Error generating Prisma Client:'), error.message);
104
+ throw error;
105
+ }
106
+ console.log(chalk_1.default.green('\n✓ Database introspection complete!'));
107
+ console.log(chalk_1.default.cyan(`\nSchema file: ${schemaPath}`));
108
+ console.log(chalk_1.default.cyan('You can now use "db-ai run" to execute queries.'));
109
+ }
110
+ catch (error) {
111
+ console.error(chalk_1.default.red('Error during database introspection:'), error.message);
112
+ process.exit(1);
113
+ }
114
+ }
115
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ type PrismaClient = any;
2
+ export interface DatabaseConfig {
3
+ provider: string;
4
+ host: string;
5
+ port: number;
6
+ user: string;
7
+ password: string;
8
+ database: string;
9
+ OPERATIONS_ALLOWED: string[];
10
+ outputFileName?: string;
11
+ }
12
+ export declare function getConfigPath(): string;
13
+ export declare function loadConfig(): DatabaseConfig;
14
+ export declare function validateConfig(config: DatabaseConfig): void;
15
+ export declare function getConnectionString(config: DatabaseConfig): string;
16
+ export declare function getPrismaClient(): PrismaClient;
17
+ export declare function getConfigDir(): string;
18
+ export {};
19
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,cAAc,CAc3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAoB3D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAiBlE;AAID,wBAAgB,eAAe,IAAI,YAAY,CAoC9C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getConfigPath = getConfigPath;
37
+ exports.loadConfig = loadConfig;
38
+ exports.validateConfig = validateConfig;
39
+ exports.getConnectionString = getConnectionString;
40
+ exports.getPrismaClient = getPrismaClient;
41
+ exports.getConfigDir = getConfigDir;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const CONFIG_DIR = '.db-ai';
45
+ const CONFIG_FILE = 'dbConfig.json';
46
+ function getConfigPath() {
47
+ return path.join(process.cwd(), CONFIG_DIR, CONFIG_FILE);
48
+ }
49
+ function loadConfig() {
50
+ const configPath = getConfigPath();
51
+ if (!fs.existsSync(configPath)) {
52
+ throw new Error(`Configuration file not found at ${configPath}. Please run 'db-ai init' first.`);
53
+ }
54
+ const configContent = fs.readFileSync(configPath, 'utf-8');
55
+ const config = JSON.parse(configContent);
56
+ validateConfig(config);
57
+ return config;
58
+ }
59
+ function validateConfig(config) {
60
+ const requiredFields = [
61
+ 'provider',
62
+ 'host',
63
+ 'port',
64
+ 'user',
65
+ 'password',
66
+ 'database',
67
+ 'OPERATIONS_ALLOWED',
68
+ ];
69
+ for (const field of requiredFields) {
70
+ if (config[field] === undefined || config[field] === null || config[field] === '') {
71
+ throw new Error(`Missing required field in config: ${field}`);
72
+ }
73
+ }
74
+ if (!Array.isArray(config.OPERATIONS_ALLOWED)) {
75
+ throw new Error('OPERATIONS_ALLOWED must be an array');
76
+ }
77
+ }
78
+ function getConnectionString(config) {
79
+ const { provider, host, port, user, password, database } = config;
80
+ switch (provider.toLowerCase()) {
81
+ case 'postgresql':
82
+ case 'postgres':
83
+ return `postgresql://${user}:${password}@${host}:${port}/${database}`;
84
+ case 'mysql':
85
+ return `mysql://${user}:${password}@${host}:${port}/${database}`;
86
+ case 'sqlite':
87
+ return `file:${database}`;
88
+ case 'sqlserver':
89
+ case 'mssql':
90
+ return `sqlserver://${host}:${port};database=${database};user=${user};password=${password}`;
91
+ default:
92
+ return `${provider}://${user}:${password}@${host}:${port}/${database}`;
93
+ }
94
+ }
95
+ let prismaClient = null;
96
+ function getPrismaClient() {
97
+ if (prismaClient) {
98
+ return prismaClient;
99
+ }
100
+ const config = loadConfig();
101
+ const connectionString = getConnectionString(config);
102
+ // Set DATABASE_URL for Prisma
103
+ process.env.DATABASE_URL = connectionString;
104
+ // Try to load Prisma Client from the user's project directory
105
+ // This allows the generated client to be used
106
+ const projectRoot = process.cwd();
107
+ let PrismaClientClass;
108
+ try {
109
+ // Try to load from user's project node_modules first
110
+ const userPrismaPath = path.join(projectRoot, 'node_modules', '@prisma', 'client');
111
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
112
+ PrismaClientClass = require(userPrismaPath).PrismaClient;
113
+ }
114
+ catch {
115
+ // Fall back to package's Prisma Client
116
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
117
+ PrismaClientClass = require('@prisma/client').PrismaClient;
118
+ }
119
+ prismaClient = new PrismaClientClass({
120
+ datasources: {
121
+ db: {
122
+ url: connectionString,
123
+ },
124
+ },
125
+ });
126
+ return prismaClient;
127
+ }
128
+ function getConfigDir() {
129
+ return path.join(process.cwd(), CONFIG_DIR);
130
+ }
131
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface QueryResult {
2
+ data: any;
3
+ timestamp: string;
4
+ query: string;
5
+ }
6
+ export declare function executeQuery(sql: string): Promise<QueryResult>;
7
+ export declare function executeAndPrint(sql: string): Promise<QueryResult>;
8
+ //# sourceMappingURL=queryExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryExecutor.d.ts","sourceRoot":"","sources":["../../src/core/queryExecutor.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAsJD,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqCpE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWvE"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.executeQuery = executeQuery;
40
+ exports.executeAndPrint = executeAndPrint;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ // @ts-ignore - json-stringify-safe doesn't have TypeScript types
44
+ const json_stringify_safe_1 = __importDefault(require("json-stringify-safe"));
45
+ const config_1 = require("./config");
46
+ function detectOperationType(sql) {
47
+ const trimmed = sql.trim().toUpperCase();
48
+ if (trimmed.startsWith('SELECT'))
49
+ return 'SELECT';
50
+ if (trimmed.startsWith('INSERT'))
51
+ return 'INSERT';
52
+ if (trimmed.startsWith('UPDATE'))
53
+ return 'UPDATE';
54
+ if (trimmed.startsWith('DELETE'))
55
+ return 'DELETE';
56
+ if (trimmed.startsWith('CREATE'))
57
+ return 'CREATE';
58
+ if (trimmed.startsWith('DROP'))
59
+ return 'DROP';
60
+ if (trimmed.startsWith('ALTER'))
61
+ return 'ALTER';
62
+ return 'UNKNOWN';
63
+ }
64
+ function validateOperation(sql) {
65
+ const config = (0, config_1.loadConfig)();
66
+ const operation = detectOperationType(sql);
67
+ if (!config.OPERATIONS_ALLOWED.includes(operation)) {
68
+ throw new Error(`Operation '${operation}' is not allowed. Allowed operations: ${config.OPERATIONS_ALLOWED.join(', ')}`);
69
+ }
70
+ }
71
+ // Helper function to handle special types during JSON serialization
72
+ function createReplacer() {
73
+ return (key, value) => {
74
+ // Handle BigInt
75
+ if (typeof value === 'bigint') {
76
+ return value.toString();
77
+ }
78
+ // Handle Date objects - convert to ISO string
79
+ if (value instanceof Date) {
80
+ return value.toISOString();
81
+ }
82
+ // Handle undefined - JSON.stringify omits it, but we can show it explicitly
83
+ if (value === undefined) {
84
+ return '[undefined]';
85
+ }
86
+ // Handle functions
87
+ if (typeof value === 'function') {
88
+ return `[Function: ${value.name || 'anonymous'}]`;
89
+ }
90
+ // Handle Symbol
91
+ if (typeof value === 'symbol') {
92
+ return value.toString();
93
+ }
94
+ // Handle Map
95
+ if (value instanceof Map) {
96
+ return Object.fromEntries(value);
97
+ }
98
+ // Handle Set
99
+ if (value instanceof Set) {
100
+ return Array.from(value);
101
+ }
102
+ // Handle RegExp
103
+ if (value instanceof RegExp) {
104
+ return value.toString();
105
+ }
106
+ // Handle Error objects
107
+ if (value instanceof Error) {
108
+ return {
109
+ name: value.name,
110
+ message: value.message,
111
+ stack: value.stack,
112
+ };
113
+ }
114
+ // Handle NaN and Infinity
115
+ if (typeof value === 'number') {
116
+ if (Number.isNaN(value)) {
117
+ return '[NaN]';
118
+ }
119
+ if (!Number.isFinite(value)) {
120
+ return value > 0 ? '[Infinity]' : '[-Infinity]';
121
+ }
122
+ }
123
+ // Handle Buffer (Node.js)
124
+ if (Buffer.isBuffer(value)) {
125
+ return value.toString('base64');
126
+ }
127
+ return value;
128
+ };
129
+ }
130
+ // Helper function to safely stringify JSON with comprehensive error handling
131
+ // Uses json-stringify-safe for circular references and custom replacer for special types
132
+ function safeStringify(obj, space) {
133
+ const replacer = createReplacer();
134
+ try {
135
+ // First apply our replacer to handle special types, then use json-stringify-safe for circular refs
136
+ // json-stringify-safe handles circular references automatically
137
+ return (0, json_stringify_safe_1.default)(obj, replacer, space);
138
+ }
139
+ catch (error) {
140
+ // If that fails, try to create a more useful representation
141
+ try {
142
+ // Try to manually process arrays and objects
143
+ if (Array.isArray(obj)) {
144
+ return (0, json_stringify_safe_1.default)(obj.map(item => replacer('', item)), null, space);
145
+ }
146
+ if (typeof obj === 'object' && obj !== null) {
147
+ const processed = {};
148
+ for (const [k, v] of Object.entries(obj)) {
149
+ processed[k] = replacer(k, v);
150
+ }
151
+ return (0, json_stringify_safe_1.default)(processed, null, space);
152
+ }
153
+ return String(obj);
154
+ }
155
+ catch {
156
+ // Last resort: return a placeholder string
157
+ return '[Unable to serialize result]';
158
+ }
159
+ }
160
+ }
161
+ function appendToOutputFile(result) {
162
+ const config = (0, config_1.loadConfig)();
163
+ if (!config.outputFileName) {
164
+ return;
165
+ }
166
+ const outputPath = path.join((0, config_1.getConfigDir)(), config.outputFileName);
167
+ const logEntry = `
168
+ === Query Execution ===
169
+ Timestamp: ${result.timestamp}
170
+ Query: ${result.query}
171
+ Result: ${safeStringify(result.data, 2)}
172
+ ===========================================
173
+ `;
174
+ fs.appendFileSync(outputPath, logEntry, 'utf-8');
175
+ }
176
+ async function executeQuery(sql) {
177
+ validateOperation(sql);
178
+ const prisma = (0, config_1.getPrismaClient)();
179
+ const timestamp = new Date().toISOString();
180
+ try {
181
+ const operation = detectOperationType(sql);
182
+ let data;
183
+ if (operation === 'SELECT') {
184
+ // Use $queryRawUnsafe for SELECT queries
185
+ data = await prisma.$queryRawUnsafe(sql);
186
+ }
187
+ else {
188
+ // For non-SELECT operations, use $executeRawUnsafe
189
+ const result = await prisma.$executeRawUnsafe(sql);
190
+ data = { affectedRows: result };
191
+ }
192
+ const result = {
193
+ data,
194
+ timestamp,
195
+ query: sql,
196
+ };
197
+ appendToOutputFile(result);
198
+ return result;
199
+ }
200
+ catch (error) {
201
+ const errorResult = {
202
+ data: { error: error.message },
203
+ timestamp,
204
+ query: sql,
205
+ };
206
+ appendToOutputFile(errorResult);
207
+ throw error;
208
+ }
209
+ }
210
+ async function executeAndPrint(sql) {
211
+ const result = await executeQuery(sql);
212
+ console.log('\n=== Query Result ===');
213
+ console.log(`Timestamp: ${result.timestamp}`);
214
+ console.log(`Query: ${result.query}`);
215
+ console.log('Result:');
216
+ console.log(safeStringify(result.data, 2));
217
+ console.log('===================\n');
218
+ return result;
219
+ }
220
+ //# sourceMappingURL=queryExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../src/core/queryExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ export { getConfigDir, getPrismaClient, loadConfig } from './core/config';
3
+ export { executeAndPrint, executeQuery, QueryResult } from './core/queryExecutor';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.executeQuery = exports.executeAndPrint = exports.loadConfig = exports.getPrismaClient = exports.getConfigDir = void 0;
5
+ // Export query executor functions for use in scripts
6
+ // These exports are available when the package is imported
7
+ var config_1 = require("./core/config");
8
+ Object.defineProperty(exports, "getConfigDir", { enumerable: true, get: function () { return config_1.getConfigDir; } });
9
+ Object.defineProperty(exports, "getPrismaClient", { enumerable: true, get: function () { return config_1.getPrismaClient; } });
10
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
11
+ var queryExecutor_1 = require("./core/queryExecutor");
12
+ Object.defineProperty(exports, "executeAndPrint", { enumerable: true, get: function () { return queryExecutor_1.executeAndPrint; } });
13
+ Object.defineProperty(exports, "executeQuery", { enumerable: true, get: function () { return queryExecutor_1.executeQuery; } });
14
+ // Only run CLI if this is the main module (not when imported)
15
+ if (require.main === module) {
16
+ const { Command } = require('commander');
17
+ const { initCommand } = require('./commands/init');
18
+ const { runCommand } = require('./commands/run');
19
+ const { startCommand } = require('./commands/start');
20
+ const program = new Command();
21
+ program
22
+ .name('db-ai')
23
+ .description('A package to allow AI to access databases with ease using Prisma')
24
+ .version('1.0.0');
25
+ program
26
+ .command('init')
27
+ .description('Initialize db-ai configuration folder')
28
+ .action(initCommand);
29
+ program
30
+ .command('start')
31
+ .description('Pull database schema using Prisma introspection')
32
+ .action(startCommand);
33
+ program
34
+ .command('run')
35
+ .description('Execute SQL query or run a TypeScript file')
36
+ .option('--sql <query>', 'SQL query to execute')
37
+ .option('--file <path>', 'Path to TypeScript file to execute')
38
+ .action(runCommand);
39
+ program.parse();
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAEA,qDAAqD;AACrD,2DAA2D;AAC3D,wCAA0E;AAAjE,sGAAA,YAAY,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,oGAAA,UAAU,OAAA;AAClD,sDAAkF;AAAzE,gHAAA,eAAe,OAAA;AAAE,6GAAA,YAAY,OAAA;AAEtC,8DAA8D;AAC9D,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjD,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAEhC,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,kEAAkE,CAAC;SAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,UAAU,CAAC,CAAC;IAEpB,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Script1.ts - Template for running SQL queries
3
+ *
4
+ * This file can be updated by AI to run SQL queries against the database.
5
+ * Import the query functions and use them to execute queries.
6
+ *
7
+ * Note: This file imports from the installed sdb-ai package.
8
+ * Make sure sdb-ai is installed in your project: npm install sdb-ai
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=Script1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Script1.d.ts","sourceRoot":"","sources":["../../src/templates/Script1.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Script1.ts - Template for running SQL queries
4
+ *
5
+ * This file can be updated by AI to run SQL queries against the database.
6
+ * Import the query functions and use them to execute queries.
7
+ *
8
+ * Note: This file imports from the installed sdb-ai package.
9
+ * Make sure sdb-ai is installed in your project: npm install sdb-ai
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const queryExecutor_1 = require("sdb-ai/dist/core/queryExecutor");
13
+ async function main() {
14
+ try {
15
+ // Example: Execute a query and get the result
16
+ const result = await (0, queryExecutor_1.executeQuery)("SELECT * FROM users LIMIT 10");
17
+ console.log('Query result:', result.data);
18
+ // Example: Execute a query and print the result
19
+ await (0, queryExecutor_1.executeAndPrint)("SELECT COUNT(*) as total FROM users");
20
+ // Add your queries here
21
+ // const customResult = await executeQuery("YOUR SQL QUERY HERE");
22
+ // console.log(customResult.data);
23
+ }
24
+ catch (error) {
25
+ console.error('Error executing query:', error);
26
+ process.exit(1);
27
+ }
28
+ finally {
29
+ // Close Prisma connection
30
+ const { getPrismaClient } = require('sdb-ai/dist/core/config');
31
+ const prisma = getPrismaClient();
32
+ await prisma.$disconnect();
33
+ }
34
+ }
35
+ main();
36
+ //# sourceMappingURL=Script1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Script1.js","sourceRoot":"","sources":["../../src/templates/Script1.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,kEAA+E;AAE/E,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAY,EAAC,8BAA8B,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1C,gDAAgD;QAChD,MAAM,IAAA,+BAAe,EAAC,qCAAqC,CAAC,CAAC;QAE7D,wBAAwB;QACxB,kEAAkE;QAClE,kCAAkC;IAEpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,0BAA0B;QAC1B,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "db-ai",
3
+ "version": "1.0.0",
4
+ "description": "A package to allow AI to access databases with ease using Prisma",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "db-ai": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "prepublishOnly": "npm run build",
12
+ "dev": "tsc --watch",
13
+ "test:build": "npm run build && echo 'Build successful!'",
14
+ "test:link": "npm run build && npm link && echo 'Package linked! You can now use db-ai command.'"
15
+ },
16
+ "keywords": [
17
+ "database",
18
+ "prisma",
19
+ "ai",
20
+ "sql",
21
+ "query"
22
+ ],
23
+ "author": "",
24
+ "license": "MIT",
25
+ "homepage": "https://github.com/umang25011/db-ai",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/umang25011/db-ai.git"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/umang25011/db-ai/issues"
32
+ },
33
+ "dependencies": {
34
+ "@prisma/client": "^5.7.1",
35
+ "chalk": "^4.1.2",
36
+ "commander": "^11.1.0",
37
+ "json-stringify-safe": "^5.0.1"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^20.10.5",
41
+ "prisma": "^5.7.1",
42
+ "ts-node": "^10.9.2",
43
+ "typescript": "^5.3.3"
44
+ },
45
+ "engines": {
46
+ "node": ">=16.0.0"
47
+ }
48
+ }