@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,275 @@
1
+ "use strict";
2
+ /**
3
+ * TORM Migration System
4
+ * Handles data-shape migrations for schemaless 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.MigrationRunner = void 0;
44
+ const ioredis_1 = __importDefault(require("ioredis"));
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ class MigrationRunner {
48
+ constructor(redisOptions, migrationsDir) {
49
+ this.migrationKey = 'toonstore:_migrations';
50
+ if (redisOptions.url) {
51
+ this.redis = new ioredis_1.default(redisOptions.url);
52
+ }
53
+ else {
54
+ this.redis = new ioredis_1.default({
55
+ host: redisOptions.host || 'localhost',
56
+ port: redisOptions.port || 6379,
57
+ });
58
+ }
59
+ this.migrationsDir = migrationsDir || path.join(process.cwd(), 'migrations');
60
+ }
61
+ /**
62
+ * Get list of applied migrations from database
63
+ */
64
+ async getAppliedMigrations() {
65
+ const data = await this.redis.get(this.migrationKey);
66
+ return data ? JSON.parse(data) : [];
67
+ }
68
+ /**
69
+ * Save applied migrations to database
70
+ */
71
+ async saveAppliedMigrations(migrations) {
72
+ await this.redis.set(this.migrationKey, JSON.stringify(migrations));
73
+ }
74
+ /**
75
+ * Get list of migration files from directory
76
+ */
77
+ getMigrationFiles() {
78
+ if (!fs.existsSync(this.migrationsDir)) {
79
+ return [];
80
+ }
81
+ return fs
82
+ .readdirSync(this.migrationsDir)
83
+ .filter(file => file.endsWith('.js') || file.endsWith('.ts'))
84
+ .sort();
85
+ }
86
+ /**
87
+ * Load a migration module
88
+ */
89
+ async loadMigration(filename) {
90
+ const filePath = path.join(this.migrationsDir, filename);
91
+ const module = require(filePath);
92
+ const migration = module.default || module;
93
+ if (!migration.up || !migration.down) {
94
+ throw new Error(`Migration ${filename} must export up() and down() functions`);
95
+ }
96
+ const timestamp = filename.split('_')[0];
97
+ const name = filename.replace(/\.(js|ts)$/, '');
98
+ return {
99
+ name,
100
+ timestamp,
101
+ up: migration.up,
102
+ down: migration.down,
103
+ };
104
+ }
105
+ /**
106
+ * Get pending migrations that haven't been applied yet
107
+ */
108
+ async getPendingMigrations() {
109
+ const applied = await this.getAppliedMigrations();
110
+ const files = this.getMigrationFiles();
111
+ const pending = [];
112
+ for (const file of files) {
113
+ const migration = await this.loadMigration(file);
114
+ if (!applied.includes(migration.name)) {
115
+ pending.push(migration);
116
+ }
117
+ }
118
+ return pending;
119
+ }
120
+ /**
121
+ * Run pending migrations
122
+ */
123
+ async up(count) {
124
+ const pending = await this.getPendingMigrations();
125
+ if (pending.length === 0) {
126
+ console.log('✅ No pending migrations');
127
+ return;
128
+ }
129
+ const toRun = count ? pending.slice(0, count) : pending;
130
+ const applied = await this.getAppliedMigrations();
131
+ console.log(`\n📦 Running ${toRun.length} migration(s)...\n`);
132
+ for (const migration of toRun) {
133
+ try {
134
+ console.log(`⏳ Running: ${migration.name}`);
135
+ await migration.up(this.redis);
136
+ applied.push(migration.name);
137
+ await this.saveAppliedMigrations(applied);
138
+ console.log(`✅ Applied: ${migration.name}\n`);
139
+ }
140
+ catch (error) {
141
+ console.error(`❌ Failed: ${migration.name}`);
142
+ console.error(` ${error.message}\n`);
143
+ throw error;
144
+ }
145
+ }
146
+ console.log(`✅ All migrations applied successfully!\n`);
147
+ }
148
+ /**
149
+ * Rollback last migration
150
+ */
151
+ async down(count = 1) {
152
+ const applied = await this.getAppliedMigrations();
153
+ if (applied.length === 0) {
154
+ console.log('⚠️ No migrations to rollback');
155
+ return;
156
+ }
157
+ const toRollback = applied.slice(-count);
158
+ console.log(`\n📦 Rolling back ${toRollback.length} migration(s)...\n`);
159
+ for (let i = toRollback.length - 1; i >= 0; i--) {
160
+ const name = toRollback[i];
161
+ const filename = this.getMigrationFiles().find(f => f.includes(name));
162
+ if (!filename) {
163
+ console.error(`❌ Migration file not found: ${name}`);
164
+ continue;
165
+ }
166
+ try {
167
+ const migration = await this.loadMigration(filename);
168
+ console.log(`⏳ Rolling back: ${migration.name}`);
169
+ await migration.down(this.redis);
170
+ const index = applied.indexOf(name);
171
+ applied.splice(index, 1);
172
+ await this.saveAppliedMigrations(applied);
173
+ console.log(`✅ Rolled back: ${migration.name}\n`);
174
+ }
175
+ catch (error) {
176
+ console.error(`❌ Failed to rollback: ${name}`);
177
+ console.error(` ${error.message}\n`);
178
+ throw error;
179
+ }
180
+ }
181
+ console.log(`✅ Rollback completed!\n`);
182
+ }
183
+ /**
184
+ * Show migration status
185
+ */
186
+ async status() {
187
+ const applied = await this.getAppliedMigrations();
188
+ const files = this.getMigrationFiles();
189
+ console.log('\n📋 Migration Status:\n');
190
+ if (files.length === 0) {
191
+ console.log(' No migration files found\n');
192
+ return;
193
+ }
194
+ for (const file of files) {
195
+ const migration = await this.loadMigration(file);
196
+ const isApplied = applied.includes(migration.name);
197
+ const status = isApplied ? '✅' : '⏸️ ';
198
+ const label = isApplied ? 'Applied' : 'Pending';
199
+ console.log(` ${status} ${migration.name} - ${label}`);
200
+ }
201
+ console.log();
202
+ }
203
+ /**
204
+ * Create a new migration file
205
+ */
206
+ async create(name) {
207
+ if (!fs.existsSync(this.migrationsDir)) {
208
+ fs.mkdirSync(this.migrationsDir, { recursive: true });
209
+ }
210
+ const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];
211
+ const filename = `${timestamp}_${name}.ts`;
212
+ const filepath = path.join(this.migrationsDir, filename);
213
+ const template = `/**
214
+ * Migration: ${name}
215
+ * Created: ${new Date().toISOString()}
216
+ */
217
+
218
+ import { Redis } from 'ioredis';
219
+
220
+ export default {
221
+ async up(client: Redis) {
222
+ // TODO: Implement forward migration
223
+ // Example: Add a field to all documents
224
+ /*
225
+ const pattern = 'toonstore:User:*';
226
+ const keys = await client.keys(pattern);
227
+
228
+ for (const key of keys) {
229
+ const data = JSON.parse(await client.get(key) || '{}');
230
+
231
+ // Add new field with default value
232
+ data.newField = data.newField ?? 'default';
233
+
234
+ await client.set(key, JSON.stringify(data));
235
+ }
236
+
237
+ console.log(\`Updated \${keys.length} documents\`);
238
+ */
239
+ },
240
+
241
+ async down(client: Redis) {
242
+ // TODO: Implement rollback migration
243
+ // Example: Remove the field
244
+ /*
245
+ const pattern = 'toonstore:User:*';
246
+ const keys = await client.keys(pattern);
247
+
248
+ for (const key of keys) {
249
+ const data = JSON.parse(await client.get(key) || '{}');
250
+
251
+ // Remove the field
252
+ delete data.newField;
253
+
254
+ await client.set(key, JSON.stringify(data));
255
+ }
256
+
257
+ console.log(\`Rolled back \${keys.length} documents\`);
258
+ */
259
+ },
260
+ };
261
+ `;
262
+ fs.writeFileSync(filepath, template);
263
+ console.log(`\n✅ Created migration: ${filename}`);
264
+ console.log(` Location: ${filepath}\n`);
265
+ console.log(`📝 Edit the migration file and implement up() and down()\n`);
266
+ }
267
+ /**
268
+ * Close Redis connection
269
+ */
270
+ async close() {
271
+ await this.redis.quit();
272
+ }
273
+ }
274
+ exports.MigrationRunner = MigrationRunner;
275
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
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
+ private inferType;
21
+ start(): Promise<void>;
22
+ stop(): Promise<void>;
23
+ }
24
+ //# 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;IA+enB,OAAO,CAAC,SAAS;IAyBX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}