mongolite-ts 0.3.0 → 0.4.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 CHANGED
@@ -15,6 +15,7 @@ A MongoDB-like client that uses SQLite as its underlying persistent store. Writt
15
15
  * Support for querying JSON fields.
16
16
  * Written in TypeScript with strong typing.
17
17
  * 100% test coverage (aiming for).
18
+ * **Interactive Query Debugger** - Debug complex queries with `npx mongolite-debug`
18
19
 
19
20
  ## Installation
20
21
 
@@ -112,6 +113,29 @@ async function main() {
112
113
  main();
113
114
  ```
114
115
 
116
+ ## Query Debugger
117
+
118
+ MongoLite includes an interactive query debugger to help you debug complex queries and understand how MongoDB-style filters are converted to SQL.
119
+
120
+ ```bash
121
+ # Start the debugger
122
+ npx mongolite-debug
123
+
124
+ # Use with your specific database
125
+ npx mongolite-debug -d ./path/to/your/database.db
126
+
127
+ # Start with a specific collection
128
+ npx mongolite-debug -c users --verbose
129
+ ```
130
+
131
+ The debugger provides interactive commands to:
132
+ - Convert find queries to SQL and see the generated queries
133
+ - Execute raw SQL queries for testing
134
+ - Sample data from collections
135
+ - Compare MongoDB-style queries with optimized SQL
136
+
137
+ See [DEBUGGER.md](./docs/DEBUGGER.md) for detailed usage instructions and examples.
138
+
115
139
  ## API
116
140
 
117
141
  ### `MongoLite`
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ import { QueryDebugger } from '../debugger/query-debugger.js';
3
+ import path from 'path';
4
+ // CLI argument parsing
5
+ function parseArgs() {
6
+ const args = process.argv.slice(2);
7
+ const options = {};
8
+ for (let i = 0; i < args.length; i++) {
9
+ const arg = args[i];
10
+ if (arg === '--verbose' || arg === '-v') {
11
+ options.verbose = true;
12
+ }
13
+ else if (arg === '--collection' || arg === '-c') {
14
+ options.collection = args[++i];
15
+ }
16
+ else if (arg === '--database' || arg === '-d') {
17
+ options.database = args[++i];
18
+ }
19
+ else if (arg === '--help' || arg === '-h') {
20
+ options.help = true;
21
+ }
22
+ }
23
+ return options;
24
+ }
25
+ function showHelp() {
26
+ console.log('MongoLite Query Debugger');
27
+ console.log('');
28
+ console.log('Interactive debugging tool for MongoLite queries.');
29
+ console.log('');
30
+ console.log('Usage: npx mongolite-debug [options]');
31
+ console.log('');
32
+ console.log('Options:');
33
+ console.log(' -d, --database <path> Database file path (default: ./mongolite.db)');
34
+ console.log(' -c, --collection <name> Initial collection to use');
35
+ console.log(' -v, --verbose Enable verbose output');
36
+ console.log(' -h, --help Show this help');
37
+ console.log('');
38
+ console.log('Interactive Commands:');
39
+ console.log(' .help Show available commands');
40
+ console.log(' .collections List all collections');
41
+ console.log(' .use <collection> Select a collection to work with');
42
+ console.log(' .find <filter> Convert find filter to SQL and execute');
43
+ console.log(' .sql <query> Execute raw SQL query');
44
+ console.log(' .last Show last generated SQL');
45
+ console.log(' .sample [count] Show sample documents from current collection');
46
+ console.log(' .exit Exit the debugger');
47
+ console.log('');
48
+ console.log('Examples:');
49
+ console.log(' npx mongolite-debug -d ./myapp.db -c users');
50
+ console.log(' npx mongolite-debug --verbose');
51
+ console.log('');
52
+ console.log(' # Inside the debugger:');
53
+ console.log(' .use users');
54
+ console.log(' .find {"age": {"$gt": 25}}');
55
+ console.log(' .sql SELECT * FROM users WHERE json_extract(data, "$.age") > 25');
56
+ console.log('');
57
+ }
58
+ async function main() {
59
+ const options = parseArgs();
60
+ if (options.help) {
61
+ showHelp();
62
+ process.exit(0);
63
+ }
64
+ // Set default database path if not provided
65
+ if (!options.database) {
66
+ // Look for common database files in the current directory
67
+ const cwd = process.cwd();
68
+ const commonNames = [
69
+ 'mongolite.db',
70
+ 'mongolite.sqlite',
71
+ 'database.db',
72
+ 'database.sqlite',
73
+ 'app.db',
74
+ 'app.sqlite'
75
+ ];
76
+ // Check if any common database files exist
77
+ const { existsSync } = await import('fs');
78
+ let foundDb = false;
79
+ for (const name of commonNames) {
80
+ const dbPath = path.join(cwd, name);
81
+ if (existsSync(dbPath)) {
82
+ options.database = dbPath;
83
+ foundDb = true;
84
+ break;
85
+ }
86
+ }
87
+ if (!foundDb) {
88
+ options.database = path.join(cwd, 'mongolite.db');
89
+ }
90
+ }
91
+ console.log('🔍 MongoLite Query Debugger (npx version)');
92
+ console.log(`📁 Database: ${options.database}`);
93
+ if (options.collection) {
94
+ console.log(`📋 Initial collection: ${options.collection}`);
95
+ }
96
+ console.log('');
97
+ try {
98
+ const queryDebugger = new QueryDebugger(options);
99
+ await queryDebugger.start();
100
+ }
101
+ catch (error) {
102
+ console.error('Fatal error:', error instanceof Error ? error.message : error);
103
+ if (error instanceof Error && error.message.includes('SQLITE_CANTOPEN')) {
104
+ console.error('');
105
+ console.error('💡 Tip: Make sure the database file exists or specify a different path with -d');
106
+ console.error(' Example: npx mongolite-debug -d ./path/to/your/database.db');
107
+ }
108
+ process.exit(1);
109
+ }
110
+ }
111
+ main().catch(error => {
112
+ console.error('Unexpected error:', error);
113
+ process.exit(1);
114
+ });
115
+ //# sourceMappingURL=mongolite-debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongolite-debug.js","sourceRoot":"","sources":["../../src/bin/mongolite-debug.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface DebuggerOptions {
2
+ verbose?: boolean;
3
+ collection?: string;
4
+ database?: string;
5
+ }
6
+ export declare class QueryDebugger {
7
+ private client;
8
+ private rl;
9
+ private currentCollection;
10
+ private lastFilter;
11
+ private lastSqlQuery;
12
+ constructor(options?: DebuggerOptions);
13
+ start(): Promise<void>;
14
+ private handleCommand;
15
+ private showHelp;
16
+ private listCollections;
17
+ private handleFindCommand;
18
+ private handleSqlCommand;
19
+ private showLastQuery;
20
+ private showSample;
21
+ private cleanup;
22
+ }
@@ -0,0 +1,258 @@
1
+ import { MongoLite } from '../index.js';
2
+ import { FindCursor } from '../cursors/findCursor.js';
3
+ import * as readline from 'readline';
4
+ import path from 'path';
5
+ export class QueryDebugger {
6
+ constructor(options = {}) {
7
+ this.currentCollection = null;
8
+ this.lastFilter = null;
9
+ this.lastSqlQuery = null;
10
+ const dbPath = options.database || path.join(process.cwd(), 'mongolite.db');
11
+ this.client = new MongoLite(dbPath, { verbose: options.verbose });
12
+ this.rl = readline.createInterface({
13
+ input: process.stdin,
14
+ output: process.stdout,
15
+ prompt: 'mongolite-debug> '
16
+ });
17
+ if (options.collection) {
18
+ this.currentCollection = options.collection;
19
+ }
20
+ }
21
+ async start() {
22
+ console.log('Commands:');
23
+ console.log(' .help - Show this help');
24
+ console.log(' .collections - List all collections');
25
+ console.log(' .use <collection> - Select a collection to work with');
26
+ console.log(' .find <filter> - Convert find filter to SQL and execute');
27
+ console.log(' .sql <query> - Execute raw SQL query');
28
+ console.log(' .last - Show last generated SQL');
29
+ console.log(' .sample [count] - Show sample documents from current collection');
30
+ console.log(' .exit - Exit the debugger');
31
+ console.log('');
32
+ try {
33
+ await this.client.connect();
34
+ console.log('✅ Connected to database.');
35
+ }
36
+ catch (error) {
37
+ console.error('❌ Failed to connect to database:', error instanceof Error ? error.message : error);
38
+ throw error;
39
+ }
40
+ if (this.currentCollection) {
41
+ console.log(`Current collection: ${this.currentCollection}`);
42
+ }
43
+ this.rl.prompt();
44
+ this.rl.on('line', async (input) => {
45
+ const trimmed = input.trim();
46
+ if (trimmed === '.exit') {
47
+ await this.cleanup();
48
+ return;
49
+ }
50
+ try {
51
+ await this.handleCommand(trimmed);
52
+ }
53
+ catch (error) {
54
+ console.error('Error:', error instanceof Error ? error.message : error);
55
+ }
56
+ this.rl.prompt();
57
+ });
58
+ this.rl.on('close', async () => {
59
+ await this.cleanup();
60
+ });
61
+ }
62
+ async handleCommand(input) {
63
+ if (input === '.help') {
64
+ this.showHelp();
65
+ return;
66
+ }
67
+ if (input === '.collections') {
68
+ await this.listCollections();
69
+ return;
70
+ }
71
+ if (input.startsWith('.use ')) {
72
+ const collection = input.slice(5).trim();
73
+ this.currentCollection = collection;
74
+ console.log(`Switched to collection: ${collection}`);
75
+ return;
76
+ }
77
+ if (input.startsWith('.find ')) {
78
+ await this.handleFindCommand(input.slice(6).trim());
79
+ return;
80
+ }
81
+ if (input.startsWith('.sql ')) {
82
+ await this.handleSqlCommand(input.slice(5).trim());
83
+ return;
84
+ }
85
+ if (input === '.last') {
86
+ this.showLastQuery();
87
+ return;
88
+ }
89
+ if (input.startsWith('.sample')) {
90
+ const parts = input.split(' ');
91
+ const count = parts.length > 1 ? parseInt(parts[1]) || 5 : 5;
92
+ await this.showSample(count);
93
+ return;
94
+ }
95
+ console.log('Unknown command. Type .help for available commands.');
96
+ }
97
+ showHelp() {
98
+ console.log('');
99
+ console.log('Available commands:');
100
+ console.log(' .help - Show this help');
101
+ console.log(' .collections - List all collections');
102
+ console.log(' .use <collection> - Select a collection to work with');
103
+ console.log(' .find <filter> - Convert find filter to SQL and execute');
104
+ console.log(' .sql <query> - Execute raw SQL query');
105
+ console.log(' .last - Show last generated SQL');
106
+ console.log(' .sample [count] - Show sample documents from current collection');
107
+ console.log(' .exit - Exit the debugger');
108
+ console.log('');
109
+ console.log('Examples:');
110
+ console.log(' .use users');
111
+ console.log(' .find {"age": {"$gt": 25}}');
112
+ console.log(' .find {"name": "John", "age": {"$in": [25, 30, 35]}}');
113
+ console.log(' .sql SELECT * FROM users WHERE json_extract(data, "$.age") > 25');
114
+ console.log('');
115
+ }
116
+ async listCollections() {
117
+ try {
118
+ const collections = await this.client.listCollections().toArray();
119
+ if (collections.length === 0) {
120
+ console.log('No collections found.');
121
+ }
122
+ else {
123
+ console.log('Collections:');
124
+ collections.forEach(collection => {
125
+ const marker = collection === this.currentCollection ? ' (current)' : '';
126
+ console.log(` - ${collection}${marker}`);
127
+ });
128
+ }
129
+ }
130
+ catch (error) {
131
+ console.error('Error listing collections:', error instanceof Error ? error.message : error);
132
+ }
133
+ }
134
+ async handleFindCommand(filterStr) {
135
+ if (!this.currentCollection) {
136
+ console.log('No collection selected. Use .use <collection> first.');
137
+ return;
138
+ }
139
+ let filter;
140
+ try {
141
+ filter = JSON.parse(filterStr);
142
+ }
143
+ catch (error) {
144
+ console.log('Invalid JSON filter:', error instanceof Error ? error.message : error);
145
+ return;
146
+ }
147
+ this.lastFilter = filter;
148
+ // Create a collection and a find cursor to extract the SQL
149
+ const collection = this.client.collection(this.currentCollection);
150
+ // We need to access the internal SQL generation. Let's create a custom cursor
151
+ // that exposes the SQL generation logic
152
+ const debugCursor = new DebugFindCursor(collection.db, this.currentCollection, filter, { verbose: true });
153
+ this.lastSqlQuery = debugCursor.getSQL();
154
+ console.log('');
155
+ console.log('📝 Generated SQL:');
156
+ console.log('Query:', this.lastSqlQuery.sql);
157
+ console.log('Parameters:', JSON.stringify(this.lastSqlQuery.params));
158
+ console.log('');
159
+ // Execute the query and show results
160
+ try {
161
+ const results = await debugCursor.toArray();
162
+ console.log(`📊 Results (${results.length} documents):`);
163
+ if (results.length > 0) {
164
+ results.forEach((doc, index) => {
165
+ console.log(`[${index}]`, JSON.stringify(doc, null, 2));
166
+ });
167
+ }
168
+ else {
169
+ console.log('No documents found.');
170
+ }
171
+ }
172
+ catch (error) {
173
+ console.error('Execution error:', error instanceof Error ? error.message : error);
174
+ }
175
+ }
176
+ async handleSqlCommand(sqlQuery) {
177
+ if (!this.currentCollection) {
178
+ console.log('No collection selected. Use .use <collection> first.');
179
+ return;
180
+ }
181
+ try {
182
+ // Get the database instance to execute raw SQL
183
+ const db = this.client.db;
184
+ console.log('');
185
+ console.log('🔧 Executing SQL:');
186
+ console.log(sqlQuery);
187
+ console.log('');
188
+ const results = await db.all(sqlQuery);
189
+ console.log(`📊 Results (${results.length} rows):`);
190
+ if (results.length > 0) {
191
+ results.forEach((row, index) => {
192
+ console.log(`[${index}]`, JSON.stringify(row, null, 2));
193
+ });
194
+ }
195
+ else {
196
+ console.log('No rows returned.');
197
+ }
198
+ }
199
+ catch (error) {
200
+ console.error('SQL execution error:', error instanceof Error ? error.message : error);
201
+ }
202
+ }
203
+ showLastQuery() {
204
+ if (!this.lastSqlQuery) {
205
+ console.log('No previous query to show.');
206
+ return;
207
+ }
208
+ console.log('');
209
+ console.log('📝 Last Generated SQL:');
210
+ console.log('Query:', this.lastSqlQuery.sql);
211
+ console.log('Parameters:', JSON.stringify(this.lastSqlQuery.params));
212
+ if (this.lastFilter) {
213
+ console.log('Original Filter:', JSON.stringify(this.lastFilter, null, 2));
214
+ }
215
+ console.log('');
216
+ }
217
+ async showSample(count) {
218
+ if (!this.currentCollection) {
219
+ console.log('No collection selected. Use .use <collection> first.');
220
+ return;
221
+ }
222
+ try {
223
+ const collection = this.client.collection(this.currentCollection);
224
+ const results = await collection.find({}).limit(count).toArray();
225
+ console.log('');
226
+ console.log(`📋 Sample documents from "${this.currentCollection}" (${results.length} of ${count} requested):`);
227
+ if (results.length > 0) {
228
+ results.forEach((doc, index) => {
229
+ console.log(`[${index}]`, JSON.stringify(doc, null, 2));
230
+ });
231
+ }
232
+ else {
233
+ console.log('Collection is empty.');
234
+ }
235
+ console.log('');
236
+ }
237
+ catch (error) {
238
+ console.error('Error fetching sample:', error instanceof Error ? error.message : error);
239
+ }
240
+ }
241
+ async cleanup() {
242
+ console.log('\nClosing database connection...');
243
+ await this.client.close();
244
+ this.rl.close();
245
+ process.exit(0);
246
+ }
247
+ }
248
+ // Extended FindCursor that exposes SQL generation
249
+ class DebugFindCursor extends FindCursor {
250
+ constructor(db, collectionName, filter, options = {}) {
251
+ super(db, collectionName, filter, options);
252
+ }
253
+ getSQL() {
254
+ // Access the private queryParts property
255
+ return this.queryParts;
256
+ }
257
+ }
258
+ //# sourceMappingURL=query-debugger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-debugger.js","sourceRoot":"","sources":["../../src/debugger/query-debugger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "mongolite-ts",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "A MongoDB-like client using SQLite as a persistent store, written in TypeScript.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "mongolite-debug": "dist/bin/mongolite-debug.js"
10
+ },
8
11
  "scripts": {
9
12
  "build": "tsc",
10
13
  "test": "node --import tsx --test tests/*.test.ts",
@@ -15,7 +18,8 @@
15
18
  "verify-build": "node --import tsx scripts/verify-build.js",
16
19
  "test-third-party": "node scripts/test-third-party-usage.js",
17
20
  "test:all": "npm run lint && npm run test && npm run verify-build && npm run test-third-party",
18
- "benchmark": "npx tsx scripts/benchmark.ts"
21
+ "benchmark": "npx tsx scripts/benchmark.ts",
22
+ "debug-queries": "npx tsx scripts/query-debugger.ts"
19
23
  },
20
24
  "repository": {
21
25
  "type": "git",