@toonstore/torm 0.2.0 → 0.3.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/dist/cli.js ADDED
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * TORM CLI
5
+ * Command-line interface for ToonStoreDB ORM
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const child_process_1 = require("child_process");
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs"));
44
+ const command = process.argv[2];
45
+ const args = process.argv.slice(3);
46
+ function printHelp() {
47
+ console.log(`
48
+ TORM CLI - ToonStoreDB ORM Tools
49
+
50
+ Usage:
51
+ torm <command> [options]
52
+
53
+ Commands:
54
+ studio Launch TORM Studio (visual database manager)
55
+ generate Generate TypeScript types from your schema
56
+ migrate Run database migrations
57
+ help Show this help message
58
+
59
+ Examples:
60
+ torm studio # Start TORM Studio at http://localhost:4983
61
+ torm studio --port 8080 # Start on custom port
62
+ torm generate # Generate types from schema
63
+ torm migrate # Run pending migrations
64
+
65
+ Config:
66
+ Create torm.config.ts in your project root with DB credentials
67
+
68
+ For more info, visit: https://github.com/toonstore/torm
69
+ `);
70
+ }
71
+ function findConfig() {
72
+ const configPaths = [
73
+ path.join(process.cwd(), 'torm.config.ts'),
74
+ path.join(process.cwd(), 'torm.config.js'),
75
+ ];
76
+ for (const configPath of configPaths) {
77
+ if (fs.existsSync(configPath)) {
78
+ console.log(`šŸ“ Found config: ${configPath}\n`);
79
+ try {
80
+ // For TS files, we'd need to compile them first
81
+ // For now, suggest JS or use default config
82
+ if (configPath.endsWith('.js')) {
83
+ const config = require(configPath);
84
+ return config.default || config;
85
+ }
86
+ }
87
+ catch (err) {
88
+ console.error(`āš ļø Error loading config: ${err.message}\n`);
89
+ }
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ async function studio() {
95
+ console.log('šŸš€ Starting TORM Studio...\n');
96
+ // Load config
97
+ const config = findConfig();
98
+ if (!config) {
99
+ console.log('āš ļø No torm.config.ts found in current directory\n');
100
+ console.log('Creating a default config for you...\n');
101
+ // Create example config
102
+ const exampleConfig = `/**
103
+ * TORM Configuration
104
+ * Define your ToonStoreDB connection here
105
+ */
106
+
107
+ export default {
108
+ // ToonStoreDB connection
109
+ dbCredentials: {
110
+ host: 'localhost',
111
+ port: 6379,
112
+ // For cloud/remote databases:
113
+ // password: process.env.TOONSTORE_PASSWORD,
114
+ // url: 'redis://user:pass@host:port',
115
+ },
116
+
117
+ // Studio configuration
118
+ studio: {
119
+ port: 4983, // Studio port (like Drizzle)
120
+ },
121
+ };
122
+ `;
123
+ fs.writeFileSync(path.join(process.cwd(), 'torm.config.ts'), exampleConfig);
124
+ console.log('āœ… Created torm.config.ts');
125
+ console.log(' Edit this file with your database credentials\n');
126
+ console.log(' Then run `torm studio` again\n');
127
+ process.exit(0);
128
+ }
129
+ // Get port from args or config or default
130
+ let port = 4983; // Drizzle uses 4983
131
+ if (args.includes('--port')) {
132
+ port = parseInt(args[args.indexOf('--port') + 1]);
133
+ }
134
+ else if (config.studio?.port) {
135
+ port = config.studio.port;
136
+ }
137
+ // Check if studio-server.js exists
138
+ const serverPath = path.join(__dirname, 'studio-server.js');
139
+ if (!fs.existsSync(serverPath)) {
140
+ console.error('āŒ Studio server not found!');
141
+ console.error(' Expected at:', serverPath);
142
+ console.error('\nšŸ’” Run `npm run build` first\n');
143
+ process.exit(1);
144
+ }
145
+ console.log('šŸ“ Starting TORM Studio server...\n');
146
+ // Pass config to server via environment
147
+ const env = {
148
+ ...process.env,
149
+ PORT: port.toString(),
150
+ TOONSTORE_HOST: config.dbCredentials?.host || 'localhost',
151
+ TOONSTORE_PORT: (config.dbCredentials?.port || 6379).toString(),
152
+ TOONSTORE_URL: config.dbCredentials?.url || '',
153
+ TOONSTORE_PASSWORD: config.dbCredentials?.password || '',
154
+ };
155
+ const server = (0, child_process_1.spawn)('node', [serverPath], {
156
+ stdio: 'inherit',
157
+ env,
158
+ });
159
+ server.on('error', (err) => {
160
+ console.error('\nāŒ Error starting TORM Studio:');
161
+ console.error(' ', err.message);
162
+ process.exit(1);
163
+ });
164
+ server.on('close', (code) => {
165
+ if (code !== 0) {
166
+ console.log(`\nāš ļø TORM Studio exited with code ${code}`);
167
+ }
168
+ });
169
+ // Handle Ctrl+C gracefully
170
+ process.on('SIGINT', () => {
171
+ console.log('\n\nšŸ‘‹ Shutting down TORM Studio...');
172
+ server.kill('SIGINT');
173
+ process.exit(0);
174
+ });
175
+ }
176
+ async function generate() {
177
+ console.log('šŸ”§ Generating TypeScript types from schema...\n');
178
+ console.log('āš ļø This feature is coming soon!');
179
+ console.log('šŸ’” For now, define types manually in your code.\n');
180
+ process.exit(0);
181
+ }
182
+ async function migrate() {
183
+ console.log('šŸ”„ Running database migrations...\n');
184
+ console.log('āš ļø This feature is coming soon!');
185
+ console.log('šŸ’” For now, manage schema changes manually.\n');
186
+ process.exit(0);
187
+ }
188
+ // Main CLI logic
189
+ switch (command) {
190
+ case 'studio':
191
+ studio();
192
+ break;
193
+ case 'generate':
194
+ generate();
195
+ break;
196
+ case 'migrate':
197
+ migrate();
198
+ break;
199
+ case 'help':
200
+ case '--help':
201
+ case '-h':
202
+ case undefined:
203
+ printHelp();
204
+ break;
205
+ default:
206
+ console.error(`āŒ Unknown command: ${command}\n`);
207
+ printHelp();
208
+ process.exit(1);
209
+ }
210
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TORM Studio Server (Node.js)
3
+ * Web-based visual database manager for ToonStoreDB
4
+ */
5
+ export interface StudioServerOptions {
6
+ port?: number;
7
+ host?: string;
8
+ redisUrl?: string;
9
+ redisHost?: string;
10
+ redisPort?: number;
11
+ }
12
+ export declare class StudioServer {
13
+ private app;
14
+ private redis;
15
+ private port;
16
+ private host;
17
+ constructor(options?: StudioServerOptions);
18
+ private setupMiddleware;
19
+ private setupRoutes;
20
+ start(): Promise<void>;
21
+ stop(): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=studio-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-server.d.ts","sourceRoot":"","sources":["../src/studio-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;gBAET,OAAO,GAAE,mBAAwB;IAyB7C,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,WAAW;IAgMb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
@@ -0,0 +1,302 @@
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
+ const pattern = `toonstore:${collection}:*`;
219
+ const keys = await this.redis.keys(pattern);
220
+ const documents = [];
221
+ for (const key of keys) {
222
+ const value = await this.redis.get(key);
223
+ if (value) {
224
+ try {
225
+ documents.push(JSON.parse(value));
226
+ }
227
+ catch {
228
+ documents.push({ _raw: value });
229
+ }
230
+ }
231
+ }
232
+ res.json({
233
+ collection,
234
+ count: documents.length,
235
+ documents,
236
+ });
237
+ }
238
+ catch (error) {
239
+ res.status(500).json({ error: error.message });
240
+ }
241
+ });
242
+ // API: Health check
243
+ this.app.get('/api/health', async (req, res) => {
244
+ try {
245
+ await this.redis.ping();
246
+ res.json({
247
+ status: 'ok',
248
+ database: 'connected',
249
+ timestamp: new Date().toISOString(),
250
+ });
251
+ }
252
+ catch (error) {
253
+ res.status(500).json({
254
+ status: 'error',
255
+ error: error.message
256
+ });
257
+ }
258
+ });
259
+ }
260
+ async start() {
261
+ return new Promise(async (resolve, reject) => {
262
+ // Test connection first
263
+ console.log('šŸ”Œ Testing database connection...');
264
+ try {
265
+ await this.redis.ping();
266
+ console.log('āœ… Connected to ToonStoreDB\n');
267
+ }
268
+ catch (error) {
269
+ console.error('āŒ Failed to connect to ToonStoreDB:');
270
+ console.error(' ', error.message);
271
+ console.error('\nšŸ’” Check your torm.config.ts credentials');
272
+ console.error(' or make sure ToonStoreDB is running\n');
273
+ process.exit(1);
274
+ }
275
+ this.app.listen(this.port, '127.0.0.1', () => {
276
+ console.log(`\nšŸŽØ TORM Studio running at:`);
277
+ console.log(` → http://localhost:${this.port}\n`);
278
+ console.log(`šŸ’” Press Ctrl+C to stop\n`);
279
+ resolve();
280
+ });
281
+ });
282
+ }
283
+ async stop() {
284
+ await this.redis.quit();
285
+ }
286
+ }
287
+ exports.StudioServer = StudioServer;
288
+ // CLI usage
289
+ if (require.main === module) {
290
+ const port = process.env.PORT ? parseInt(process.env.PORT) : 4983;
291
+ const server = new StudioServer({ port });
292
+ server.start().catch((err) => {
293
+ console.error('Failed to start studio server:', err);
294
+ process.exit(1);
295
+ });
296
+ process.on('SIGINT', async () => {
297
+ console.log('\n\nšŸ‘‹ Shutting down TORM Studio...');
298
+ await server.stop();
299
+ process.exit(0);
300
+ });
301
+ }
302
+ //# 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.3.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
  }