@toonstore/torm 0.2.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.
@@ -0,0 +1,586 @@
1
+ "use strict";
2
+ /**
3
+ * TORM Studio Server (Node.js)
4
+ * Web-based visual database manager for ToonStoreDB
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.StudioServer = void 0;
44
+ const express_1 = __importDefault(require("express"));
45
+ const ioredis_1 = __importDefault(require("ioredis"));
46
+ const path = __importStar(require("path"));
47
+ const fs = __importStar(require("fs"));
48
+ class StudioServer {
49
+ constructor(options = {}) {
50
+ this.app = (0, express_1.default)();
51
+ this.port = options.port || 4983; // Drizzle Studio uses 4983
52
+ this.host = options.host || 'localhost';
53
+ // Connect to ToonStoreDB from environment or options
54
+ const redisUrl = process.env.TOONSTORE_URL || options.redisUrl;
55
+ const redisHost = process.env.TOONSTORE_HOST || options.redisHost || 'localhost';
56
+ const redisPort = Number(process.env.TOONSTORE_PORT) || options.redisPort || 6379;
57
+ const redisPassword = process.env.TOONSTORE_PASSWORD || undefined;
58
+ if (redisUrl) {
59
+ this.redis = new ioredis_1.default(redisUrl);
60
+ }
61
+ else {
62
+ this.redis = new ioredis_1.default({
63
+ host: redisHost,
64
+ port: redisPort,
65
+ password: redisPassword,
66
+ });
67
+ }
68
+ this.setupMiddleware();
69
+ this.setupRoutes();
70
+ }
71
+ setupMiddleware() {
72
+ this.app.use(express_1.default.json());
73
+ this.app.use(express_1.default.urlencoded({ extended: true }));
74
+ // CORS
75
+ this.app.use((req, res, next) => {
76
+ res.header('Access-Control-Allow-Origin', '*');
77
+ res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
78
+ res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
79
+ if (req.method === 'OPTIONS') {
80
+ return res.sendStatus(200);
81
+ }
82
+ next();
83
+ });
84
+ }
85
+ setupRoutes() {
86
+ // Serve Studio UI
87
+ this.app.get('/', (req, res) => {
88
+ const htmlPath = path.join(__dirname, '..', 'studio', 'index.html');
89
+ if (fs.existsSync(htmlPath)) {
90
+ let html = fs.readFileSync(htmlPath, 'utf-8');
91
+ // Replace the title to show "local.torm.studio"
92
+ html = html.replace('<title>TORM Studio - ToonStore Database Manager</title>', '<title>local.torm.studio - TORM Studio</title>');
93
+ res.send(html);
94
+ }
95
+ else {
96
+ res.status(500).send('Studio UI not found');
97
+ }
98
+ });
99
+ // API: Get all keys (collections)
100
+ this.app.get('/api/keys', async (req, res) => {
101
+ try {
102
+ const pattern = req.query.pattern || '*';
103
+ const keys = await this.redis.keys(pattern);
104
+ // Group keys by collection
105
+ const collections = new Map();
106
+ keys.forEach(key => {
107
+ const parts = key.split(':');
108
+ if (parts.length >= 2 && parts[0] === 'toonstore') {
109
+ const collection = parts[1];
110
+ if (!collections.has(collection)) {
111
+ collections.set(collection, []);
112
+ }
113
+ collections.get(collection).push(key);
114
+ }
115
+ });
116
+ res.json({
117
+ total: keys.length,
118
+ collections: Array.from(collections.entries()).map(([name, keys]) => ({
119
+ name,
120
+ count: keys.length,
121
+ keys,
122
+ })),
123
+ });
124
+ }
125
+ catch (error) {
126
+ res.status(500).json({ error: error.message });
127
+ }
128
+ });
129
+ // API: Get value by key
130
+ this.app.get('/api/key/:key', async (req, res) => {
131
+ try {
132
+ const key = decodeURIComponent(req.params.key);
133
+ const value = await this.redis.get(key);
134
+ if (value === null) {
135
+ return res.status(404).json({ error: 'Key not found' });
136
+ }
137
+ // Try to parse as JSON
138
+ let parsedValue;
139
+ try {
140
+ parsedValue = JSON.parse(value);
141
+ }
142
+ catch {
143
+ parsedValue = value;
144
+ }
145
+ res.json({
146
+ key,
147
+ value: parsedValue,
148
+ type: typeof parsedValue,
149
+ });
150
+ }
151
+ catch (error) {
152
+ res.status(500).json({ error: error.message });
153
+ }
154
+ });
155
+ // API: Set value
156
+ this.app.post('/api/key/:key', async (req, res) => {
157
+ try {
158
+ const key = decodeURIComponent(req.params.key);
159
+ const { value } = req.body;
160
+ const stringValue = typeof value === 'string'
161
+ ? value
162
+ : JSON.stringify(value);
163
+ await this.redis.set(key, stringValue);
164
+ res.json({
165
+ success: true,
166
+ key,
167
+ message: 'Key set successfully'
168
+ });
169
+ }
170
+ catch (error) {
171
+ res.status(500).json({ error: error.message });
172
+ }
173
+ });
174
+ // API: Delete key
175
+ this.app.delete('/api/key/:key', async (req, res) => {
176
+ try {
177
+ const key = decodeURIComponent(req.params.key);
178
+ const result = await this.redis.del(key);
179
+ res.json({
180
+ success: result > 0,
181
+ deleted: result,
182
+ });
183
+ }
184
+ catch (error) {
185
+ res.status(500).json({ error: error.message });
186
+ }
187
+ });
188
+ // API: Database stats
189
+ this.app.get('/api/stats', async (req, res) => {
190
+ try {
191
+ const info = await this.redis.info();
192
+ const dbsize = await this.redis.dbsize();
193
+ // Parse info string
194
+ const lines = info.split('\r\n');
195
+ const stats = {};
196
+ lines.forEach(line => {
197
+ if (line.includes(':')) {
198
+ const [key, value] = line.split(':');
199
+ stats[key.trim()] = value.trim();
200
+ }
201
+ });
202
+ res.json({
203
+ total_keys: dbsize,
204
+ used_memory: stats.used_memory_human || 'N/A',
205
+ connected_clients: stats.connected_clients || 'N/A',
206
+ uptime_days: stats.uptime_in_days || 'N/A',
207
+ redis_version: stats.redis_version || 'N/A',
208
+ });
209
+ }
210
+ catch (error) {
211
+ res.status(500).json({ error: error.message });
212
+ }
213
+ });
214
+ // API: Get collection data
215
+ this.app.get('/api/collection/:name', async (req, res) => {
216
+ try {
217
+ const collection = req.params.name;
218
+ // Special handling for _migrations
219
+ if (collection === '_migrations') {
220
+ const migrationsData = await this.redis.get('toonstore:_migrations');
221
+ if (migrationsData) {
222
+ try {
223
+ const migrations = JSON.parse(migrationsData);
224
+ const documents = Array.isArray(migrations)
225
+ ? migrations.map((name) => ({
226
+ _id: name,
227
+ name,
228
+ appliedAt: 'N/A'
229
+ }))
230
+ : [];
231
+ return res.json({
232
+ collection,
233
+ count: documents.length,
234
+ documents,
235
+ });
236
+ }
237
+ catch (e) {
238
+ return res.json({
239
+ collection,
240
+ count: 0,
241
+ documents: [],
242
+ });
243
+ }
244
+ }
245
+ return res.json({
246
+ collection,
247
+ count: 0,
248
+ documents: [],
249
+ });
250
+ }
251
+ // Regular collections
252
+ const pattern = `toonstore:${collection}:*`;
253
+ const keys = await this.redis.keys(pattern);
254
+ const documents = [];
255
+ for (const key of keys) {
256
+ const value = await this.redis.get(key);
257
+ if (value) {
258
+ try {
259
+ documents.push(JSON.parse(value));
260
+ }
261
+ catch {
262
+ documents.push({ _raw: value });
263
+ }
264
+ }
265
+ }
266
+ res.json({
267
+ collection,
268
+ count: documents.length,
269
+ documents,
270
+ });
271
+ }
272
+ catch (error) {
273
+ res.status(500).json({ error: error.message });
274
+ }
275
+ });
276
+ // API: Health check
277
+ this.app.get('/api/health', async (req, res) => {
278
+ try {
279
+ await this.redis.ping();
280
+ res.json({
281
+ status: 'ok',
282
+ database: 'connected',
283
+ timestamp: new Date().toISOString(),
284
+ });
285
+ }
286
+ catch (error) {
287
+ res.status(500).json({
288
+ status: 'error',
289
+ error: error.message
290
+ });
291
+ }
292
+ });
293
+ // API: Get migrations status
294
+ this.app.get('/api/migrations/status', async (req, res) => {
295
+ try {
296
+ const { MigrationRunner } = require('./migrations');
297
+ const runner = new MigrationRunner({
298
+ host: this.redis.options.host,
299
+ port: this.redis.options.port,
300
+ }, process.env.MIGRATIONS_DIR || path.join(process.cwd(), 'migrations'));
301
+ const applied = await runner.getAppliedMigrations();
302
+ const pending = await runner.getPendingMigrations();
303
+ await runner.close();
304
+ res.json({
305
+ applied: applied.map((name) => ({
306
+ name,
307
+ appliedAt: new Date().toISOString(), // TODO: Store actual timestamp
308
+ })),
309
+ pending: pending.map((m) => ({
310
+ name: m.name,
311
+ timestamp: m.timestamp,
312
+ })),
313
+ });
314
+ }
315
+ catch (error) {
316
+ res.status(500).json({ error: error.message });
317
+ }
318
+ });
319
+ // API: Run migrations up
320
+ this.app.post('/api/migrations/up', async (req, res) => {
321
+ try {
322
+ const { MigrationRunner } = require('./migrations');
323
+ const { count } = req.body || {};
324
+ const runner = new MigrationRunner({
325
+ host: this.redis.options.host,
326
+ port: this.redis.options.port,
327
+ }, process.env.MIGRATIONS_DIR || path.join(process.cwd(), 'migrations'));
328
+ await runner.up(count);
329
+ await runner.close();
330
+ res.json({ success: true, message: 'Migrations applied successfully' });
331
+ }
332
+ catch (error) {
333
+ res.status(500).json({ error: error.message });
334
+ }
335
+ });
336
+ // API: Rollback migrations
337
+ this.app.post('/api/migrations/down', async (req, res) => {
338
+ try {
339
+ const { MigrationRunner } = require('./migrations');
340
+ const { count } = req.body || { count: 1 };
341
+ const runner = new MigrationRunner({
342
+ host: this.redis.options.host,
343
+ port: this.redis.options.port,
344
+ }, process.env.MIGRATIONS_DIR || path.join(process.cwd(), 'migrations'));
345
+ await runner.down(count);
346
+ await runner.close();
347
+ res.json({ success: true, message: 'Migration rolled back successfully' });
348
+ }
349
+ catch (error) {
350
+ res.status(500).json({ error: error.message });
351
+ }
352
+ });
353
+ // API: Create migration
354
+ this.app.post('/api/migrations/create', async (req, res) => {
355
+ try {
356
+ const { MigrationRunner } = require('./migrations');
357
+ const { name } = req.body;
358
+ if (!name) {
359
+ return res.status(400).json({ error: 'Migration name is required' });
360
+ }
361
+ const runner = new MigrationRunner({
362
+ host: this.redis.options.host,
363
+ port: this.redis.options.port,
364
+ }, process.env.MIGRATIONS_DIR || path.join(process.cwd(), 'migrations'));
365
+ await runner.create(name);
366
+ await runner.close();
367
+ const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];
368
+ const filename = `${timestamp}_${name}.js`;
369
+ res.json({ success: true, filename, message: 'Migration created successfully' });
370
+ }
371
+ catch (error) {
372
+ res.status(500).json({ error: error.message });
373
+ }
374
+ });
375
+ // API: Generate TypeScript types
376
+ this.app.post('/api/generate/types', async (req, res) => {
377
+ try {
378
+ const keys = await this.redis.keys('toonstore:*');
379
+ if (keys.length === 0) {
380
+ return res.json({
381
+ success: true,
382
+ models: [],
383
+ message: 'No data found in database'
384
+ });
385
+ }
386
+ // Group by model
387
+ const modelMap = {};
388
+ for (const key of keys) {
389
+ const parts = key.split(':');
390
+ if (parts.length >= 3 && parts[0] === 'toonstore') {
391
+ const modelName = parts[1];
392
+ if (modelName === '_migrations')
393
+ continue;
394
+ if (!modelMap[modelName]) {
395
+ modelMap[modelName] = [];
396
+ }
397
+ const data = await this.redis.get(key);
398
+ if (data) {
399
+ try {
400
+ modelMap[modelName].push(JSON.parse(data));
401
+ }
402
+ catch (e) {
403
+ // Skip invalid JSON
404
+ }
405
+ }
406
+ }
407
+ }
408
+ const modelNames = Object.keys(modelMap);
409
+ // Generate types
410
+ let output = `/**\n * Auto-generated TypeScript types from ToonStoreDB\n * Generated: ${new Date().toISOString()}\n * \n * āš ļø DO NOT EDIT MANUALLY - This file is auto-generated\n * Run 'npx torm generate' to regenerate\n */\n\n`;
411
+ for (const modelName of modelNames) {
412
+ const documents = modelMap[modelName];
413
+ const fieldTypes = {};
414
+ for (const doc of documents) {
415
+ for (const [field, value] of Object.entries(doc)) {
416
+ if (!fieldTypes[field]) {
417
+ fieldTypes[field] = new Set();
418
+ }
419
+ fieldTypes[field].add(this.inferType(value));
420
+ }
421
+ }
422
+ const interfaceName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
423
+ output += `export interface ${interfaceName} {\n`;
424
+ const fields = Object.keys(fieldTypes).sort((a, b) => {
425
+ if (a.startsWith('_') && !b.startsWith('_'))
426
+ return -1;
427
+ if (!a.startsWith('_') && b.startsWith('_'))
428
+ return 1;
429
+ return a.localeCompare(b);
430
+ });
431
+ for (const field of fields) {
432
+ const types = Array.from(fieldTypes[field]);
433
+ const typeStr = types.length > 1 ? types.join(' | ') : types[0];
434
+ const isOptional = documents.some((doc) => !(field in doc));
435
+ const optionalMarker = isOptional ? '?' : '';
436
+ output += ` ${field}${optionalMarker}: ${typeStr};\n`;
437
+ }
438
+ output += `}\n\n`;
439
+ }
440
+ // Write to file
441
+ const outputDir = path.join(process.cwd(), 'src', 'generated');
442
+ const outputFile = path.join(outputDir, 'torm-types.ts');
443
+ if (!fs.existsSync(outputDir)) {
444
+ fs.mkdirSync(outputDir, { recursive: true });
445
+ }
446
+ fs.writeFileSync(outputFile, output);
447
+ res.json({
448
+ success: true,
449
+ models: modelNames,
450
+ outputFile,
451
+ message: `Generated types for ${modelNames.length} model(s)`,
452
+ });
453
+ }
454
+ catch (error) {
455
+ res.status(500).json({ error: error.message });
456
+ }
457
+ });
458
+ // API: Preview generated types
459
+ this.app.get('/api/generate/preview', async (req, res) => {
460
+ try {
461
+ const keys = await this.redis.keys('toonstore:*');
462
+ if (keys.length === 0) {
463
+ return res.send('// No data found in database');
464
+ }
465
+ // Group by model
466
+ const modelMap = {};
467
+ for (const key of keys) {
468
+ const parts = key.split(':');
469
+ if (parts.length >= 3 && parts[0] === 'toonstore') {
470
+ const modelName = parts[1];
471
+ if (modelName === '_migrations')
472
+ continue;
473
+ if (!modelMap[modelName]) {
474
+ modelMap[modelName] = [];
475
+ }
476
+ const data = await this.redis.get(key);
477
+ if (data) {
478
+ try {
479
+ modelMap[modelName].push(JSON.parse(data));
480
+ }
481
+ catch (e) {
482
+ // Skip
483
+ }
484
+ }
485
+ }
486
+ }
487
+ const modelNames = Object.keys(modelMap);
488
+ // Generate types
489
+ let output = `/**\n * Auto-generated TypeScript types from ToonStoreDB\n * Generated: ${new Date().toISOString()}\n */\n\n`;
490
+ for (const modelName of modelNames) {
491
+ const documents = modelMap[modelName];
492
+ const fieldTypes = {};
493
+ for (const doc of documents) {
494
+ for (const [field, value] of Object.entries(doc)) {
495
+ if (!fieldTypes[field]) {
496
+ fieldTypes[field] = new Set();
497
+ }
498
+ fieldTypes[field].add(this.inferType(value));
499
+ }
500
+ }
501
+ const interfaceName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
502
+ output += `export interface ${interfaceName} {\n`;
503
+ const fields = Object.keys(fieldTypes).sort();
504
+ for (const field of fields) {
505
+ const types = Array.from(fieldTypes[field]);
506
+ const typeStr = types.length > 1 ? types.join(' | ') : types[0];
507
+ const isOptional = documents.some((doc) => !(field in doc));
508
+ output += ` ${field}${isOptional ? '?' : ''}: ${typeStr};\n`;
509
+ }
510
+ output += `}\n\n`;
511
+ }
512
+ res.contentType('text/typescript').send(output);
513
+ }
514
+ catch (error) {
515
+ res.status(500).send(`// Error: ${error.message}`);
516
+ }
517
+ });
518
+ }
519
+ inferType(value) {
520
+ if (value === null)
521
+ return 'null';
522
+ if (value === undefined)
523
+ return 'undefined';
524
+ const type = typeof value;
525
+ if (type === 'string')
526
+ return 'string';
527
+ if (type === 'number')
528
+ return 'number';
529
+ if (type === 'boolean')
530
+ return 'boolean';
531
+ if (Array.isArray(value)) {
532
+ if (value.length === 0)
533
+ return 'any[]';
534
+ const elementTypes = new Set(value.map((v) => this.inferType(v)));
535
+ if (elementTypes.size === 1) {
536
+ return `${Array.from(elementTypes)[0]}[]`;
537
+ }
538
+ return `(${Array.from(elementTypes).join(' | ')})[]`;
539
+ }
540
+ if (type === 'object')
541
+ return 'any';
542
+ return 'any';
543
+ }
544
+ async start() {
545
+ return new Promise(async (resolve, reject) => {
546
+ // Test connection first
547
+ console.log('šŸ”Œ Testing database connection...');
548
+ try {
549
+ await this.redis.ping();
550
+ console.log('āœ… Connected to ToonStoreDB\n');
551
+ }
552
+ catch (error) {
553
+ console.error('āŒ Failed to connect to ToonStoreDB:');
554
+ console.error(' ', error.message);
555
+ console.error('\nšŸ’” Check your torm.config.ts credentials');
556
+ console.error(' or make sure ToonStoreDB is running\n');
557
+ process.exit(1);
558
+ }
559
+ this.app.listen(this.port, '127.0.0.1', () => {
560
+ console.log(`\nšŸŽØ TORM Studio running at:`);
561
+ console.log(` → http://localhost:${this.port}\n`);
562
+ console.log(`šŸ’” Press Ctrl+C to stop\n`);
563
+ resolve();
564
+ });
565
+ });
566
+ }
567
+ async stop() {
568
+ await this.redis.quit();
569
+ }
570
+ }
571
+ exports.StudioServer = StudioServer;
572
+ // CLI usage
573
+ if (require.main === module) {
574
+ const port = process.env.PORT ? parseInt(process.env.PORT) : 4983;
575
+ const server = new StudioServer({ port });
576
+ server.start().catch((err) => {
577
+ console.error('Failed to start studio server:', err);
578
+ process.exit(1);
579
+ });
580
+ process.on('SIGINT', async () => {
581
+ console.log('\n\nšŸ‘‹ Shutting down TORM Studio...');
582
+ await server.stop();
583
+ process.exit(0);
584
+ });
585
+ }
586
+ //# sourceMappingURL=studio-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-server.js","sourceRoot":"","sources":["../src/studio-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@toonstore/torm",
3
- "version": "0.2.0",
4
- "description": "ToonStore ORM client for Node.js",
3
+ "version": "0.4.0",
4
+ "description": "ToonStoreDB ORM client for Node.js",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
@@ -9,24 +9,32 @@
9
9
  "dev": "npx tsc --watch",
10
10
  "example": "node examples/basic-usage.js",
11
11
  "test": "echo \"No tests yet\" && exit 0",
12
- "prepublishOnly": "npm run build"
12
+ "prepublishOnly": "npm run build",
13
+ "studio": "node dist/cli.js studio",
14
+ "generate": "node dist/cli.js generate",
15
+ "migrate": "node dist/cli.js migrate"
16
+ },
17
+ "bin": {
18
+ "torm": "dist/cli.js"
13
19
  },
14
20
  "publishConfig": {
15
21
  "access": "public"
16
22
  },
17
23
  "keywords": [
24
+ "toonstoredb",
18
25
  "toonstore",
19
26
  "orm",
20
27
  "database",
21
- "redis",
22
28
  "toon"
23
29
  ],
24
30
  "author": "ToonStore Team",
25
31
  "license": "MIT",
26
32
  "dependencies": {
33
+ "express": "^4.18.2",
27
34
  "ioredis": "^5.3.0"
28
35
  },
29
36
  "devDependencies": {
37
+ "@types/express": "^4.17.21",
30
38
  "@types/node": "^20.19.27",
31
39
  "typescript": "^5.9.3"
32
40
  }