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 +155 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +141 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +7 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +137 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +115 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/core/config.d.ts +19 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +131 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/queryExecutor.d.ts +8 -0
- package/dist/core/queryExecutor.d.ts.map +1 -0
- package/dist/core/queryExecutor.js +220 -0
- package/dist/core/queryExecutor.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/Script1.d.ts +11 -0
- package/dist/templates/Script1.d.ts.map +1 -0
- package/dist/templates/Script1.js +36 -0
- package/dist/templates/Script1.js.map +1 -0
- package/package.json +48 -0
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgKA,oCAqCC;AAED,0CAWC;AAlND,uCAAyB;AACzB,2CAA6B;AAC7B,iEAAiE;AACjE,8EAA4C;AAC5C,qCAAqE;AAQrE,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,yCAAyC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,cAAc;IACrB,OAAO,CAAC,GAAW,EAAE,KAAU,EAAE,EAAE;QACjC,gBAAgB;QAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,8CAA8C;QAC9C,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;QAED,4EAA4E;QAC5E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,cAAc,KAAK,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC;QACpD,CAAC;QAED,gBAAgB;QAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,aAAa;QACb,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,aAAa;QACb,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,gBAAgB;QAChB,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,uBAAuB;QACvB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;YAClD,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,yFAAyF;AACzF,SAAS,aAAa,CAAC,GAAQ,EAAE,KAAc;IAC7C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,mGAAmG;QACnG,gEAAgE;QAChE,OAAO,IAAA,6BAAS,EAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4DAA4D;QAC5D,IAAI,CAAC;YACH,6CAA6C;YAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,IAAA,6BAAS,EACd,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EACnC,IAAI,EACJ,KAAK,CACN,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAQ,EAAE,CAAC;gBAC1B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzC,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChC,CAAC;gBACD,OAAO,IAAA,6BAAS,EAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;YAC3C,OAAO,8BAA8B,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,qBAAY,GAAE,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG;;aAEN,MAAM,CAAC,SAAS;SACpB,MAAM,CAAC,KAAK;UACX,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;;CAEtC,CAAC;IAEA,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,IAAS,CAAC;QAEd,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,yCAAyC;YACzC,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,MAAM,GAAgB;YAC1B,IAAI;YACJ,SAAS;YACT,KAAK,EAAE,GAAG;SACX,CAAC;QAEF,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;YAC9B,SAAS;YACT,KAAK,EAAE,GAAG;SACX,CAAC;QAEF,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|