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 +24 -0
- package/dist/bin/mongolite-debug.d.ts +2 -0
- package/dist/bin/mongolite-debug.js +115 -0
- package/dist/bin/mongolite-debug.js.map +1 -0
- package/dist/debugger/query-debugger.d.ts +22 -0
- package/dist/debugger/query-debugger.js +258 -0
- package/dist/debugger/query-debugger.js.map +1 -0
- package/package.json +6 -2
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,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
|
+
"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",
|