@onroad/core 4.0.0-alpha.2 → 4.0.0-alpha.21

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.
Files changed (54) hide show
  1. package/README.md +409 -7
  2. package/dist/OnRoadExpress.d.ts.map +1 -1
  3. package/dist/OnRoadExpress.js +19 -6
  4. package/dist/OnRoadExpress.js.map +1 -1
  5. package/dist/container/Container.d.ts +1 -1
  6. package/dist/container/Container.d.ts.map +1 -1
  7. package/dist/container/Container.js +15 -6
  8. package/dist/container/Container.js.map +1 -1
  9. package/dist/core/AbstractController.d.ts +11 -0
  10. package/dist/core/AbstractController.d.ts.map +1 -1
  11. package/dist/core/AbstractController.js +65 -1
  12. package/dist/core/AbstractController.js.map +1 -1
  13. package/dist/core/AbstractService.d.ts +17 -0
  14. package/dist/core/AbstractService.d.ts.map +1 -1
  15. package/dist/core/AbstractService.js +50 -0
  16. package/dist/core/AbstractService.js.map +1 -1
  17. package/dist/core/SequelizeRepository.d.ts +4 -1
  18. package/dist/core/SequelizeRepository.d.ts.map +1 -1
  19. package/dist/core/SequelizeRepository.js +22 -1
  20. package/dist/core/SequelizeRepository.js.map +1 -1
  21. package/dist/core/index.d.ts +1 -1
  22. package/dist/core/index.d.ts.map +1 -1
  23. package/dist/database/ConnectionManager.d.ts +2 -0
  24. package/dist/database/ConnectionManager.d.ts.map +1 -1
  25. package/dist/database/ConnectionManager.js +12 -1
  26. package/dist/database/ConnectionManager.js.map +1 -1
  27. package/dist/dev/DevServer.d.ts +67 -0
  28. package/dist/dev/DevServer.d.ts.map +1 -0
  29. package/dist/dev/DevServer.js +496 -0
  30. package/dist/dev/DevServer.js.map +1 -0
  31. package/dist/dev/MigrationCLI.d.ts +19 -0
  32. package/dist/dev/MigrationCLI.d.ts.map +1 -0
  33. package/dist/dev/MigrationCLI.js +140 -0
  34. package/dist/dev/MigrationCLI.js.map +1 -0
  35. package/dist/dev/index.d.ts +5 -0
  36. package/dist/dev/index.d.ts.map +1 -0
  37. package/dist/dev/index.js +3 -0
  38. package/dist/dev/index.js.map +1 -0
  39. package/dist/entity/EntityRegistry.d.ts +26 -0
  40. package/dist/entity/EntityRegistry.d.ts.map +1 -1
  41. package/dist/entity/EntityRegistry.js +140 -4
  42. package/dist/entity/EntityRegistry.js.map +1 -1
  43. package/dist/entity/decorators.d.ts +1 -0
  44. package/dist/entity/decorators.d.ts.map +1 -1
  45. package/dist/entity/decorators.js.map +1 -1
  46. package/dist/filters/builtins/JwtFilter.d.ts +6 -3
  47. package/dist/filters/builtins/JwtFilter.d.ts.map +1 -1
  48. package/dist/filters/builtins/JwtFilter.js +29 -4
  49. package/dist/filters/builtins/JwtFilter.js.map +1 -1
  50. package/dist/index.d.ts +3 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/package.json +5 -1
@@ -0,0 +1,496 @@
1
+ import { execSync } from "child_process";
2
+ import { existsSync, writeFileSync } from "fs";
3
+ import { resolve } from "path";
4
+ // --- Main Class ---
5
+ export class DevServer {
6
+ app;
7
+ logger;
8
+ databases;
9
+ frontendVars;
10
+ migrationsPath;
11
+ projectRoot;
12
+ autoMigrate;
13
+ composeFile;
14
+ tenants;
15
+ gcpRestore;
16
+ containers = [];
17
+ composeCmd = null;
18
+ constructor(config) {
19
+ this.app = config.app;
20
+ this.logger = config.app.logger;
21
+ this.databases = config.databases ?? [{ engine: "postgres" }];
22
+ this.frontendVars = config.frontendVars ?? {};
23
+ this.migrationsPath = config.migrationsPath;
24
+ this.projectRoot = config.projectRoot ?? process.cwd();
25
+ this.autoMigrate = config.autoMigrate ?? true;
26
+ this.composeFile = config.composeFile ?? "docker-compose.dev.yml";
27
+ this.tenants = config.tenants ?? ["default"];
28
+ this.gcpRestore = config.gcpRestore;
29
+ }
30
+ // --- Public API ---
31
+ async start(buildConfig = {}) {
32
+ this.printBanner();
33
+ // 1. Generate docker-compose if not exists
34
+ this.ensureComposeFile();
35
+ // 2. Start database containers
36
+ await this.startContainers();
37
+ // 3. Wait for database readiness
38
+ await this.waitForDatabases();
39
+ // 3.5 Restore GCP backup if configured
40
+ if (this.gcpRestore) {
41
+ await this.restoreFromGcp();
42
+ }
43
+ // 4. Run migrations (if configured)
44
+ if (this.autoMigrate && this.migrationsPath) {
45
+ await this.runMigrations();
46
+ }
47
+ // 5. Build and start the OnRoadExpress server
48
+ const port = buildConfig.port ?? 3000;
49
+ await this.app.buildServer({
50
+ ...buildConfig,
51
+ port,
52
+ });
53
+ // 6. Log frontend env vars
54
+ this.printFrontendEnvVars(port);
55
+ // 7. Log summary
56
+ this.printSummary(port);
57
+ }
58
+ async stop() {
59
+ this.logger.info("Stopping DevServer...");
60
+ await this.app.shutdown();
61
+ this.stopContainers();
62
+ this.logger.info("DevServer stopped");
63
+ }
64
+ // --- Docker Compose ---
65
+ ensureComposeFile() {
66
+ const composePath = resolve(this.projectRoot, this.composeFile);
67
+ if (existsSync(composePath)) {
68
+ this.logger.debug("Docker Compose file already exists", { path: composePath });
69
+ return;
70
+ }
71
+ const content = this.generateComposeContent();
72
+ writeFileSync(composePath, content, "utf-8");
73
+ this.logger.info("Generated docker-compose.dev.yml", { path: composePath });
74
+ }
75
+ generateComposeContent() {
76
+ const services = [];
77
+ const volumes = [];
78
+ for (const db of this.databases) {
79
+ const defaults = DB_DEFAULTS[db.engine];
80
+ const containerName = db.containerName ?? `typeroad-dev-${db.engine}`;
81
+ const port = db.port ?? defaults.port;
82
+ const user = db.user ?? defaults.user;
83
+ const password = db.password ?? defaults.password;
84
+ const database = db.database ?? defaults.database;
85
+ const image = db.image ?? defaults.image;
86
+ const volumeName = `${containerName}-data`;
87
+ this.containers.push({
88
+ name: containerName,
89
+ port,
90
+ engine: db.engine,
91
+ host: "localhost",
92
+ user,
93
+ password,
94
+ database,
95
+ });
96
+ if (db.engine === "postgres") {
97
+ services.push(` ${containerName}:
98
+ image: ${image}
99
+ container_name: ${containerName}
100
+ restart: unless-stopped
101
+ ports:
102
+ - "${port}:5432"
103
+ environment:
104
+ POSTGRES_USER: ${user}
105
+ POSTGRES_PASSWORD: ${password}
106
+ POSTGRES_DB: ${database}
107
+ volumes:
108
+ - ${volumeName}:/var/lib/postgresql/data
109
+ healthcheck:
110
+ test: ["CMD-SHELL", "pg_isready -U ${user} -d ${database}"]
111
+ interval: 2s
112
+ timeout: 5s
113
+ retries: 15`);
114
+ }
115
+ else if (db.engine === "mysql") {
116
+ services.push(` ${containerName}:
117
+ image: ${image}
118
+ container_name: ${containerName}
119
+ restart: unless-stopped
120
+ ports:
121
+ - "${port}:3306"
122
+ environment:
123
+ MYSQL_ROOT_PASSWORD: ${password}
124
+ MYSQL_USER: ${user}
125
+ MYSQL_PASSWORD: ${password}
126
+ MYSQL_DATABASE: ${database}
127
+ volumes:
128
+ - ${volumeName}:/var/lib/mysql
129
+ healthcheck:
130
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${user}", "-p${password}"]
131
+ interval: 2s
132
+ timeout: 5s
133
+ retries: 15`);
134
+ }
135
+ volumes.push(` ${volumeName}:`);
136
+ }
137
+ return `# Auto-generated by TypeRoad DevServer
138
+ # Do not commit — add to .gitignore
139
+
140
+ services:
141
+ ${services.join("\n\n")}
142
+
143
+ volumes:
144
+ ${volumes.join("\n")}
145
+ `;
146
+ }
147
+ // --- Container Management ---
148
+ getComposeCommand() {
149
+ if (this.composeCmd)
150
+ return this.composeCmd;
151
+ // Try docker compose v2 (plugin) first, then docker-compose v1 (standalone)
152
+ try {
153
+ execSync("docker compose version", { stdio: "pipe" });
154
+ this.composeCmd = "docker compose";
155
+ return this.composeCmd;
156
+ }
157
+ catch {
158
+ // v2 not available
159
+ }
160
+ try {
161
+ execSync("docker-compose --version", { stdio: "pipe" });
162
+ this.composeCmd = "docker-compose";
163
+ return this.composeCmd;
164
+ }
165
+ catch {
166
+ // v1 not available
167
+ }
168
+ throw new Error("[TypeRoad DevServer] Neither 'docker compose' (v2) nor 'docker-compose' (v1) found. Install Docker Desktop or Docker Compose.");
169
+ }
170
+ async startContainers() {
171
+ const composePath = resolve(this.projectRoot, this.composeFile);
172
+ if (!this.isDockerAvailable()) {
173
+ throw new Error("[TypeRoad DevServer] Docker is not available. Install Docker Desktop or Docker Engine to use DevServer.");
174
+ }
175
+ const cmd = this.getComposeCommand();
176
+ this.logger.info(`Starting database containers... (using: ${cmd})`);
177
+ const maxRetries = 3;
178
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
179
+ try {
180
+ execSync(`${cmd} -f "${composePath}" up -d`, {
181
+ cwd: this.projectRoot,
182
+ stdio: "pipe",
183
+ });
184
+ return;
185
+ }
186
+ catch (err) {
187
+ const msg = err instanceof Error ? err.message : String(err);
188
+ // Transient Docker errors (closed pipe, daemon restart) — retry
189
+ if (attempt < maxRetries && (msg.includes("closed pipe") || msg.includes("connection refused"))) {
190
+ this.logger.warn(`Docker transient error (attempt ${attempt}/${maxRetries}), retrying in 3s...`);
191
+ execSync("sleep 3");
192
+ continue;
193
+ }
194
+ throw new Error(`[TypeRoad DevServer] Failed to start containers: ${msg}`);
195
+ }
196
+ }
197
+ }
198
+ stopContainers() {
199
+ const composePath = resolve(this.projectRoot, this.composeFile);
200
+ try {
201
+ const cmd = this.getComposeCommand();
202
+ execSync(`${cmd} -f "${composePath}" down`, {
203
+ cwd: this.projectRoot,
204
+ stdio: "pipe",
205
+ });
206
+ }
207
+ catch {
208
+ this.logger.warn("Failed to stop containers — stop them manually");
209
+ }
210
+ }
211
+ isDockerAvailable() {
212
+ try {
213
+ execSync("docker info", { stdio: "pipe" });
214
+ return true;
215
+ }
216
+ catch {
217
+ return false;
218
+ }
219
+ }
220
+ // --- DB Readiness ---
221
+ async waitForDatabases() {
222
+ // Re-read containers info from compose if not already populated
223
+ if (this.containers.length === 0) {
224
+ this.populateContainersFromConfig();
225
+ }
226
+ for (const container of this.containers) {
227
+ this.logger.info(`Waiting for ${container.engine} (${container.name}) to be ready...`);
228
+ await this.waitForContainer(container);
229
+ this.logger.info(`${container.engine} (${container.name}) is ready`);
230
+ }
231
+ }
232
+ async waitForContainer(container, maxRetries = 30) {
233
+ for (let i = 0; i < maxRetries; i++) {
234
+ try {
235
+ if (container.engine === "postgres") {
236
+ execSync(`docker exec ${container.name} pg_isready -U ${container.user} -d ${container.database}`, { stdio: "pipe" });
237
+ return;
238
+ }
239
+ else if (container.engine === "mysql") {
240
+ execSync(`docker exec ${container.name} mysqladmin ping -h localhost -u ${container.user} -p${container.password}`, { stdio: "pipe" });
241
+ return;
242
+ }
243
+ }
244
+ catch {
245
+ // Not ready yet
246
+ }
247
+ await sleep(1000);
248
+ }
249
+ throw new Error(`[TypeRoad DevServer] Database ${container.name} failed to start within ${maxRetries}s`);
250
+ }
251
+ populateContainersFromConfig() {
252
+ for (const db of this.databases) {
253
+ const defaults = DB_DEFAULTS[db.engine];
254
+ this.containers.push({
255
+ name: db.containerName ?? `typeroad-dev-${db.engine}`,
256
+ port: db.port ?? defaults.port,
257
+ engine: db.engine,
258
+ host: "localhost",
259
+ user: db.user ?? defaults.user,
260
+ password: db.password ?? defaults.password,
261
+ database: db.database ?? defaults.database,
262
+ });
263
+ }
264
+ }
265
+ // --- Migrations ---
266
+ async waitForSequelizeConnection(maxRetries = 15) {
267
+ // Use a raw Sequelize connection to verify readiness
268
+ // without going through getConnection() which triggers runOnConnect migrations
269
+ if (this.containers.length === 0)
270
+ return;
271
+ const container = this.containers[0];
272
+ const { Sequelize } = await import("sequelize");
273
+ for (let i = 0; i < maxRetries; i++) {
274
+ let probe = null;
275
+ try {
276
+ probe = new Sequelize(container.database, container.user, container.password, {
277
+ host: container.host,
278
+ port: container.port,
279
+ dialect: container.engine,
280
+ logging: false,
281
+ });
282
+ await probe.authenticate();
283
+ await probe.close();
284
+ this.logger.info("Database connection verified");
285
+ return;
286
+ }
287
+ catch {
288
+ if (probe)
289
+ try {
290
+ await probe.close();
291
+ }
292
+ catch { /* ignore */ }
293
+ if (i < maxRetries - 1) {
294
+ await sleep(2000);
295
+ }
296
+ }
297
+ }
298
+ this.logger.warn("Could not verify Sequelize connection — proceeding anyway");
299
+ }
300
+ async runMigrations() {
301
+ // Wait for the actual Sequelize connection to be stable
302
+ await this.waitForSequelizeConnection();
303
+ this.logger.info("Running database migrations...");
304
+ const connections = this.app.getConnections();
305
+ for (const conn of connections) {
306
+ if (conn.engine !== "sequelize")
307
+ continue;
308
+ const seqConn = conn;
309
+ for (const tenant of this.tenants) {
310
+ try {
311
+ const runner = await seqConn.getMigrationRunner(tenant);
312
+ const applied = await runner.up();
313
+ if (applied.length > 0) {
314
+ this.logger.info(`Migrations applied for tenant "${tenant}"`, {
315
+ count: applied.length,
316
+ migrations: applied,
317
+ });
318
+ }
319
+ else {
320
+ this.logger.info(`No pending migrations for tenant "${tenant}"`);
321
+ }
322
+ }
323
+ catch (err) {
324
+ this.logger.warn(`Migration failed for tenant "${tenant}" — continuing`, {
325
+ error: err instanceof Error ? err.message : String(err),
326
+ });
327
+ }
328
+ }
329
+ }
330
+ }
331
+ // --- Frontend Env Var Logging ---
332
+ printFrontendEnvVars(port) {
333
+ const baseUrl = `http://localhost:${port}`;
334
+ const vars = {
335
+ REACT_APP_API_URL: baseUrl,
336
+ NEXT_PUBLIC_API_URL: baseUrl,
337
+ VITE_API_URL: baseUrl,
338
+ API_BASE_URL: baseUrl,
339
+ ...this.frontendVars,
340
+ };
341
+ // Add database connection vars
342
+ for (const container of this.containers) {
343
+ const prefix = container.engine.toUpperCase();
344
+ vars[`${prefix}_HOST`] = container.host;
345
+ vars[`${prefix}_PORT`] = String(container.port);
346
+ vars[`${prefix}_USER`] = container.user;
347
+ vars[`${prefix}_PASSWORD`] = container.password;
348
+ vars[`${prefix}_DATABASE`] = container.database;
349
+ if (container.engine === "postgres") {
350
+ vars.DATABASE_URL = `postgresql://${container.user}:${container.password}@${container.host}:${container.port}/${container.database}`;
351
+ }
352
+ else if (container.engine === "mysql") {
353
+ vars.DATABASE_URL = `mysql://${container.user}:${container.password}@${container.host}:${container.port}/${container.database}`;
354
+ }
355
+ }
356
+ console.log("");
357
+ console.log("┌──────────────────────────────────────────────────────────────┐");
358
+ console.log("│ FRONTEND ENVIRONMENT VARIABLES │");
359
+ console.log("├──────────────────────────────────────────────────────────────┤");
360
+ const envFileLines = [];
361
+ for (const [key, value] of Object.entries(vars)) {
362
+ console.log(`│ ${key}=${value}`);
363
+ envFileLines.push(`${key}=${value}`);
364
+ }
365
+ console.log("├──────────────────────────────────────────────────────────────┤");
366
+ console.log("│ Copy the above to your frontend .env file │");
367
+ console.log("└──────────────────────────────────────────────────────────────┘");
368
+ console.log("");
369
+ // Write .env.local for convenience
370
+ const envPath = resolve(this.projectRoot, ".env.dev");
371
+ writeFileSync(envPath, envFileLines.join("\n") + "\n", "utf-8");
372
+ this.logger.info("Environment variables written to .env.dev", { path: envPath });
373
+ }
374
+ // --- Banner & Summary ---
375
+ printBanner() {
376
+ console.log("");
377
+ console.log(" ╔══════════════════════════════════════╗");
378
+ console.log(" ║ TypeRoad DevServer v1.0 ║");
379
+ console.log(" ║ Local Development Environment ║");
380
+ console.log(" ╚══════════════════════════════════════╝");
381
+ console.log("");
382
+ }
383
+ printSummary(port) {
384
+ console.log("");
385
+ console.log("┌──────────────────────────────────────────────────────────────┐");
386
+ console.log("│ SERVER READY │");
387
+ console.log("├──────────────────────────────────────────────────────────────┤");
388
+ console.log(`│ API: http://localhost:${port}`);
389
+ console.log(`│ Health: http://localhost:${port}/health`);
390
+ for (const container of this.containers) {
391
+ console.log(`│ ${container.engine.toUpperCase()}: ${container.host}:${container.port} (${container.name})`);
392
+ }
393
+ if (this.migrationsPath) {
394
+ console.log(`│ Migrations: ${this.migrationsPath}`);
395
+ }
396
+ console.log("├──────────────────────────────────────────────────────────────┤");
397
+ console.log("│ Press Ctrl+C to stop │");
398
+ console.log("└──────────────────────────────────────────────────────────────┘");
399
+ console.log("");
400
+ }
401
+ // --- GCP Backup Restore ---
402
+ async restoreFromGcp() {
403
+ const cfg = this.gcpRestore;
404
+ const container = this.containers[0];
405
+ if (!container || container.engine !== "postgres") {
406
+ this.logger.warn("GCP restore only supports PostgreSQL containers — skipping");
407
+ return;
408
+ }
409
+ // Check if local DB already has data (skip restore if so)
410
+ if (await this.localDbHasData(container)) {
411
+ this.logger.info("Local database already has data — skipping GCP restore. Delete the Docker volume to force a fresh restore.");
412
+ return;
413
+ }
414
+ this.logger.info("Restoring latest backup from GCP Cloud SQL...");
415
+ // Verify gcloud is available and authenticated
416
+ try {
417
+ execSync("gcloud auth print-access-token", { stdio: "pipe" });
418
+ }
419
+ catch {
420
+ this.logger.warn("gcloud not authenticated — skipping GCP restore. Run: gcloud auth application-default login");
421
+ return;
422
+ }
423
+ const sqlUser = cfg.sqlUser ?? "postgres";
424
+ const dumpFile = resolve(this.projectRoot, ".dev-dump.sql");
425
+ const bucket = cfg.gcsBucket;
426
+ const gcsUri = bucket ? `gs://${bucket}/dev-dump-${Date.now()}.sql` : null;
427
+ try {
428
+ if (gcsUri) {
429
+ // Method 1: gcloud sql export → GCS → download → pg_restore
430
+ this.logger.info(`Exporting ${cfg.sourceDatabase} from Cloud SQL to ${gcsUri}...`);
431
+ execSync(`gcloud sql export sql ${cfg.instance.split(":").pop()} ${gcsUri} --database=${cfg.sourceDatabase} --quiet`, { stdio: "pipe", timeout: 300_000 });
432
+ this.logger.info("Downloading dump from GCS...");
433
+ execSync(`gsutil cp ${gcsUri} ${dumpFile}`, { stdio: "pipe", timeout: 120_000 });
434
+ // Cleanup GCS
435
+ try {
436
+ execSync(`gsutil rm ${gcsUri}`, { stdio: "pipe" });
437
+ }
438
+ catch { /* ignore */ }
439
+ }
440
+ else {
441
+ // Method 2: cloud-sql-proxy + pg_dump (requires proxy running)
442
+ this.logger.info(`Dumping ${cfg.sourceDatabase} via cloud-sql-proxy...`);
443
+ // Try connecting via proxy on port 5432 or use instance connection
444
+ const proxyPort = 5432;
445
+ execSync(`pg_dump "host=localhost port=${proxyPort} user=${sqlUser} dbname=${cfg.sourceDatabase}" --no-owner --no-acl --format=plain > ${dumpFile}`, { stdio: "pipe", shell: "/bin/sh", timeout: 300_000 });
446
+ }
447
+ // Restore into local container
448
+ this.logger.info("Restoring dump into local database...");
449
+ execSync(`docker exec -i ${container.name} psql -U ${container.user} -d ${container.database} < ${dumpFile}`, { stdio: "pipe", shell: "/bin/sh", timeout: 300_000 });
450
+ this.logger.info("GCP backup restored successfully");
451
+ }
452
+ catch (err) {
453
+ const msg = err instanceof Error ? err.message : String(err);
454
+ this.logger.warn(`GCP restore failed — continuing without data: ${msg}`);
455
+ }
456
+ finally {
457
+ // Cleanup local dump file
458
+ try {
459
+ const { unlinkSync } = await import("fs");
460
+ unlinkSync(dumpFile);
461
+ }
462
+ catch { /* ignore */ }
463
+ }
464
+ }
465
+ async localDbHasData(container) {
466
+ try {
467
+ const result = execSync(`docker exec ${container.name} psql -U ${container.user} -d ${container.database} -t -c "SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public'"`, { stdio: "pipe" }).toString().trim();
468
+ return parseInt(result, 10) > 0;
469
+ }
470
+ catch {
471
+ return false;
472
+ }
473
+ }
474
+ }
475
+ // --- Defaults ---
476
+ const DB_DEFAULTS = {
477
+ postgres: {
478
+ port: 5432,
479
+ user: "typeroad",
480
+ password: "typeroad_dev",
481
+ database: "typeroad_dev",
482
+ image: "postgres:16-alpine",
483
+ },
484
+ mysql: {
485
+ port: 3306,
486
+ user: "typeroad",
487
+ password: "typeroad_dev",
488
+ database: "typeroad_dev",
489
+ image: "mysql:8.0",
490
+ },
491
+ };
492
+ // --- Helpers ---
493
+ function sleep(ms) {
494
+ return new Promise((resolve) => setTimeout(resolve, ms));
495
+ }
496
+ //# sourceMappingURL=DevServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/dev/DevServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { SequelizeConnectionManager } from "../database/SequelizeConnectionManager.js";
2
+ export interface MigrationCLIConfig {
3
+ migrationsPath: string;
4
+ connection: SequelizeConnectionManager;
5
+ tenant?: string;
6
+ }
7
+ export declare class MigrationCLI {
8
+ private readonly migrationsPath;
9
+ private readonly connection;
10
+ private readonly tenant;
11
+ constructor(config: MigrationCLIConfig);
12
+ run(args?: string[]): Promise<void>;
13
+ create(name: string): void;
14
+ up(steps?: number): Promise<void>;
15
+ down(steps?: number): Promise<void>;
16
+ status(): Promise<void>;
17
+ private getRunner;
18
+ }
19
+ //# sourceMappingURL=MigrationCLI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrationCLI.d.ts","sourceRoot":"","sources":["../../src/dev/MigrationCLI.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAA;AAI3F,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,0BAA0B,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,MAAM,EAAE,kBAAkB;IAMhC,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAuChE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgBpB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,IAAI,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YA8Bf,SAAS;CAGxB"}