@quereus/quoomb-cli 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/quoomb.d.ts.map +1 -0
- package/dist/bin/quoomb.js +210 -0
- package/dist/bin/quoomb.js.map +1 -0
- package/dist/commands/dot-commands.d.ts.map +1 -0
- package/dist/commands/dot-commands.js +610 -0
- package/dist/commands/dot-commands.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +288 -0
- package/dist/repl.js.map +1 -0
- package/package.json +12 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quoomb.d.ts","sourceRoot":"","sources":["../../src/bin/quoomb.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { REPL } from '../repl.js';
|
|
4
|
+
import { Database } from '@quereus/quereus';
|
|
5
|
+
import { loadPluginsFromConfig, interpolateConfigEnvVars, validateConfig } from '@quereus/plugin-loader';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
import Table from 'cli-table3';
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('quoomb')
|
|
14
|
+
.description('Quoomb - Interactive REPL for Quereus SQL engine')
|
|
15
|
+
.version('0.0.1')
|
|
16
|
+
.option('-j, --json', 'output results as JSON instead of ASCII table')
|
|
17
|
+
.option('-f, --file <path>', 'execute SQL from file and exit')
|
|
18
|
+
.option('-c, --cmd <sql>', 'execute SQL command and exit')
|
|
19
|
+
.option('--config <path>', 'load configuration from file')
|
|
20
|
+
.option('--no-autoload', 'do not auto-load plugins from config')
|
|
21
|
+
.option('--no-color', 'disable colored output')
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
try {
|
|
24
|
+
if (options.file) {
|
|
25
|
+
await executeFile(options.file, options);
|
|
26
|
+
}
|
|
27
|
+
else if (options.cmd) {
|
|
28
|
+
await executeCommand(options.cmd, options);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(chalk.blue('Welcome to Quoomb - Quereus SQL REPL'));
|
|
32
|
+
console.log(chalk.gray('Type .help for available commands or enter SQL to execute'));
|
|
33
|
+
console.log(chalk.gray('Use Ctrl+C or .exit to quit\n'));
|
|
34
|
+
// Load config if available
|
|
35
|
+
let config = undefined;
|
|
36
|
+
const configPath = await resolveConfigPath(options.config);
|
|
37
|
+
if (configPath) {
|
|
38
|
+
try {
|
|
39
|
+
config = await loadConfigFile(configPath);
|
|
40
|
+
if (!validateConfig(config)) {
|
|
41
|
+
console.warn(chalk.yellow(`Warning: Invalid config file at ${configPath}`));
|
|
42
|
+
config = undefined;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.log(chalk.gray(`Loaded config from ${configPath}`));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.warn(chalk.yellow(`Warning: ${error instanceof Error ? error.message : 'Failed to load config'}`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const repl = new REPL({ ...options, config, autoload: options.autoload !== false });
|
|
53
|
+
await repl.start();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
/**
|
|
62
|
+
* Resolve config file path following the resolution strategy
|
|
63
|
+
*/
|
|
64
|
+
async function resolveConfigPath(configOption) {
|
|
65
|
+
// 1. --config CLI argument (highest priority)
|
|
66
|
+
if (configOption) {
|
|
67
|
+
return path.resolve(configOption);
|
|
68
|
+
}
|
|
69
|
+
// 2. QUOOMB_CONFIG environment variable
|
|
70
|
+
if (process.env.QUOOMB_CONFIG) {
|
|
71
|
+
return path.resolve(process.env.QUOOMB_CONFIG);
|
|
72
|
+
}
|
|
73
|
+
// 3. ./quoomb.config.json (current directory)
|
|
74
|
+
const cwd = process.cwd();
|
|
75
|
+
const cwdConfig = path.join(cwd, 'quoomb.config.json');
|
|
76
|
+
try {
|
|
77
|
+
await fs.access(cwdConfig);
|
|
78
|
+
return cwdConfig;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// File doesn't exist, continue
|
|
82
|
+
}
|
|
83
|
+
// 4. ~/.quoomb/config.json (user home directory)
|
|
84
|
+
const homeDir = os.homedir();
|
|
85
|
+
const homeConfig = path.join(homeDir, '.quoomb', 'config.json');
|
|
86
|
+
try {
|
|
87
|
+
await fs.access(homeConfig);
|
|
88
|
+
return homeConfig;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// File doesn't exist, continue
|
|
92
|
+
}
|
|
93
|
+
// 5. No config found
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Load and parse config file
|
|
98
|
+
*/
|
|
99
|
+
async function loadConfigFile(configPath) {
|
|
100
|
+
try {
|
|
101
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
102
|
+
return JSON.parse(content);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new Error(`Failed to load config from '${configPath}': ${error instanceof Error ? error.message : error}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function executeFile(filePath, options) {
|
|
109
|
+
try {
|
|
110
|
+
const sql = await fs.readFile(filePath, 'utf-8');
|
|
111
|
+
await executeCommand(sql.trim(), options);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
throw new Error(`Failed to read file '${filePath}': ${error instanceof Error ? error.message : error}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function executeCommand(sql, options) {
|
|
118
|
+
const db = new Database();
|
|
119
|
+
const startTime = Date.now();
|
|
120
|
+
try {
|
|
121
|
+
// Load config and plugins if available
|
|
122
|
+
const configPath = await resolveConfigPath(options.config);
|
|
123
|
+
if (configPath) {
|
|
124
|
+
try {
|
|
125
|
+
const config = await loadConfigFile(configPath);
|
|
126
|
+
if (validateConfig(config)) {
|
|
127
|
+
const interpolatedConfig = interpolateConfigEnvVars(config);
|
|
128
|
+
if (interpolatedConfig.autoload !== false && options.autoload !== false) {
|
|
129
|
+
await loadPluginsFromConfig(db, interpolatedConfig);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.warn(chalk.yellow(`Warning: ${error instanceof Error ? error.message : 'Failed to load config'}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Check if this is a query that returns results
|
|
138
|
+
const trimmedSql = sql.trim().toLowerCase();
|
|
139
|
+
if (trimmedSql.startsWith('select') || trimmedSql.startsWith('with')) {
|
|
140
|
+
const results = [];
|
|
141
|
+
for await (const row of db.eval(sql)) {
|
|
142
|
+
results.push(row);
|
|
143
|
+
}
|
|
144
|
+
const endTime = Date.now();
|
|
145
|
+
if (options.json) {
|
|
146
|
+
console.log(JSON.stringify(results, null, 2));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
printTable(results, options);
|
|
150
|
+
}
|
|
151
|
+
if (options.color !== false) {
|
|
152
|
+
console.error(chalk.gray(`${results.length} row(s) (${endTime - startTime}ms)`));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.error(`${results.length} row(s) (${endTime - startTime}ms)`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Execute statement without expecting results
|
|
160
|
+
await db.exec(sql);
|
|
161
|
+
const endTime = Date.now();
|
|
162
|
+
if (options.color !== false) {
|
|
163
|
+
console.error(chalk.green(`Query executed successfully (${endTime - startTime}ms)`));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.error(`Query executed successfully (${endTime - startTime}ms)`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const endTime = Date.now();
|
|
172
|
+
if (options.color !== false) {
|
|
173
|
+
console.error(chalk.red(`Query failed (${endTime - startTime}ms)`));
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
console.error(`Query failed (${endTime - startTime}ms)`);
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
await db.close();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function printTable(results, options) {
|
|
185
|
+
if (results.length === 0) {
|
|
186
|
+
console.log(options.color !== false ? chalk.yellow('No rows returned') : 'No rows returned');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const columns = Object.keys(results[0]);
|
|
190
|
+
const table = new Table({
|
|
191
|
+
head: columns.map(col => options.color !== false ? chalk.cyan(col) : col),
|
|
192
|
+
style: {
|
|
193
|
+
head: options.color !== false ? ['cyan'] : []
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
for (const row of results) {
|
|
197
|
+
const values = columns.map(col => {
|
|
198
|
+
const value = row[col];
|
|
199
|
+
if (value === null)
|
|
200
|
+
return options.color !== false ? chalk.gray('NULL') : 'NULL';
|
|
201
|
+
if (typeof value === 'string')
|
|
202
|
+
return value;
|
|
203
|
+
return String(value);
|
|
204
|
+
});
|
|
205
|
+
table.push(values);
|
|
206
|
+
}
|
|
207
|
+
console.log(table.toString());
|
|
208
|
+
}
|
|
209
|
+
program.parse();
|
|
210
|
+
//# sourceMappingURL=quoomb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quoomb.js","sourceRoot":"","sources":["../../src/bin/quoomb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dot-commands.d.ts","sourceRoot":"","sources":["../../src/commands/dot-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAY5C,qBAAa,WAAW;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAE1B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BxD,OAAO,CAAC,SAAS;IA+BX,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoE7C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0F1C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmClE;AAED,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,IAAI,QAAQ,EACZ,mBAAmB,GAAG,KACrB,OAAO,CAAC,OAAO,CAYjB,CAAC;AAkWF,eAAO,MAAM,kBAAkB,GAAU,IAAI,QAAQ,KAAG,OAAO,CAAC,IAAI,CAqBnE,CAAC"}
|
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import Table from 'cli-table3';
|
|
3
|
+
import * as fs from 'fs/promises';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import Papa from 'papaparse';
|
|
6
|
+
import { dynamicLoadModule, validatePluginUrl } from '@quereus/plugin-loader';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
import crypto from 'crypto';
|
|
9
|
+
export class DotCommands {
|
|
10
|
+
db;
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
}
|
|
14
|
+
async handle(command, rl) {
|
|
15
|
+
const parts = command.slice(1).split(/\s+/);
|
|
16
|
+
const cmd = parts[0];
|
|
17
|
+
const args = parts.slice(1);
|
|
18
|
+
switch (cmd) {
|
|
19
|
+
case 'help':
|
|
20
|
+
this.printHelp();
|
|
21
|
+
break;
|
|
22
|
+
case 'exit':
|
|
23
|
+
case 'quit':
|
|
24
|
+
rl.close();
|
|
25
|
+
break;
|
|
26
|
+
case 'tables':
|
|
27
|
+
await this.listTables();
|
|
28
|
+
break;
|
|
29
|
+
case 'schema':
|
|
30
|
+
await this.showSchema(args[0]);
|
|
31
|
+
break;
|
|
32
|
+
case 'import':
|
|
33
|
+
await this.importCsv(args[0]);
|
|
34
|
+
break;
|
|
35
|
+
case 'export':
|
|
36
|
+
await this.exportQuery(args[0], args[1]);
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
return false; // Command not handled
|
|
40
|
+
}
|
|
41
|
+
return true; // Command was handled
|
|
42
|
+
}
|
|
43
|
+
printHelp() {
|
|
44
|
+
console.log(`
|
|
45
|
+
Available commands:
|
|
46
|
+
.help Show this help message
|
|
47
|
+
.exit, .quit Exit the REPL
|
|
48
|
+
.tables List all tables
|
|
49
|
+
.schema [table] Show table schema
|
|
50
|
+
.import <file.csv> Import CSV file as table
|
|
51
|
+
.export <sql> <file> Export query results to file
|
|
52
|
+
|
|
53
|
+
Plugin commands:
|
|
54
|
+
.plugin install <url> Install plugin from URL
|
|
55
|
+
.plugin list List installed plugins
|
|
56
|
+
.plugin enable <name> Enable a plugin
|
|
57
|
+
.plugin disable <name> Disable a plugin
|
|
58
|
+
.plugin remove <name> Remove a plugin
|
|
59
|
+
.plugin config <name> Configure a plugin
|
|
60
|
+
.plugin reload <name> Reload a plugin
|
|
61
|
+
|
|
62
|
+
SQL commands:
|
|
63
|
+
Enter any SQL statement to execute it
|
|
64
|
+
|
|
65
|
+
Examples:
|
|
66
|
+
CREATE TABLE users (id INTEGER, name TEXT);
|
|
67
|
+
INSERT INTO users VALUES (1, 'Alice');
|
|
68
|
+
SELECT * FROM users;
|
|
69
|
+
.import data.csv
|
|
70
|
+
.export "SELECT * FROM users" output.json
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
async listTables() {
|
|
74
|
+
try {
|
|
75
|
+
const results = [];
|
|
76
|
+
for await (const row of this.db.eval(`
|
|
77
|
+
SELECT name, type FROM sqlite_schema
|
|
78
|
+
WHERE type IN ('table', 'view')
|
|
79
|
+
ORDER BY name
|
|
80
|
+
`)) {
|
|
81
|
+
results.push(row);
|
|
82
|
+
}
|
|
83
|
+
if (results.length === 0) {
|
|
84
|
+
console.log(chalk.yellow('No tables found'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const table = new Table({
|
|
88
|
+
head: [chalk.cyan('Name'), chalk.cyan('Type')]
|
|
89
|
+
});
|
|
90
|
+
for (const row of results) {
|
|
91
|
+
table.push([String(row.name || ''), String(row.type || '')]);
|
|
92
|
+
}
|
|
93
|
+
console.log(table.toString());
|
|
94
|
+
console.log(chalk.gray(`\n${results.length} table(s)`));
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error(chalk.red('Error listing tables:'), error instanceof Error ? error.message : String(error));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async showSchema(tableName) {
|
|
101
|
+
try {
|
|
102
|
+
if (!tableName) {
|
|
103
|
+
// Show all schemas
|
|
104
|
+
const results = [];
|
|
105
|
+
for await (const row of this.db.eval(`
|
|
106
|
+
SELECT sql FROM sqlite_schema
|
|
107
|
+
WHERE sql IS NOT NULL
|
|
108
|
+
ORDER BY name
|
|
109
|
+
`)) {
|
|
110
|
+
results.push(row);
|
|
111
|
+
}
|
|
112
|
+
if (results.length === 0) {
|
|
113
|
+
console.log(chalk.yellow('No schema found'));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
for (const row of results) {
|
|
117
|
+
console.log(chalk.white(String(row.sql) + ';'));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Show specific table schema
|
|
122
|
+
const results = [];
|
|
123
|
+
for await (const row of this.db.eval(`
|
|
124
|
+
SELECT sql FROM sqlite_schema
|
|
125
|
+
WHERE name = ? AND sql IS NOT NULL
|
|
126
|
+
`, [tableName])) {
|
|
127
|
+
results.push(row);
|
|
128
|
+
}
|
|
129
|
+
if (results.length === 0) {
|
|
130
|
+
console.log(chalk.yellow(`Table '${tableName}' not found`));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
console.log(chalk.white(String(results[0].sql) + ';'));
|
|
134
|
+
// Also show column info
|
|
135
|
+
const columns = [];
|
|
136
|
+
for await (const row of this.db.eval(`PRAGMA table_info(${tableName})`)) {
|
|
137
|
+
columns.push(row);
|
|
138
|
+
}
|
|
139
|
+
if (columns.length > 0) {
|
|
140
|
+
console.log(chalk.gray('\nColumns:'));
|
|
141
|
+
const table = new Table({
|
|
142
|
+
head: [chalk.cyan('Name'), chalk.cyan('Type'), chalk.cyan('NotNull'), chalk.cyan('Default'), chalk.cyan('PK')]
|
|
143
|
+
});
|
|
144
|
+
for (const col of columns) {
|
|
145
|
+
table.push([
|
|
146
|
+
String(col.name || ''),
|
|
147
|
+
String(col.type || 'TEXT'),
|
|
148
|
+
col.notnull ? 'YES' : 'NO',
|
|
149
|
+
String(col.dflt_value || ''),
|
|
150
|
+
col.pk ? 'YES' : 'NO'
|
|
151
|
+
]);
|
|
152
|
+
}
|
|
153
|
+
console.log(table.toString());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
console.error(chalk.red('Error showing schema:'), error instanceof Error ? error.message : String(error));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async importCsv(filePath) {
|
|
162
|
+
if (!filePath) {
|
|
163
|
+
console.log(chalk.red('Please specify a CSV file path'));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const resolvedPath = path.resolve(filePath);
|
|
168
|
+
const fileContent = await fs.readFile(resolvedPath, 'utf-8');
|
|
169
|
+
// Parse CSV
|
|
170
|
+
const parseResult = Papa.parse(fileContent, {
|
|
171
|
+
header: true,
|
|
172
|
+
skipEmptyLines: true,
|
|
173
|
+
transform: (value, field) => {
|
|
174
|
+
// Try to convert numbers
|
|
175
|
+
if (value === '')
|
|
176
|
+
return null;
|
|
177
|
+
const num = Number(value);
|
|
178
|
+
if (!isNaN(num) && value === num.toString()) {
|
|
179
|
+
return num;
|
|
180
|
+
}
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
if (parseResult.errors.length > 0) {
|
|
185
|
+
console.log(chalk.red('CSV parsing errors:'));
|
|
186
|
+
parseResult.errors.forEach(error => {
|
|
187
|
+
console.log(chalk.red(` Line ${error.row}: ${error.message}`));
|
|
188
|
+
});
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (parseResult.data.length === 0) {
|
|
192
|
+
console.log(chalk.yellow('No data found in CSV file'));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Generate table name from file name
|
|
196
|
+
const tableName = path.basename(filePath, path.extname(filePath))
|
|
197
|
+
.replace(/[^a-zA-Z0-9_]/g, '_')
|
|
198
|
+
.replace(/^[0-9]/, '_$&'); // Ensure it doesn't start with a number
|
|
199
|
+
// Infer column types from data
|
|
200
|
+
const firstRow = parseResult.data[0];
|
|
201
|
+
const columns = Object.keys(firstRow).map(col => {
|
|
202
|
+
const sampleValues = parseResult.data.slice(0, 10).map(row => row[col]);
|
|
203
|
+
const hasNumbers = sampleValues.some(val => typeof val === 'number');
|
|
204
|
+
const hasStrings = sampleValues.some(val => typeof val === 'string' && val !== '');
|
|
205
|
+
let type = 'TEXT';
|
|
206
|
+
if (hasNumbers && !hasStrings) {
|
|
207
|
+
type = 'REAL';
|
|
208
|
+
}
|
|
209
|
+
else if (hasNumbers) {
|
|
210
|
+
type = 'TEXT'; // Mixed, so use TEXT
|
|
211
|
+
}
|
|
212
|
+
return `"${col}" ${type}`;
|
|
213
|
+
});
|
|
214
|
+
// Create table
|
|
215
|
+
const createSql = `CREATE TABLE "${tableName}" (${columns.join(', ')})`;
|
|
216
|
+
await this.db.exec(createSql);
|
|
217
|
+
console.log(chalk.green(`Created table: ${tableName}`));
|
|
218
|
+
// Insert data
|
|
219
|
+
const columnNames = Object.keys(firstRow);
|
|
220
|
+
const placeholders = columnNames.map(() => '?').join(', ');
|
|
221
|
+
const insertSql = `INSERT INTO "${tableName}" (${columnNames.map(c => `"${c}"`).join(', ')}) VALUES (${placeholders})`;
|
|
222
|
+
const stmt = await this.db.prepare(insertSql);
|
|
223
|
+
let insertCount = 0;
|
|
224
|
+
try {
|
|
225
|
+
for (const row of parseResult.data) {
|
|
226
|
+
const values = columnNames.map(col => row[col]);
|
|
227
|
+
await stmt.run(values);
|
|
228
|
+
insertCount++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
await stmt.finalize();
|
|
233
|
+
}
|
|
234
|
+
console.log(chalk.green(`Imported ${insertCount} rows into table '${tableName}'`));
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
console.error(chalk.red('Error importing CSV:'), error instanceof Error ? error.message : String(error));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async exportQuery(sql, outputPath) {
|
|
241
|
+
if (!sql || !outputPath) {
|
|
242
|
+
console.log(chalk.red('Please specify both SQL query and output file path'));
|
|
243
|
+
console.log(chalk.gray('Usage: .export "SELECT * FROM table" output.json'));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
const results = [];
|
|
248
|
+
for await (const row of this.db.eval(sql)) {
|
|
249
|
+
results.push(row);
|
|
250
|
+
}
|
|
251
|
+
const resolvedPath = path.resolve(outputPath);
|
|
252
|
+
const ext = path.extname(resolvedPath).toLowerCase();
|
|
253
|
+
if (ext === '.json') {
|
|
254
|
+
await fs.writeFile(resolvedPath, JSON.stringify(results, null, 2), 'utf-8');
|
|
255
|
+
}
|
|
256
|
+
else if (ext === '.csv') {
|
|
257
|
+
if (results.length === 0) {
|
|
258
|
+
await fs.writeFile(resolvedPath, '', 'utf-8');
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const csv = Papa.unparse(results);
|
|
262
|
+
await fs.writeFile(resolvedPath, csv, 'utf-8');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
// Default to JSON
|
|
267
|
+
await fs.writeFile(resolvedPath, JSON.stringify(results, null, 2), 'utf-8');
|
|
268
|
+
}
|
|
269
|
+
console.log(chalk.green(`Exported ${results.length} rows to '${outputPath}'`));
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
console.error(chalk.red('Error exporting query:'), error instanceof Error ? error.message : String(error));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export const handleDotCommand = async (line, db, readlineInterface) => {
|
|
277
|
+
// ... existing commands ...
|
|
278
|
+
if (line.startsWith('.plugin')) {
|
|
279
|
+
await handlePluginCommand(line, db);
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
// ... rest of existing code ...
|
|
283
|
+
// Return false for unhandled commands
|
|
284
|
+
return false;
|
|
285
|
+
};
|
|
286
|
+
const handlePluginCommand = async (line, db) => {
|
|
287
|
+
const args = line.split(/\s+/).slice(1);
|
|
288
|
+
const subcommand = args[0];
|
|
289
|
+
switch (subcommand) {
|
|
290
|
+
case 'install':
|
|
291
|
+
await installPluginCommand(args.slice(1), db);
|
|
292
|
+
break;
|
|
293
|
+
case 'list':
|
|
294
|
+
await listPluginsCommand();
|
|
295
|
+
break;
|
|
296
|
+
case 'enable':
|
|
297
|
+
await enablePluginCommand(args.slice(1), db);
|
|
298
|
+
break;
|
|
299
|
+
case 'disable':
|
|
300
|
+
await disablePluginCommand(args.slice(1));
|
|
301
|
+
break;
|
|
302
|
+
case 'remove':
|
|
303
|
+
await removePluginCommand(args.slice(1));
|
|
304
|
+
break;
|
|
305
|
+
case 'config':
|
|
306
|
+
await configPluginCommand(args.slice(1), db);
|
|
307
|
+
break;
|
|
308
|
+
case 'reload':
|
|
309
|
+
await reloadPluginCommand(args.slice(1), db);
|
|
310
|
+
break;
|
|
311
|
+
default:
|
|
312
|
+
console.log('Plugin management commands:');
|
|
313
|
+
console.log(' .plugin install <url> - Install plugin from URL');
|
|
314
|
+
console.log(' .plugin list - List installed plugins');
|
|
315
|
+
console.log(' .plugin enable <name> - Enable a plugin');
|
|
316
|
+
console.log(' .plugin disable <name> - Disable a plugin');
|
|
317
|
+
console.log(' .plugin remove <name> - Remove a plugin');
|
|
318
|
+
console.log(' .plugin config <name> - Configure a plugin');
|
|
319
|
+
console.log(' .plugin reload <name> - Reload a plugin');
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
const getPluginsFilePath = () => {
|
|
324
|
+
const homeDir = os.homedir();
|
|
325
|
+
const configDir = path.join(homeDir, '.quoomb');
|
|
326
|
+
return path.join(configDir, 'plugins.json');
|
|
327
|
+
};
|
|
328
|
+
const loadPlugins = async () => {
|
|
329
|
+
try {
|
|
330
|
+
const filePath = getPluginsFilePath();
|
|
331
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
332
|
+
return JSON.parse(data);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
// File doesn't exist or is invalid, return empty array
|
|
336
|
+
return [];
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
const savePlugins = async (plugins) => {
|
|
340
|
+
const filePath = getPluginsFilePath();
|
|
341
|
+
const configDir = path.dirname(filePath);
|
|
342
|
+
// Ensure config directory exists
|
|
343
|
+
try {
|
|
344
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
// Directory already exists
|
|
348
|
+
}
|
|
349
|
+
await fs.writeFile(filePath, JSON.stringify(plugins, null, 2));
|
|
350
|
+
};
|
|
351
|
+
const installPluginCommand = async (args, db) => {
|
|
352
|
+
if (args.length === 0) {
|
|
353
|
+
console.log('Usage: .plugin install <url>');
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const url = args[0];
|
|
357
|
+
if (!validatePluginUrl(url)) {
|
|
358
|
+
console.log('Error: Invalid plugin URL. Must be https:// or file:// URL ending in .js or .mjs');
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
try {
|
|
362
|
+
console.log(`Installing plugin from ${url}...`);
|
|
363
|
+
// Try to load the plugin
|
|
364
|
+
const manifest = await dynamicLoadModule(url, db, {});
|
|
365
|
+
// Load existing plugins
|
|
366
|
+
const plugins = await loadPlugins();
|
|
367
|
+
// Check if already installed
|
|
368
|
+
const existing = plugins.find(p => p.url === url);
|
|
369
|
+
if (existing) {
|
|
370
|
+
console.log(`Plugin from ${url} is already installed`);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
// Create plugin record
|
|
374
|
+
const pluginRecord = {
|
|
375
|
+
id: crypto.randomUUID(),
|
|
376
|
+
url,
|
|
377
|
+
enabled: true,
|
|
378
|
+
manifest,
|
|
379
|
+
config: {},
|
|
380
|
+
};
|
|
381
|
+
// Add to list and save
|
|
382
|
+
plugins.push(pluginRecord);
|
|
383
|
+
await savePlugins(plugins);
|
|
384
|
+
console.log(`Successfully installed plugin: ${manifest?.name || 'Unknown'}`);
|
|
385
|
+
if (manifest?.description) {
|
|
386
|
+
console.log(` ${manifest.description}`);
|
|
387
|
+
}
|
|
388
|
+
if (manifest?.version) {
|
|
389
|
+
console.log(` Version: ${manifest.version}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
console.log(`Error installing plugin: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
const listPluginsCommand = async () => {
|
|
397
|
+
const plugins = await loadPlugins();
|
|
398
|
+
if (plugins.length === 0) {
|
|
399
|
+
console.log('No plugins installed');
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
console.log('Installed plugins:');
|
|
403
|
+
for (const plugin of plugins) {
|
|
404
|
+
const status = plugin.enabled ? '✓' : '✗';
|
|
405
|
+
const name = plugin.manifest?.name || 'Unknown';
|
|
406
|
+
const version = plugin.manifest?.version || '';
|
|
407
|
+
console.log(` ${status} ${name} ${version ? `(v${version})` : ''}`);
|
|
408
|
+
console.log(` ${plugin.url}`);
|
|
409
|
+
if (plugin.manifest?.description) {
|
|
410
|
+
console.log(` ${plugin.manifest.description}`);
|
|
411
|
+
}
|
|
412
|
+
console.log();
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
const enablePluginCommand = async (args, db) => {
|
|
416
|
+
if (args.length === 0) {
|
|
417
|
+
console.log('Usage: .plugin enable <name>');
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const name = args[0];
|
|
421
|
+
const plugins = await loadPlugins();
|
|
422
|
+
const plugin = plugins.find(p => p.manifest?.name === name);
|
|
423
|
+
if (!plugin) {
|
|
424
|
+
console.log(`Plugin '${name}' not found`);
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (plugin.enabled) {
|
|
428
|
+
console.log(`Plugin '${name}' is already enabled`);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
// Load the plugin
|
|
433
|
+
const manifest = await dynamicLoadModule(plugin.url, db, plugin.config);
|
|
434
|
+
// Update plugin record
|
|
435
|
+
plugin.enabled = true;
|
|
436
|
+
if (manifest) {
|
|
437
|
+
plugin.manifest = manifest;
|
|
438
|
+
}
|
|
439
|
+
await savePlugins(plugins);
|
|
440
|
+
console.log(`Enabled plugin: ${name}`);
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
console.log(`Error enabling plugin: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
const disablePluginCommand = async (args) => {
|
|
447
|
+
if (args.length === 0) {
|
|
448
|
+
console.log('Usage: .plugin disable <name>');
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
const name = args[0];
|
|
452
|
+
const plugins = await loadPlugins();
|
|
453
|
+
const plugin = plugins.find(p => p.manifest?.name === name);
|
|
454
|
+
if (!plugin) {
|
|
455
|
+
console.log(`Plugin '${name}' not found`);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
if (!plugin.enabled) {
|
|
459
|
+
console.log(`Plugin '${name}' is already disabled`);
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
plugin.enabled = false;
|
|
463
|
+
await savePlugins(plugins);
|
|
464
|
+
console.log(`Disabled plugin: ${name}`);
|
|
465
|
+
console.log('Note: Plugin will be unloaded on next restart');
|
|
466
|
+
};
|
|
467
|
+
const removePluginCommand = async (args) => {
|
|
468
|
+
if (args.length === 0) {
|
|
469
|
+
console.log('Usage: .plugin remove <name>');
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
const name = args[0];
|
|
473
|
+
const plugins = await loadPlugins();
|
|
474
|
+
const pluginIndex = plugins.findIndex(p => p.manifest?.name === name);
|
|
475
|
+
if (pluginIndex === -1) {
|
|
476
|
+
console.log(`Plugin '${name}' not found`);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
plugins.splice(pluginIndex, 1);
|
|
480
|
+
await savePlugins(plugins);
|
|
481
|
+
console.log(`Removed plugin: ${name}`);
|
|
482
|
+
};
|
|
483
|
+
const configPluginCommand = async (args, db) => {
|
|
484
|
+
if (args.length === 0) {
|
|
485
|
+
console.log('Usage: .plugin config <name> [key=value ...]');
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
const name = args[0];
|
|
489
|
+
const plugins = await loadPlugins();
|
|
490
|
+
const plugin = plugins.find(p => p.manifest?.name === name);
|
|
491
|
+
if (!plugin) {
|
|
492
|
+
console.log(`Plugin '${name}' not found`);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (args.length === 1) {
|
|
496
|
+
// Show current configuration
|
|
497
|
+
console.log(`Configuration for ${name}:`);
|
|
498
|
+
if (!plugin.manifest?.settings?.length) {
|
|
499
|
+
console.log(' No configuration options available');
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
for (const setting of plugin.manifest.settings) {
|
|
503
|
+
const value = plugin.config[setting.key] ?? setting.default ?? '';
|
|
504
|
+
console.log(` ${setting.key}: ${value} (${setting.type})`);
|
|
505
|
+
if (setting.help) {
|
|
506
|
+
console.log(` ${setting.help}`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
// Update configuration
|
|
512
|
+
const configUpdates = {};
|
|
513
|
+
for (let i = 1; i < args.length; i++) {
|
|
514
|
+
const [key, ...valueParts] = args[i].split('=');
|
|
515
|
+
if (!key || valueParts.length === 0) {
|
|
516
|
+
console.log(`Invalid config format: ${args[i]}. Use key=value`);
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
const value = valueParts.join('=');
|
|
520
|
+
const setting = plugin.manifest?.settings?.find((s) => s.key === key);
|
|
521
|
+
if (!setting) {
|
|
522
|
+
console.log(`Unknown setting: ${key}`);
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
// Parse value according to type
|
|
526
|
+
let parsedValue;
|
|
527
|
+
switch (setting.type) {
|
|
528
|
+
case 'number':
|
|
529
|
+
parsedValue = Number(value);
|
|
530
|
+
if (isNaN(parsedValue)) {
|
|
531
|
+
console.log(`Invalid number value for ${key}: ${value}`);
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
break;
|
|
535
|
+
case 'boolean':
|
|
536
|
+
parsedValue = value.toLowerCase() === 'true';
|
|
537
|
+
break;
|
|
538
|
+
default:
|
|
539
|
+
parsedValue = value;
|
|
540
|
+
}
|
|
541
|
+
configUpdates[key] = parsedValue;
|
|
542
|
+
}
|
|
543
|
+
// Update plugin config
|
|
544
|
+
plugin.config = { ...plugin.config, ...configUpdates };
|
|
545
|
+
await savePlugins(plugins);
|
|
546
|
+
// Reload plugin if enabled
|
|
547
|
+
if (plugin.enabled) {
|
|
548
|
+
try {
|
|
549
|
+
await dynamicLoadModule(plugin.url, db, plugin.config);
|
|
550
|
+
console.log(`Updated configuration and reloaded plugin: ${name}`);
|
|
551
|
+
}
|
|
552
|
+
catch (error) {
|
|
553
|
+
console.log(`Configuration updated but failed to reload plugin: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
console.log(`Updated configuration for plugin: ${name}`);
|
|
558
|
+
}
|
|
559
|
+
};
|
|
560
|
+
const reloadPluginCommand = async (args, db) => {
|
|
561
|
+
if (args.length === 0) {
|
|
562
|
+
console.log('Usage: .plugin reload <name>');
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
const name = args[0];
|
|
566
|
+
const plugins = await loadPlugins();
|
|
567
|
+
const plugin = plugins.find(p => p.manifest?.name === name);
|
|
568
|
+
if (!plugin) {
|
|
569
|
+
console.log(`Plugin '${name}' not found`);
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
if (!plugin.enabled) {
|
|
573
|
+
console.log(`Plugin '${name}' is disabled`);
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
try {
|
|
577
|
+
const manifest = await dynamicLoadModule(plugin.url, db, plugin.config);
|
|
578
|
+
// Update manifest if it changed
|
|
579
|
+
if (manifest) {
|
|
580
|
+
plugin.manifest = manifest;
|
|
581
|
+
await savePlugins(plugins);
|
|
582
|
+
}
|
|
583
|
+
console.log(`Reloaded plugin: ${name}`);
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
console.log(`Error reloading plugin: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
// Update the startup function to load enabled plugins
|
|
590
|
+
export const loadEnabledPlugins = async (db) => {
|
|
591
|
+
const plugins = await loadPlugins();
|
|
592
|
+
const enabledPlugins = plugins.filter(p => p.enabled);
|
|
593
|
+
for (const plugin of enabledPlugins) {
|
|
594
|
+
try {
|
|
595
|
+
const manifest = await dynamicLoadModule(plugin.url, db, plugin.config);
|
|
596
|
+
// Update manifest if it changed
|
|
597
|
+
if (manifest && (!plugin.manifest || plugin.manifest.version !== manifest.version)) {
|
|
598
|
+
plugin.manifest = manifest;
|
|
599
|
+
await savePlugins(plugins);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
console.log(`Warning: Failed to load plugin ${plugin.manifest?.name || plugin.url}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
604
|
+
// Disable the plugin if it failed to load
|
|
605
|
+
plugin.enabled = false;
|
|
606
|
+
await savePlugins(plugins);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
//# sourceMappingURL=dot-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dot-commands.js","sourceRoot":"","sources":["../../src/commands/dot-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAM5H,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,GAAE,WAAgB;IAerC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,mBAAmB;IAOrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkF5B,OAAO,CAAC,SAAS;IAmDjB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAuBjB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,kBAAkB;CA2D3B"}
|
package/dist/repl.js
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
import { Database, formatErrorChain, unwrapError } from '@quereus/quereus';
|
|
3
|
+
import { loadPluginsFromConfig, interpolateConfigEnvVars } from '@quereus/plugin-loader';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import Table from 'cli-table3';
|
|
6
|
+
import { DotCommands } from './commands/dot-commands.js';
|
|
7
|
+
import { handleDotCommand, loadEnabledPlugins } from './commands/dot-commands.js';
|
|
8
|
+
export class REPL {
|
|
9
|
+
db;
|
|
10
|
+
rl;
|
|
11
|
+
dotCommands;
|
|
12
|
+
options;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.options = { color: true, autoload: true, ...options };
|
|
15
|
+
this.db = new Database();
|
|
16
|
+
this.dotCommands = new DotCommands(this.db);
|
|
17
|
+
this.rl = readline.createInterface({
|
|
18
|
+
input: process.stdin,
|
|
19
|
+
output: process.stdout,
|
|
20
|
+
prompt: this.getPrompt(),
|
|
21
|
+
completer: this.completer.bind(this)
|
|
22
|
+
});
|
|
23
|
+
this.setupSignalHandlers();
|
|
24
|
+
}
|
|
25
|
+
getPrompt() {
|
|
26
|
+
return this.options.color ? chalk.green('quoomb> ') : 'quoomb> ';
|
|
27
|
+
}
|
|
28
|
+
setupSignalHandlers() {
|
|
29
|
+
this.rl.on('SIGINT', () => {
|
|
30
|
+
console.log('\nReceived SIGINT. Use .exit to quit.');
|
|
31
|
+
this.rl.prompt();
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async start() {
|
|
35
|
+
console.log('🚀 Quoomb Interactive SQL Shell');
|
|
36
|
+
console.log('Type .help for available commands, or enter SQL statements');
|
|
37
|
+
console.log('');
|
|
38
|
+
// Load plugins from config if provided and autoload is enabled
|
|
39
|
+
if (this.options.config && this.options.autoload !== false) {
|
|
40
|
+
try {
|
|
41
|
+
const config = interpolateConfigEnvVars(this.options.config);
|
|
42
|
+
if (config.autoload !== false) {
|
|
43
|
+
await loadPluginsFromConfig(this.db, config);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.log(`Warning: Error loading plugins from config: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Load enabled plugins at startup (from legacy plugin storage)
|
|
51
|
+
try {
|
|
52
|
+
await loadEnabledPlugins(this.db);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.log(`Warning: Error loading plugins: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
56
|
+
}
|
|
57
|
+
this.rl.prompt();
|
|
58
|
+
this.rl.on('line', async (line) => {
|
|
59
|
+
const trimmed = line.trim();
|
|
60
|
+
if (!trimmed) {
|
|
61
|
+
this.rl.prompt();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Handle dot commands
|
|
65
|
+
if (trimmed.startsWith('.')) {
|
|
66
|
+
try {
|
|
67
|
+
// Check if it's a plugin command first
|
|
68
|
+
if (trimmed.startsWith('.plugin')) {
|
|
69
|
+
await handleDotCommand(trimmed, this.db, this.rl);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Use existing dot commands handler
|
|
73
|
+
const handled = await this.dotCommands.handle(trimmed, this.rl);
|
|
74
|
+
if (!handled) {
|
|
75
|
+
console.log(`Unknown command: ${trimmed}`);
|
|
76
|
+
console.log('Type .help for available commands');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
this.printEnhancedError(error);
|
|
82
|
+
}
|
|
83
|
+
this.rl.prompt();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Handle SQL
|
|
87
|
+
try {
|
|
88
|
+
const results = [];
|
|
89
|
+
for await (const row of this.db.eval(trimmed)) {
|
|
90
|
+
results.push(row);
|
|
91
|
+
}
|
|
92
|
+
if (results.length > 0) {
|
|
93
|
+
console.table(results);
|
|
94
|
+
console.log(`\n${results.length} row(s) returned\n`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log('Query executed successfully\n');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.printEnhancedError(error);
|
|
102
|
+
}
|
|
103
|
+
this.rl.prompt();
|
|
104
|
+
});
|
|
105
|
+
this.rl.on('close', () => {
|
|
106
|
+
console.log('\nGoodbye! 👋');
|
|
107
|
+
this.db.close();
|
|
108
|
+
process.exit(0);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
completer(line) {
|
|
112
|
+
const hits = [];
|
|
113
|
+
// Dot command completion
|
|
114
|
+
if (line.startsWith('.')) {
|
|
115
|
+
const dotCommands = [
|
|
116
|
+
'.help',
|
|
117
|
+
'.tables',
|
|
118
|
+
'.schema',
|
|
119
|
+
'.dump',
|
|
120
|
+
'.read',
|
|
121
|
+
'.exit',
|
|
122
|
+
'.plugin',
|
|
123
|
+
'.plugin install',
|
|
124
|
+
'.plugin list',
|
|
125
|
+
'.plugin enable',
|
|
126
|
+
'.plugin disable',
|
|
127
|
+
'.plugin remove',
|
|
128
|
+
'.plugin config',
|
|
129
|
+
'.plugin reload'
|
|
130
|
+
];
|
|
131
|
+
for (const cmd of dotCommands) {
|
|
132
|
+
if (cmd.startsWith(line)) {
|
|
133
|
+
hits.push(cmd);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// SQL keyword completion
|
|
139
|
+
const sqlKeywords = [
|
|
140
|
+
'SELECT', 'FROM', 'WHERE', 'INSERT', 'UPDATE', 'DELETE',
|
|
141
|
+
'CREATE', 'DROP', 'ALTER', 'TABLE', 'INDEX', 'VIEW',
|
|
142
|
+
'JOIN', 'INNER', 'LEFT', 'RIGHT', 'OUTER', 'ON',
|
|
143
|
+
'GROUP BY', 'ORDER BY', 'HAVING', 'LIMIT', 'OFFSET',
|
|
144
|
+
'AND', 'OR', 'NOT', 'NULL', 'IS', 'IN', 'EXISTS',
|
|
145
|
+
'COUNT', 'SUM', 'AVG', 'MIN', 'MAX', 'DISTINCT'
|
|
146
|
+
];
|
|
147
|
+
const upperLine = line.toUpperCase();
|
|
148
|
+
const lastWord = line.split(/\s+/).pop()?.toUpperCase() || '';
|
|
149
|
+
for (const keyword of sqlKeywords) {
|
|
150
|
+
if (keyword.startsWith(lastWord)) {
|
|
151
|
+
hits.push(line.slice(0, -lastWord.length) + keyword);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return [hits, line];
|
|
156
|
+
}
|
|
157
|
+
printResults(results, executionTime) {
|
|
158
|
+
if (results.length === 0) {
|
|
159
|
+
console.log(chalk.yellow('No rows returned'));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (this.options.json) {
|
|
163
|
+
console.log(JSON.stringify(results, null, 2));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.printTable(results);
|
|
167
|
+
}
|
|
168
|
+
console.log(chalk.gray(`\n${results.length} row(s) (${executionTime}ms)`));
|
|
169
|
+
}
|
|
170
|
+
printTable(results) {
|
|
171
|
+
if (results.length === 0)
|
|
172
|
+
return;
|
|
173
|
+
const columns = Object.keys(results[0]);
|
|
174
|
+
const table = new Table({
|
|
175
|
+
head: columns.map(col => this.options.color ? chalk.cyan(col) : col),
|
|
176
|
+
style: {
|
|
177
|
+
head: this.options.color ? ['cyan'] : []
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
for (const row of results) {
|
|
181
|
+
const values = columns.map(col => {
|
|
182
|
+
const value = row[col];
|
|
183
|
+
if (value === null)
|
|
184
|
+
return this.options.color ? chalk.gray('NULL') : 'NULL';
|
|
185
|
+
if (typeof value === 'string')
|
|
186
|
+
return value;
|
|
187
|
+
return String(value);
|
|
188
|
+
});
|
|
189
|
+
table.push(values);
|
|
190
|
+
}
|
|
191
|
+
console.log(table.toString());
|
|
192
|
+
}
|
|
193
|
+
printError(error) {
|
|
194
|
+
if (this.options.color) {
|
|
195
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.error('Error:', error.message || error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
printHelp() {
|
|
202
|
+
const help = `
|
|
203
|
+
Available commands:
|
|
204
|
+
.help Show this help message
|
|
205
|
+
.exit, .quit Exit the REPL
|
|
206
|
+
.tables List all tables
|
|
207
|
+
.schema [table] Show table schema
|
|
208
|
+
.import <file.csv> Import CSV file as table
|
|
209
|
+
.export <sql> <file> Export query results to file
|
|
210
|
+
|
|
211
|
+
SQL commands:
|
|
212
|
+
Enter any SQL statement to execute it
|
|
213
|
+
|
|
214
|
+
Examples:
|
|
215
|
+
CREATE TABLE users (id INTEGER, name TEXT);
|
|
216
|
+
INSERT INTO users VALUES (1, 'Alice');
|
|
217
|
+
SELECT * FROM users;
|
|
218
|
+
.import data.csv
|
|
219
|
+
.export "SELECT * FROM users" output.json
|
|
220
|
+
`;
|
|
221
|
+
console.log(this.options.color ? chalk.yellow(help) : help);
|
|
222
|
+
}
|
|
223
|
+
close() {
|
|
224
|
+
this.rl.close();
|
|
225
|
+
}
|
|
226
|
+
printEnhancedError(error) {
|
|
227
|
+
if (this.options.color) {
|
|
228
|
+
console.error(chalk.red('━'.repeat(60)));
|
|
229
|
+
console.error(chalk.red.bold('SQL ERROR'));
|
|
230
|
+
console.error(chalk.red('━'.repeat(60)));
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
console.error('━'.repeat(60));
|
|
234
|
+
console.error('SQL ERROR');
|
|
235
|
+
console.error('━'.repeat(60));
|
|
236
|
+
}
|
|
237
|
+
if (error instanceof Error) {
|
|
238
|
+
const errorChain = unwrapError(error);
|
|
239
|
+
if (errorChain.length > 1) {
|
|
240
|
+
// Multiple errors in chain - show formatted chain
|
|
241
|
+
const formattedChain = formatErrorChain(errorChain, false);
|
|
242
|
+
if (this.options.color) {
|
|
243
|
+
// Colorize the error chain
|
|
244
|
+
const colorized = formattedChain
|
|
245
|
+
.replace(/^Error: (.*)$/gm, chalk.red.bold('Error: ') + chalk.red('$1'))
|
|
246
|
+
.replace(/^Caused by: (.*)$/gm, chalk.yellow.bold('Caused by: ') + chalk.yellow('$1'))
|
|
247
|
+
.replace(/\(at line (\d+), column (\d+)\)/g, chalk.cyan('(at line $1, column $2)'));
|
|
248
|
+
console.error(colorized);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
console.error(formattedChain);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Single error - use simpler format
|
|
256
|
+
const errorInfo = errorChain[0];
|
|
257
|
+
let message = errorInfo?.message || error.message;
|
|
258
|
+
if (errorInfo?.line && errorInfo?.column) {
|
|
259
|
+
message += ` (at line ${errorInfo.line}, column ${errorInfo.column})`;
|
|
260
|
+
}
|
|
261
|
+
if (this.options.color) {
|
|
262
|
+
console.error(chalk.red(message));
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
console.error(message);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// Fallback for non-Error objects
|
|
271
|
+
const message = typeof error === 'string' ? error : String(error);
|
|
272
|
+
if (this.options.color) {
|
|
273
|
+
console.error(chalk.red(message));
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
console.error(message);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (this.options.color) {
|
|
280
|
+
console.error(chalk.red('━'.repeat(60)));
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
console.error('━'.repeat(60));
|
|
284
|
+
}
|
|
285
|
+
console.error('');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=repl.js.map
|
package/dist/repl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quereus/quoomb-cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Quoomb CLI - Interactive REPL for Quereus SQL engine",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,21 +28,21 @@
|
|
|
28
28
|
"prepublish": "npm run build"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/node": "^
|
|
32
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
33
|
-
"@typescript-eslint/parser": "^8.
|
|
34
|
-
"eslint": "^9.
|
|
31
|
+
"@types/node": "^25.0.9",
|
|
32
|
+
"@typescript-eslint/eslint-plugin": "^8.53.0",
|
|
33
|
+
"@typescript-eslint/parser": "^8.53.0",
|
|
34
|
+
"eslint": "^9.39.2",
|
|
35
35
|
"rimraf": "^6.1.2",
|
|
36
|
-
"tsx": "^4.
|
|
37
|
-
"typescript": "^5.
|
|
38
|
-
"vitest": "^
|
|
36
|
+
"tsx": "^4.21.0",
|
|
37
|
+
"typescript": "^5.9.3",
|
|
38
|
+
"vitest": "^4.0.17"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@quereus/plugin-loader": "^0.3.
|
|
42
|
-
"@quereus/quereus": "^0.
|
|
43
|
-
"chalk": "^5.
|
|
41
|
+
"@quereus/plugin-loader": "^0.3.2",
|
|
42
|
+
"@quereus/quereus": "^0.16.0",
|
|
43
|
+
"chalk": "^5.6.2",
|
|
44
44
|
"cli-table3": "^0.6.5",
|
|
45
|
-
"commander": "^14.0.
|
|
45
|
+
"commander": "^14.0.2",
|
|
46
46
|
"papaparse": "^5.5.3",
|
|
47
47
|
"readline": "^1.3.0"
|
|
48
48
|
}
|